【问题标题】:Scipy b spline basis functionsScipy b 样条基函数
【发布时间】:2021-02-22 18:48:44
【问题描述】:

在 Scipy 中是否有更有效的方法来生成类似于 b-spline 函数示例中给出的递归代码的 b-spline 基函数:

scipy.interpolate.BSpline

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

我尝试使用scipy.interpolate.BSpline.basis_element,但无法生成与函数“B”相同的结果。

【问题讨论】:

    标签: python scipy bspline


    【解决方案1】:

    我之前的做法是这样的:

    import scipy.interpolate as si
    import numpy as np
    import matplotlib.pyplot as plt
    
    nt = 3 # the number of knots
    x = np.linspace(0,24,10)
    y = np.ones((x.shape)) # the function we wish to interpolate (very trivial in this case)
    t = np.linspace(x[0],x[-1],nt)
    t = t[1:-1]
    
    tt = np.linspace(0.0, 24, 100)
    y_rep = si.splrep(x, y, t=t, k=2)
    
    y_i = si.splev(tt, y_rep)
    
    spl = np.zeros((100,))
    
    plt.figure()
    for i in range(nt+1):
        vec = np.zeros(nt+1)
        vec[i] = 1.0
        y_list = list(y_rep)
        y_list[1] = vec.tolist()
        y_i = si.splev(tt, y_list) # your basis spline function
        spl = spl + y_i*y_rep[1][i] # the interpolated function
        plt.plot(tt, y_i)
    

    你可以看看scipy.interpolate.splrepscipy.interpolate.splev这两个函数。他们分别进行 B 样条表示并评估 B 样条。上面的代码生成(在这种情况下)四个基本样条函数:

    我希望这是你想要的。

    【讨论】:

      猜你喜欢
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 2012-11-03
      • 2017-06-20
      • 2018-12-14
      • 1970-01-01
      相关资源
      最近更新 更多