我正试图使用SciPy的三次样条线函数绘制一条拱形的三次样条线,但在某一点上在两个控制点之间创建了一个不符合逻辑的形状.黑色的线是函数正在计算的值,绿色的线是我预期的结果(就像它在点4和点8之间所做的那样)

这就是我创建映像的方式(您可以判断代码并运行它here)

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()

enter image description here

你知道我怎么才能解决这个问题吗?或者是什么导致了这一切?我是否缺少任何类型的选项/配置参数?

推荐答案

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

没有办法用立方样条线来"修复"这个问题.你可以做的就是阐明你的要求,并 Select 一个合适的插值法. 如果您可以放弃C2要求,并且可以使用C1插值法,则可以使用PChip或Akina1D,如备注中所建议的. 如果你想要平滑而不是内插,有make_smoothing_spline个(正如 comments 中也建议的那样).

Python相关问答推荐

matplotlib散点图与NaNs和cmap colored颜色 矩阵

提交按钮未过帐

查找一个数据帧中另一个数据帧的值的索引

如何在pandas DataFrame列中保持一个只增加的数字序列?

导入pythoncom如何找到正确的文件?

如何验证像这样添加的对象属性:MyObj.newattribute=123

在Numpy数组中的列子集上聚合

对每列给定行进行块切片

棋类游戏的极大极小函数

如何让Seborn Barploy条形图的 colored颜色 在变大/变小时变深?

自动提交如何处理多个查询?

如何在不引发异常的情况下将来自服务总线触发的Python Azure函数的消息添加回队列?

访问列表中对象中的Python对象的属性

Matplotlib中的PLOTY色彩映射

作为时间函数的绘图数组

累加器没有累加

有没有办法使用PyQt从.cur文件中获取热点信息?

将XGBoost赋形值转换为`SHAP`';S解释对象

如何确保将一个文件中的信息复制到多个文本文档中,而不需要特定的行

在PyGame中使用Custom属性更新矩形时遇到问题