scipy中是否有用于样条插值的方法,可以在每个数据点上使用导数约束?我找到了一个“ scipy.interpolate.PiecewisePolynomial”,但不推荐使用PiecewisePolynomial类。
BPoly
中的scipy.interpolate
类具有构造方法
基于伯恩斯坦的分段多项式,与指定的值和断点处的导数兼容。
如scipy
参考中所述,here。
Python3
的基本用法可以如下:
from numpy import linspace, sin, pi
from scipy.interpolate import BPoly, CubicSpline
xi = linspace(0, pi, 5)
xnew = linspace(0, pi, 50)
yi = sin(xi)
ynew = sin(xnew)
yder = [[yi[i], 0] for i in range(len(yi))]
cubic = CubicSpline(xi, yi)
bpoly = BPoly.from_derivatives(xi, yder)
y_bpoly = bpoly(xnew)
y_cubic = cubic(xnew)
此程序为类参的前半个周期创建两个样条插值,一个使用CubicSpline
类,一个使用from_derivatives
类的BPoly
方法,将导数设置为0
在原始曲线的每个点。
与该方法有关的主要问题是,除非您在每个点上都指定导数,否则该算法不能保证平滑过渡。但是,可以保证在指定的点上得到导数。不过,这应该不会出现问题,因为您要查找的是在每个点上将导数设置为0
。
使用以下内容,您可以正确地看到不同的结果,如this image:
import matplotlib.pyplot as plt
plt.figure()
plt.plot(xnew, y_bpoly, '-g', xnew, ynew, '--c', xnew, y_cubic, '-.m', xi, yi, '*r')
plt.legend(['BPoly', 'True', 'Cubic', 'Points'])
plt.title('Spline interpolation')
plt.grid()
plt.show()