Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 插值三次样条数值导数的不连续性_Python_Numpy_Spline_Derivative - Fatal编程技术网

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

Python 插值三次样条数值导数的不连续性,python,numpy,spline,derivative,Python,Numpy,Spline,Derivative,我试图从两个列表x和y计算并绘制数值导数(dy/dx)。我用和来计算斜率。y与x的曲线图似乎是C1连续的,我希望在与x的曲线图上,dy/dx的斜率也是平滑的。但是,是什么导致了这里的情节有点起伏呢?还有关于如何按摩代码使其连续的建议吗 import numpy as np from matplotlib import pyplot as plt from scipy.interpolate import UnivariateSpline x=[20.14141131550861, 20.2916

我试图从两个列表x和y计算并绘制数值导数(dy/dx)。我用和来计算斜率。y与x的曲线图似乎是C1连续的,我希望在与x的曲线图上,dy/dx的斜率也是平滑的。但是,是什么导致了这里的情节有点起伏呢?还有关于如何按摩代码使其连续的建议吗

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

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

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

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

固定样条曲线的最简单方法是允许进行一点点平滑:

spl1 = UnivariateSpline(x, y, s=1e-5)
使衍生工具符合您的期望:

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

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

中间一定有一些非线性点。