与离散数据

时间:2018-04-03 16:56:31

标签: python matplotlib interpolation

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

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

所以这里的x值是整数,但是如果我们想在x = 67.875之类的东西找到相切呢?

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

这就是我得到的:enter image description here

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

1 个答案:

答案 0 :(得分:4)

this answer中有评论,告诉您splrepsplprep之间存在差异。对于你在这里的1D案例,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()

enter image description here

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

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

enter image description here

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

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

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