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 權重陣列,長度與 x 和 y 相同。權重用於計算加權最小平方法樣條擬合。如果 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 尋找t
和c
。如果
task==1
,則針對平滑因子 s 的另一個值尋找t
和c
。對於同一組資料,之前必須有使用task=0
或task=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))
內找到,其中m
是 x、y 和 w 中的資料點數量。預設值:如果提供權重,則為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
個係數會被評估常式splev
和BSpline
忽略。)這與splprep
相反,後者不會對係數進行零填充。預設邊界條件為 ‘not-a-knot’,即曲線末端的第一個和第二個線段是相同的多項式。
CubicSpline
中提供了更多邊界條件。參考文獻
[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()