使用三次样条插值时,确保第一个和第二个微分是连续的

时间:2013-04-10 14:05:11

标签: python scipy interpolation

我正在读这个paper。在第286页的这篇论文中,他们说他们使用三次样条插值来确保连续的一阶微分和二阶微分的存在。

我目前正在尝试在python中执行此操作。从这句话我推断他们想要确保彼此相邻的样条的一阶和二阶导数是相同的。我现在的问题是,我怎么能用scipy做到这一点?我发现了这个:http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.splev.html

存在参数der(要计算的样条的导数的阶数)。这是2的参数吗?


* 关于此问题的后续问题,他们稍后会使用一阶差分点。我可以假设这些只是每个样条曲线的一阶导数吗?怎么可能得到这些?

1 个答案:

答案 0 :(得分:3)

scipy.interpolate计算的样式为k的样条线具有连续的1 ... k-1:衍生物。对于您的情况,订单k=3将具有连续的一阶和二阶导数。您可以通过样条的数值微分来检查这是否属实:

import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y = np.sin(x)
spl = interpolate.splrep(x, y, k=3)
xx = np.linspace(0, 10, 100000)
yy = interpolate.splev(xx, spl)
d1 = np.diff(yy) / np.diff(xx)
d2 = np.diff(d1) / np.diff(xx[1:])
d3 = np.diff(d2) / np.diff(xx[1:-1])
plt.subplot(311)
plt.plot(xx[1:], d1)
plt.title('first derivative')
plt.subplot(312)
plt.plot(xx[1:-1], d2)
plt.title('second derivative')
plt.subplot(313)
plt.plot(xx[2:-1], d3)
plt.title('third derivative')
plt.show()

第三个衍生物是第一个显示不连续性的衍生物。

确实可以通过splev(..., der=2)直接进行二阶导数。

(如果没有阅读论文,我就不能对你的第二个问题发表评论。)