我如何在所有数据点上放置导数零的约束以进行样条插值?

问题描述 投票:2回答:1

scipy中是否有用于样条插值的方法,可以在每个数据点上使用导数约束?我找到了一个“ scipy.interpolate.PiecewisePolynomial”,但不推荐使用PiecewisePolynomial类。

python python-3.x numpy scipy spline
1个回答
0
投票

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()
© www.soinside.com 2019 - 2024. All rights reserved.