當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy interpolate.BSpline用法及代碼示例


本文簡要介紹 python 語言中 scipy.interpolate.BSpline 的用法。

用法:

class  scipy.interpolate.BSpline(t, c, k, extrapolate=True, axis=0)#

B-spline 基礎上的單變量樣條。

其中\(B_{j, k; t}\) 是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].

參考

[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()
scipy-interpolate-BSpline-1.png

屬性

t ndarray

結矢量

c ndarray

樣條係數

k int

樣條度

extrapolate bool

如果為 True,則外推在基本區間上活動的 b-spline 函數的第一個和最後一個多項式片段。

axis int

插值軸。

tck 元組

等效於(self.t, self.c, self.k)(隻讀)。

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.interpolate.BSpline。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。