scipy的splrep的行为

时间:2012-11-21 09:20:48

标签: python scipy splines

我有一组数据点,想用样条函数逼近它们。 我使用了两个不同的功能:

    来自scipy的
  1. splrep
  2. 和我发现的三次样条函数here
  3. 结果看起来像this

    代码如下:

    from matplotlib.pyplot import *
    from numpy import *
    from scipy import interpolate
    #----------------------------------------------
    s = arange(257)/256.0
    z = s[::-1]
    b = transpose(array((z*z*z,
                     3*z*z*s, 
                     3*z*s*s,
                     s*s*s)))
    def cubicspline(c,t): 
    return dot(b[t],c)
    #----------------------------------------------
    
    A = array([
       [ -126.041   ,  246.867004],
       [ -113.745003,   92.083   ],
       [  208.518997, -183.796997],
       [  278.859009, -190.552994]])
    
    a1 = A[:,0]
    a2 = A[:,1] 
    cs = reshape(A, (-1, 4, 2))
    X = []
    Y = []
    #spline with cubicspline()
    for (x,y) in [cubicspline(c,16*t) for c in cs for t in arange(17)]:
    X.append(x)
    Y.append(y)
    
    # spline with splrep
    tck = interpolate.splrep( a1, a2)
    
    xnew = np.arange( min(a1), max(a1), 5)
    ynew = interpolate.splev(xnew, tck)
    plot(a1, a2, "--ob", ms = 9,  label = "points")
    plot(X, Y, "r", lw=2, label = "cubicspline")
    plot(xnew, ynew, "g", lw=2, label = "splrep")
    legend(); savefig("image.png"); show()
    

    正如您所看到的, splrep 的结果远非令人满意。 有人可以解释这种行为以及如何从 splrep 获得合理的近似值吗?

1 个答案:

答案 0 :(得分:3)

你需要通过“满足”来定义你的意思。显然,你的三次样条不是通过点插值,而splrep结果确实(并且在这种意义上完全令人满意)。另请注意,'cubicspline'实际上只是一个多项式而不是样条(它是带断点的多项式)。

您需要明确告诉splrep样条曲线不需要经过这些点 - 传入非零s平滑参数。如何正确选择,请看这个问题: scipy.interpolate.UnivariateSpline not smoothing regardless of parameters