CubicSpline#
- class scipy.interpolate.CubicSpline(x, y, axis=0, bc_type='not-a-knot', extrapolate=None)[原始碼]#
三次樣條資料內插器。
使用分段三次多項式內插資料,該多項式是兩次連續可微分的 [1]。結果表示為
PPoly
實例,其斷點與給定的資料相符。- 參數:
- xarray_like,形狀 (n,)
包含自變數值的一維陣列。值必須為實數、有限且嚴格遞增的順序。
- yarray_like
包含應變數值的陣列。它可以具有任意數量的維度,但沿
axis
(見下文)的長度必須與x
的長度相符。值必須是有限的。- axisint,可選
假設 y 沿其變化的軸。表示對於
x[i]
,對應的值為np.take(y, i, axis=axis)
。預設值為 0。- bc_type字串或 2 元組,可選
邊界條件類型。需要由邊界條件給出的兩個額外方程式,以確定每個分段上多項式的所有係數 [2]。
如果 bc_type 是字串,則指定的條件將應用於樣條線的兩端。可用的條件為
‘not-a-knot’ (預設):曲線端的第一個和第二個分段是相同的多項式。當沒有關於邊界條件的資訊時,這是一個很好的預設值。
‘periodic’:內插函數假定為週期性的,週期為
x[-1] - x[0]
。y 的第一個和最後一個值必須相同:y[0] == y[-1]
。此邊界條件將導致y'[0] == y'[-1]
和y''[0] == y''[-1]
。‘clamped’:曲線端的導數為零。假設一維 y,
bc_type=((1, 0.0), (1, 0.0))
是相同的條件。‘natural’:曲線端的二階導數為零。假設一維 y,
bc_type=((2, 0.0), (2, 0.0))
是相同的條件。
如果 bc_type 是 2 元組,則第一個和第二個值將分別應用於曲線的起點和終點。元組值可以是先前提及的字串之一(除了 ‘periodic’)或元組
(order, deriv_values)
,允許指定曲線端點的任意導數order:導數階數,1 或 2。
deriv_value:array_like,包含導數值,形狀必須與 y 相同,排除
axis
維度。例如,如果 y 是一維的,則 deriv_value 必須是純量。如果 y 是三維的,形狀為 (n0, n1, n2) 且 axis=2,則 deriv_value 必須是二維的,形狀為 (n0, n1)。
- extrapolate{bool, ‘periodic’, None},可選
如果為 bool,則決定是否基於第一個和最後一個區間外插到超出範圍的點,或返回 NaN。如果為 ‘periodic’,則使用週期性外插。如果為 None (預設),則對於
bc_type='periodic'
,extrapolate
設定為 ‘periodic’,否則設定為 True。
另請參閱
Akima1DInterpolator
Akima 1D 內插器。
PchipInterpolator
PCHIP 1-D 單調三次內插器。
PPoly
係數和斷點表示的分段多項式。
註解
參數 bc_type 和
extrapolate
獨立工作,即前者僅控制樣條線的建構,後者僅控制評估。當邊界條件為 ‘not-a-knot’ 且 n = 2 時,它會被替換為一階導數等於線性內插斜率的條件。當兩個邊界條件都是 ‘not-a-knot’ 且 n = 3 時,解會以通過給定點的拋物線形式尋找。
當 ‘not-a-knot’ 邊界條件應用於兩端時,產生的樣條線將與
splrep
(帶有s=0
) 和InterpolatedUnivariateSpline
返回的樣條線相同,但這兩種方法使用 B 樣條基底的表示。在版本 0.18.0 中新增。
參考文獻
[2]Carl de Boor,“A Practical Guide to Splines”,Springer-Verlag,1978。
範例
在此範例中,三次樣條用於內插採樣的正弦波。您可以看到樣條線連續性屬性適用於一階和二階導數,但僅違反三階導數。
>>> import numpy as np >>> from scipy.interpolate import CubicSpline >>> import matplotlib.pyplot as plt >>> x = np.arange(10) >>> y = np.sin(x) >>> cs = CubicSpline(x, y) >>> xs = np.arange(-0.5, 9.6, 0.1) >>> fig, ax = plt.subplots(figsize=(6.5, 4)) >>> ax.plot(x, y, 'o', label='data') >>> ax.plot(xs, np.sin(xs), label='true') >>> ax.plot(xs, cs(xs), label="S") >>> ax.plot(xs, cs(xs, 1), label="S'") >>> ax.plot(xs, cs(xs, 2), label="S''") >>> ax.plot(xs, cs(xs, 3), label="S'''") >>> ax.set_xlim(-0.5, 9.5) >>> ax.legend(loc='lower left', ncol=2) >>> plt.show()
在第二個範例中,單位圓使用樣條線進行內插。使用了週期性邊界條件。您可以看到週期點 (1, 0) 的一階導數值 ds/dx=0、ds/dy=1 已正確計算。請注意,圓無法精確地用三次樣條表示。為了提高精度,需要更多斷點。
>>> theta = 2 * np.pi * np.linspace(0, 1, 5) >>> y = np.c_[np.cos(theta), np.sin(theta)] >>> cs = CubicSpline(theta, y, bc_type='periodic') >>> print("ds/dx={:.1f} ds/dy={:.1f}".format(cs(0, 1)[0], cs(0, 1)[1])) ds/dx=0.0 ds/dy=1.0 >>> xs = 2 * np.pi * np.linspace(0, 1, 100) >>> fig, ax = plt.subplots(figsize=(6.5, 4)) >>> ax.plot(y[:, 0], y[:, 1], 'o', label='data') >>> ax.plot(np.cos(xs), np.sin(xs), label='true') >>> ax.plot(cs(xs)[:, 0], cs(xs)[:, 1], label='spline') >>> ax.axes.set_aspect('equal') >>> ax.legend(loc='center') >>> plt.show()
第三個範例是區間 0 <= x<= 1 上多項式 y = x**3 的內插。三次樣條可以精確地表示此函數。為了實現這一點,我們需要在區間端點指定值和一階導數。請注意,y' = 3 * x**2,因此 y'(0) = 0 且 y'(1) = 3。
>>> cs = CubicSpline([0, 1], [0, 1], bc_type=((1, 0), (1, 3))) >>> x = np.linspace(0, 1) >>> np.allclose(x**3, cs(x)) True
- 屬性:
- xndarray,形狀 (n,)
斷點。與傳遞給建構函式的
x
相同。- cndarray,形狀 (4, n-1, …)
每個分段上多項式的係數。尾隨維度與 y 的維度相符,排除
axis
。例如,如果 y 是一維的,則c[k, i]
是分段x[i]
和x[i+1]
之間(x-x[i])**(3-k)
的係數。- axisint
內插軸。與傳遞給建構函式的軸相同。
方法
__call__
(x[, nu, extrapolate])評估分段多項式或其導數。
derivative
([nu])建構一個新的分段多項式,表示導數。
antiderivative
([nu])建構一個新的分段多項式,表示反導數。
integrate
(a, b[, extrapolate])計算分段多項式上的定積分。
roots
([discontinuity, extrapolate])尋找分段多項式的實根。