scipy的splrep函数行为解析

3
我有一组数据点,希望用样条函数来近似它们。我使用了两种不同的函数:
  1. scipy中的splrep函数
  2. 我在这里找到的一个三次样条函数。
结果看起来像这样。 代码如下:
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个回答

3
您需要明确定义“满意”的含义。显然,您的三次样条曲线没有通过点,而结果则是(在这个意义上)完全令人满意的。请注意,您的“cubicspline”实际上只是一个单一的多项式,而不是具有断点的样条曲线(这些都是带有断点的多项式)。
您需要明确告诉样条曲线不需要通过这些点 —— 传递一个非零的s平滑参数。如何正确选择这个参数,请参见这个问题: scipy.interpolate.UnivariateSpline not smoothing regardless of parameters

你说得对。满意的是样条曲线没有“显著”振荡。我不确定平滑参数的含义(我想我必须做数学计算)。但是,这次效果更好了。http://postimage.org/image/cb8crl2l7/。感谢您的建议。 - Tengis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接