python - 三次插值样条数值导数的不连续性

标签 python numpy spline derivative

我正在尝试计算并绘制两个列表 x 和 y 的数值导数 (dy/dx)。我正在使用 scipy.interpolate.UnivariateSplinescipy.interpolate.UnivariateSpline.derivative 来计算斜率。 y 与 x 的图似乎是 C1 连续的,我预计当针对 x 绘制时,斜率 dy/dx 也很平滑。但到底是什么导致了情节的小颠簸呢?还有关于如何修改代码以使其 C1 连续的任何建议吗?

import numpy as np
from matplotlib import pyplot as plt
from scipy.interpolate import UnivariateSpline
x=[20.14141131550861, 20.29161104293003, 20.458574567775457, 20.653802880772922, 20.910446090013004, 21.404599384233677, 21.427939384233678, 21.451279384233676, 21.474619384233677, 21.497959384233678, 21.52129938423368, 21.52130038423368, 21.54463938423368, 21.56797938423368, 21.59131938423368, 21.61465938423368, 21.63799938423368, 22.132152678454354, 22.388795887694435, 22.5840242006919]
y=[-1.6629252348586834, -1.7625046339166028, -1.875358801338162, -2.01040013818419, -2.193327440415778, -2.5538174545988306, -2.571799827167608, -2.5896274995868005, -2.607298426787476, -2.624811539182082, -2.642165776735291, -2.642165776735291, -2.659360089028171, -2.6763934353217587, -2.693264784620056, -2.7099731157324367, -2.7265165368570314, -3.0965791078676754, -3.290845721407758, -3.440799238587583]
spl1 = UnivariateSpline(x,y,s=0)
dydx = spl1.derivative(n=1)
T = dydx(x)
plt.plot(x,y,'-x')
plt.plot(x,T,'-')
plt.show()

enter image description here

最佳答案

给定的数据点看起来像是定义了一条很好的 C1 平滑曲线,但事实并非如此。绘制斜率(y 的差值除以 x 的差值)显示:

plt.plot(np.diff(y)/np.diff(x))

slopes

数组中存在一些重复的 y 值,看起来它们不属于该数组,还有一些接近重复(但不重复)的 x 值。

修复样条线的最简单方法是允许一点点平滑:

spl1 = UnivariateSpline(x, y, s=1e-5)

使导数符合您的预期:

smoothed

除去“坏苹果”也有帮助,尽管没有那么大。

spl1 = UnivariateSpline(x[:10] + x[11:], y[:10] + y[11:], s=0)

关于python - 三次插值样条数值导数的不连续性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46533815/

相关文章:

3d - 根据与另一点的距离在贝塞尔曲线上查找点

python - OpenCV 校准相机裁剪错误

python - CPython 交互式 readline — 更好的向后删除单词

python - Numpy 数组 - 多维逻辑比较

python - numpy 获取索引数组的数组数组中的值

java - 在 Java 中求样条函数的导数

python - Try语句没有捕获复制错误python

python - Python:While循环中导入函数的奇怪问题

python-具有阶跃响应的卷积

python - 将曲线样条拟合到 3D 点云