scipy splrep 的行为

2024-03-10

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

  1. splrep来自 scipy
  2. 和我发现的三次样条函数here http://en.literateprograms.org/Cubic_spline_%28Python%29.

结果看起来像this http://postimage.org/image/9wvq9gzdz/.

代码如下:

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?


您需要定义“满意”的含义。显然,您的三次样条没有通过这些点进行插值,而splrep结果确实如此(并且从这个意义上说是完全令人满意的)。另请注意,您的“三次样条”实际上只是一个多项式而不是样条(它们是带有断点的多项式)。

你需要明确告诉splrep样条曲线不需要经过这些点 --- 传递一个非零值s平滑参数。如何正确选择这个,请看这个问题:scipy.interpolate.UnivariateSpline 不平滑,无论参数如何 https://stackoverflow.com/questions/8719754/scipy-interpolate-univariatespline-not-smoothing-regardless-of-parameters?rq=1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scipy splrep 的行为 的相关文章

随机推荐