scipy.interpolate.

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’:曲線端的導數為零。假設一維 ybc_type=((1, 0.0), (1, 0.0)) 是相同的條件。

  • ‘natural’:曲線端的二階導數為零。假設一維 ybc_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_typeextrapolate 獨立工作,即前者僅控制樣條線的建構,後者僅控制評估。

當邊界條件為 ‘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()
../../_images/scipy-interpolate-CubicSpline-1_00_00.png

在第二個範例中,單位圓使用樣條線進行內插。使用了週期性邊界條件。您可以看到週期點 (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()
../../_images/scipy-interpolate-CubicSpline-1_01_00.png

第三個範例是區間 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])

尋找分段多項式的實根。