当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。