當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy interpolate.make_interp_spline用法及代碼示例


本文簡要介紹 python 語言中 scipy.interpolate.make_interp_spline 的用法。

用法:

scipy.interpolate.make_interp_spline(x, y, k=3, t=None, bc_type=None, axis=0, check_finite=True)#

計算插值 B-spline 的(係數)。

參數

x 數組, 形狀 (n,)

橫坐標。

y 數組,形狀(n,...)

縱坐標。

k 整數,可選

B-spline學位。默認為立方體,k = 3

t 數組,形狀(nt + k + 1,),可選。

結。結的數量需要與數據點的數量和邊導數的數量一致。具體來說, nt - n 必須等於 len(deriv_l) + len(deriv_r)

bc_type 2 元組或無

邊界條件。默認為 None,這意味著自動選擇邊界條件。否則,它必須是 length-two 元組,其中第一個元素 ( deriv_l ) 在 x[0] 設置邊界條件,第二個元素 ( deriv_r ) 在 x[-1] 設置邊界條件。其中每個都必須是可迭代的對 (order, value),它給出插值間隔給定邊處指定階導數的值。或者,可以識別以下字符串別名:

  • "clamped":末端的一階導數為零。這是

    相當於 bc_type=([(1, 0.0)], [(1, 0.0)])

  • "natural":末端的二階導數為零。這相當於 bc_type=([(2, 0.0)], [(2, 0.0)])

  • "not-a-knot"(默認):第一段和第二段是相同的多項式。這相當於擁有 bc_type=None

  • "periodic" :值和末尾的第一個 k-1 導數是等價的。

axis 整數,可選

插值軸。默認值為 0。

check_finite 布爾型,可選

是否檢查輸入數組是否僅包含有限數。禁用可能會提高性能,但如果輸入確實包含無窮大或 NaN,則可能會導致問題(崩潰、非終止)。默認為真。

返回

b 度數為 k 並帶有結 t 的 BSpline 對象。

例子

在 Chebyshev 節點上使用三次插值:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> def cheb_nodes(N):
...     jj = 2.*np.arange(N) + 1
...     x = np.cos(np.pi * jj / 2 / N)[::-1]
...     return x
>>> x = cheb_nodes(20)
>>> y = np.sqrt(1 - x**2)
>>> from scipy.interpolate import BSpline, make_interp_spline
>>> b = make_interp_spline(x, y)
>>> np.allclose(b(x), y)
True

請注意,默認為具有 not-a-knot 邊界條件的三次樣條

>>> b.k
3

在這裏,我們使用 ‘natural’ 樣條曲線,邊處的二階導數為零:

>>> l, r = [(2, 0.0)], [(2, 0.0)]
>>> b_n = make_interp_spline(x, y, bc_type=(l, r))  # or, bc_type="natural"
>>> np.allclose(b_n(x), y)
True
>>> x0, x1 = x[0], x[-1]
>>> np.allclose([b_n(x0, 2), b_n(x1, 2)], [0, 0])
True

還支持參數曲線的插值。例如,我們計算極坐標中蝸牛曲線的離散化

>>> phi = np.linspace(0, 2.*np.pi, 40)
>>> r = 0.3 + np.cos(phi)
>>> x, y = r*np.cos(phi), r*np.sin(phi)  # convert to Cartesian coordinates

構建插值曲線,通過角度對其進行參數化

>>> spl = make_interp_spline(phi, np.c_[x, y])

在更精細的網格上評估插值(請注意,我們轉置結果以將其解包為一對 x- 和 y-arrays)

>>> phi_new = np.linspace(0, 2.*np.pi, 100)
>>> x_new, y_new = spl(phi_new).T

繪製結果

>>> plt.plot(x, y, 'o')
>>> plt.plot(x_new, y_new, '-')
>>> plt.show()
scipy-interpolate-make_interp_spline-1_00_00.png

用 2 維 y 構建 B-spline 曲線

>>> x = np.linspace(0, 2*np.pi, 10)
>>> y = np.array([np.sin(x), np.cos(x)])

滿足周期性條件,因為兩端點的 y 坐標相等

>>> ax = plt.axes(projection='3d')
>>> xx = np.linspace(0, 2*np.pi, 100)
>>> bspl = make_interp_spline(x, y, k=5, bc_type='periodic', axis=1)
>>> ax.plot3D(xx, *bspl(xx))
>>> ax.scatter3D(x, *y, color='red')
>>> plt.show()
scipy-interpolate-make_interp_spline-1_01_00.png

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.interpolate.make_interp_spline。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。