为什么三次样条创建不符合逻辑的形状?

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

我正在尝试使用 SciPy 的三次样条函数绘制一个类似拱形的三次样条曲线,但在某些时候正在两个控制点之间创建一个非逻辑形状。黑色线是函数正在评估的线,绿色线是我期望发生的线(就像第 4 点和第 8 点之间的情况一样)

这就是我创建图像的方式(您可以检查代码并运行它这里

from scipy.interpolate import CubicSpline
import numpy as np
import matplotlib.pyplot as plt
x = [-0.0243890844, -0.0188174509, -0.00021640210000000056, 0.0202699043, 0.0239562802] # X values of the coordinates for points 2, 4, 8, 13 and 15
y = [-0.0117638968, 0.00469300617, 0.0177650191, 0.00215831073, -0.0154924048] # Y values of the coordinates for points 2, 4, 8, 13 and 15
cs = CubicSpline(x, y)
dsX = np.linspace(x[0], x[len(x)-1], num=1000)
plt.plot(dsX, cs(dsX), 'k')
plt.plot(x, y, 'mo')
plt.show()

你知道我该如何解决这个问题吗?或者是什么原因造成的?我是否缺少任何类型的选项/配置参数?

python scipy curve spline
1个回答
0
投票

由于匹配二阶导数的限制,三次样条很容易出现这样的超调。因此,数据的微小变化可能会导致曲线本身发生较大的变化,包括您在这里看到的情况。

无法使用 CubicSpline 来“修复”此问题。您可以做的是澄清您的要求并选择合适的插值器。 如果您可以放弃 C2 要求并且 C1 插值可以,则可以使用 pchip 或 Akina1D,如评论中建议的那样。 如果您想要平滑而不是插值,可以使用

make_smoothing_spline
(正如评论中所建议的那样)。

© www.soinside.com 2019 - 2024. All rights reserved.