我正在读这篇文章paper 。在第 286 页的这篇论文中,他们说他们使用三次样条插值来确保连续一阶微分和二阶微分的存在。
我目前正在尝试在 python 中执行此操作。从这句话我推断他们想要确保彼此相邻的样条线的一阶和二阶导数是相同的。我现在的问题是,我该如何使用 scipy 做到这一点?我发现了这个:http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.splev.html
其中有一个参数der
(要计算的样条曲线的导数阶数)。那么这个参数是2吗?
*关于此的后续问题,他们稍后会使用一阶微分点。我可以假设这些只是每个样条线的一阶导数吗?怎么可能得到这些?
最佳答案
由 scipy.interpolate
计算出的 k
阶样条曲线具有连续的 1 ... k-1
:th 导数。对于您的情况,订单 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)
完成。
(在没有阅读论文的情况下,我无法评论你的第二个问题。)
关于python - 使用三次样条插值时确保一阶微分和二阶微分连续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15928129/