本文簡要介紹 python 語言中 scipy.interpolate.BSpline
的用法。
用法:
class scipy.interpolate.BSpline(t, c, k, extrapolate=True, axis=0)#
B-spline 基礎上的單變量樣條。
其中
是B-spline 度的基函數k和結t.- t: ndarray, 形狀 (n+k+1,)
結
- c: ndarray,形狀(> = n,...)
樣條係數
- k: int
B-spline度
- extrapolate: bool 或 ‘periodic’,可選
是推斷超出基本區間
t[k] .. t[n]
還是返回 nans。如果為 True,則外推在基本區間上活動的 b-spline 函數的第一個和最後一個多項式片段。如果‘periodic’,使用周期性外推。默認為真。- axis: 整數,可選
插值軸。默認為零。
參數 ::
注意:
B-spline 基本元素通過以下方式定義
實施細節
至少
k+1
度樣條曲線需要係數k, 以便n >= k+1
.附加係數,c[j]
和j > n
, 被忽略。B-spline度的基本元素k形成統一的分區基本區間,
t[k] <= x <= t[n]
.
參考:
[1]Tom Lyche 和 Knut Morken,樣條方法,http://www.uio.no/studier/emner/matnat/ifi/INF-MAT5340/v05/undervisningsmateriale/
[2]Carl de Boor,樣條曲線實用指南,Springer,2001。
例子:
將 B-splines 的遞歸定義翻譯成 Python 代碼,我們有:
>>> def B(x, k, i, t): ... if k == 0: ... return 1.0 if t[i] <= x < t[i+1] else 0.0 ... if t[i+k] == t[i]: ... c1 = 0.0 ... else: ... c1 = (x - t[i])/(t[i+k] - t[i]) * B(x, k-1, i, t) ... if t[i+k+1] == t[i+1]: ... c2 = 0.0 ... else: ... c2 = (t[i+k+1] - x)/(t[i+k+1] - t[i+1]) * B(x, k-1, i+1, t) ... return c1 + c2
>>> def bspline(x, t, c, k): ... n = len(t) - k - 1 ... assert (n >= k+1) and (len(c) >= n) ... return sum(c[i] * B(x, k, i, t) for i in range(n))
請注意,這是評估B-splines 的一種低效(如果直接)的方法——這個樣條線類以等效但更有效的方式執行它。
在這裏,我們在基區間
2 <= x <= 4
上構造一個二次樣條函數,並與評估樣條的樸素方法進行比較:>>> from scipy.interpolate import BSpline >>> k = 2 >>> t = [0, 1, 2, 3, 4, 5, 6] >>> c = [-1, 2, 0, -1] >>> spl = BSpline(t, c, k) >>> spl(2.5) array(1.375) >>> bspline(2.5, t, c, k) 1.375
請注意,基準區間之外的結果有所不同。這是因為
BSpline
推斷出在基本區間上活動的 B-spline 函數的第一個和最後一個多項式。>>> import matplotlib.pyplot as plt >>> import numpy as np >>> fig, ax = plt.subplots() >>> xx = np.linspace(1.5, 4.5, 50) >>> ax.plot(xx, [bspline(x, t, c ,k) for x in xx], 'r-', lw=3, label='naive') >>> ax.plot(xx, spl(xx), 'b-', lw=4, alpha=0.7, label='BSpline') >>> ax.grid(True) >>> ax.legend(loc='best') >>> plt.show()
- t: ndarray
結矢量
- c: ndarray
樣條係數
- k: int
樣條度
- extrapolate: bool
如果為 True,則外推在基本區間上活動的 b-spline 函數的第一個和最後一個多項式片段。
- axis: int
插值軸。
tck
元組等效於
(self.t, self.c, self.k)
(隻讀)。
屬性 ::
相關用法
- Python SciPy interpolate.BPoly用法及代碼示例
- Python SciPy interpolate.BarycentricInterpolator用法及代碼示例
- Python SciPy interpolate.make_interp_spline用法及代碼示例
- Python SciPy interpolate.krogh_interpolate用法及代碼示例
- Python SciPy interpolate.InterpolatedUnivariateSpline用法及代碼示例
- Python SciPy interpolate.LSQSphereBivariateSpline用法及代碼示例
- Python SciPy interpolate.griddata用法及代碼示例
- Python SciPy interpolate.splder用法及代碼示例
- Python SciPy interpolate.LinearNDInterpolator用法及代碼示例
- Python SciPy interpolate.PPoly用法及代碼示例
- Python SciPy interpolate.NdBSpline用法及代碼示例
- Python SciPy interpolate.pade用法及代碼示例
- Python SciPy interpolate.barycentric_interpolate用法及代碼示例
- Python SciPy interpolate.RegularGridInterpolator用法及代碼示例
- Python SciPy interpolate.NdPPoly用法及代碼示例
- Python SciPy interpolate.interp2d用法及代碼示例
- Python SciPy interpolate.approximate_taylor_polynomial用法及代碼示例
- Python SciPy interpolate.RectSphereBivariateSpline用法及代碼示例
- Python SciPy interpolate.sproot用法及代碼示例
- Python SciPy interpolate.splantider用法及代碼示例
- Python SciPy interpolate.CloughTocher2DInterpolator用法及代碼示例
- Python SciPy interpolate.interp1d用法及代碼示例
- Python SciPy interpolate.splrep用法及代碼示例
- Python SciPy interpolate.make_smoothing_spline用法及代碼示例
- Python SciPy interpolate.Rbf用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.interpolate.BSpline。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。