scipy.interpolate.

splrep#

scipy.interpolate.splrep(x, y, w=None, xb=None, xe=None, k=3, task=0, s=None, t=None, full_output=0, per=0, quiet=1)[source]#

尋找一維曲線的 B 樣條表示。

舊版

此函數被視為舊版,將不再接收更新。雖然我們目前沒有移除它的計畫,但我們建議新程式碼改用更現代的替代方案。具體來說,我們建議在新程式碼中使用 make_splrep

給定資料點集 (x[i], y[i]),在區間 xb <= x <= xe 上確定 degree k 的平滑樣條近似。

參數:
x, yarray_like

定義曲線 y = f(x) 的資料點。

warray_like, optional

嚴格正值的 rank-1 權重陣列,長度與 xy 相同。權重用於計算加權最小平方法樣條擬合。如果 y 值中的誤差具有由向量 d 給定的標準差,則 w 應為 1/d。預設值為 ones(len(x))

xb, xefloat, optional

要擬合的區間。如果為 None,則預設值分別為 x[0]x[-1]

kint, optional

樣條擬合的 degree。建議使用三次樣條。應避免使用 k 的偶數值,尤其是在 s 值較小時。1 <= k <= 5

task{1, 0, -1}, optional

如果 task==0,則針對給定的平滑因子 s 尋找 tc

如果 task==1,則針對平滑因子 s 的另一個值尋找 tc。對於同一組資料,之前必須有使用 task=0task=1 的呼叫(t 將被儲存並在內部使用)

如果 task=-1,則針對給定的一組節點 t 尋找加權最小平方樣條。這些應該是內部節點,因為端點上的節點將自動新增。

sfloat, optional

平滑條件。平滑量取決於滿足以下條件:sum((w * (y - g))**2,axis=0) <= s,其中 g(x)(x,y) 的平滑插值。使用者可以使用 s 來控制擬合的緊密度和平滑度之間的權衡。較大的 s 表示更平滑,而較小的 s 值表示較不平滑。建議的 s 值取決於權重 w。如果權重表示 y 的標準差的倒數,則良好的 s 值應在範圍 (m-sqrt(2*m),m+sqrt(2*m)) 內找到,其中 mxyw 中的資料點數量。預設值:如果提供權重,則為 s=m-sqrt(2*m)。如果未提供權重,則 s = 0.0 (插值)。

tarray_like, optional

用於 task=-1 所需的節點。如果給定,則 task 會自動設定為 -1

full_outputbool, optional

如果非零,則傳回選用輸出。

perbool, optional

如果非零,則資料點被視為週期性的,週期為 x[m-1] - x[0],並傳回平滑週期性樣條近似。不使用 y[m-1]w[m-1] 的值。預設值為零,對應於邊界條件 ‘not-a-knot’。

quietbool, optional

非零值可抑制訊息。

傳回:
tcktuple

包含節點向量、B 樣條係數和樣條 degree 的 tuple (t,c,k)

fparray, optional

樣條近似的加權平方殘差總和。

ierint, optional

關於 splrep 成功的整數旗標。如果 ier<=0,則表示成功。如果 ier in [1,2,3],則發生錯誤,但未引發。否則會引發錯誤。

msgstr, optional

對應於整數旗標 ier 的訊息。

說明

有關樣條及其導數的評估,請參閱 splev。使用 FITPACK 中的 FORTRAN 常式 curfit

使用者有責任確保 x 的值是唯一的。否則,splrep 將不會傳回合理的結果。

如果提供,節點 t 必須滿足 Schoenberg-Whitney 條件,即必須存在資料點 x[j] 的子集,使得 t[j] < x[j] < t[j+k+1],對於 j=0, 1,...,n-k-2

此常式會將係數陣列 c 零填充,使其與節點陣列 t 具有相同的長度(尾部的 k + 1 個係數會被評估常式 splevBSpline 忽略。)這與 splprep 相反,後者不會對係數進行零填充。

預設邊界條件為 ‘not-a-knot’,即曲線末端的第一個和第二個線段是相同的多項式。CubicSpline 中提供了更多邊界條件。

參考文獻

基於 [1][2][3][4] 中描述的演算法

[1]

P. Dierckx, “使用樣條函數對實驗數據進行平滑、微分和積分的演算法”,J.Comp.Appl.Maths 1 (1975) 165-184。

[2]

P. Dierckx, “使用樣條函數在矩形網格上平滑數據的快速演算法”,SIAM J.Numer.Anal. 19 (1982) 1286-1304。

[3]

P. Dierckx, “使用樣條函數進行曲線擬合的改進演算法”,report tw54, Dept. Computer Science,K.U. Leuven, 1981。

[4]

P. Dierckx, “使用樣條進行曲線和曲面擬合”,Monographs on Numerical Analysis, Oxford University Press, 1993。

範例

您可以使用 B 樣條曲線來內插一維點。更多範例請參閱 在教學文件中

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> from scipy.interpolate import splev, splrep
>>> x = np.linspace(0, 10, 10)
>>> y = np.sin(x)
>>> spl = splrep(x, y)
>>> x2 = np.linspace(0, 10, 200)
>>> y2 = splev(x2, spl)
>>> plt.plot(x, y, 'o', x2, y2)
>>> plt.show()
../../_images/scipy-interpolate-splrep-1.png