繁体   English   中英

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

[英]Tangent to curve interpolated from discrete data

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

x = np.linespace(-100,100,100001)
y = sin(x)

所以这里的x值是整数,但是如果我们想在x = 67.875处找到切线x = 67.875怎么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()

此答案中有一条评论,告诉您splrepsplprep之间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()

在此处输入图片说明

尽管这是使上面的代码可运行的方式,但是它没有提供切线。 对于切线,您只需要在单个点上导数。 但是,您需要在某处具有切线方程并实际使用它。 所以这是一个数学问题。

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

在此处输入图片说明

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

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

结果将在视觉上与上述结果相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM