从离散数据插值的曲线的切线

Rak*_*sha 1 python interpolation matplotlib

我想知道是否有办法从离散数据中找到曲线的切线。例如:

x = np.linespace(-100,100,100001)
y = sin(x)
Run Code Online (Sandbox Code Playgroud)

所以这里的 x 值是整数,但是如果我们想在类似的地方找到切线x = 67.875怎么办?

我一直试图弄清楚是否numpy.interp会起作用,但到目前为止没有运气。我还发现了几个类似的例子,比如这个,但还没有能够将这些技术应用于我的案例:(我是 Python 的新手,还不完全知道一切是如何工作的,所以任何帮助都会值得赞赏...

这就是我得到的: 在此处输入图片说明

from scipy import interpolate
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-100,100,10000)
y = np.sin(x)
tck, u = interpolate.splprep([y])

ti = np.linspace(-100,100,10000)
dydx = interpolate.splev(ti,tck,der=1)

plt.plot(x,y)
plt.plot(ti,dydx[0])
plt.show()
Run Code Online (Sandbox Code Playgroud)

Imp*_*est 6

此答案中有一条评论,它告诉您splrep和之间存在差异splprep。对于您这里的一维情况,splrep完全足够。

您可能还想限制曲线 a 但能够看到振荡。

from scipy import interpolate
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-15,15,1000)
y = np.sin(x)
tck = interpolate.splrep(x,y)

dydx = interpolate.splev(x,tck,der=1)

plt.plot(x,y)
plt.plot(x,dydx, label="derivative")

plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

虽然这是使上面的代码可运行的方式,但它不提供切线。对于切线,您只需要一个点的导数。但是,您需要在某处获得切线方程并实际使用它;所以这更像是一道数学题。

from scipy import interpolate
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-15,15,1000)
y = np.sin(x)
tck = interpolate.splrep(x,y)

x0 = 7.3
y0 = interpolate.splev(x0,tck)
dydx = interpolate.splev(x0,tck,der=1)

tngnt = lambda x: dydx*x + (y0-dydx*x0)

plt.plot(x,y)
plt.plot(x0,y0, "or")
plt.plot(x,tngnt(x), label="tangent")

plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

应该注意的是,如果您拥有的点足够密集,则根本不需要使用样条。在这种情况下,获得导数只是取最近点之间的差异。

from scipy import interpolate
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-15,15,1000)
y = np.sin(x)

x0 = 7.3
i0 = np.argmin(np.abs(x-x0))
x1 = x[i0:i0+2]
y1 = y[i0:i0+2]
dydx, = np.diff(y1)/np.diff(x1)

tngnt = lambda x: dydx*x + (y1[0]-dydx*x1[0])

plt.plot(x,y)
plt.plot(x1[0],y1[0], "or")
plt.plot(x,tngnt(x), label="tangent")

plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

结果在视觉上与上面的相同。