Python在SHM中找到恢复平衡的时间

时间:2014-09-02 20:02:44

标签: python numpy matplotlib

我有一个模型y来模拟单摆谐振动(SHM)的运动。我希望能够找到时间t,其中钟摆在移位后返回其静止位置(y=d)。

import matplotlib.pyplot as plt
import numpy as np

A = 10                      # amplitude
w = 3                       # frequency
t = np.linspace(0,100,100)  # time (arb. units)
b = -0.5                    # phase
c = 0.1                     # decay rate
d = 20                      # equilibrium

y = A * np.sin(w*t+b) * np.exp(-c*t) + d

plt.figure()
plt.plot(t,y,'-')

plt.show()

如何找到y数组中有多个连续y=d值的位置,并确定第一个t出现的相应y=d?或者有一种更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

y永远不会返回完全 d,而是以越来越小的数量在它周围振荡。例如,您可以通过绘制y[50:]来查看此内容。您可以使t越来越长并仍然看到相同的行为,直到浮点数学错误开始并将值四舍五入到d。这是因为exp趋于0,但实际上并未达到0。

在物理系统中,静摩擦力以足够小的速度启动并使事情停止,但这并未在y的等式中建模。

根据您的目的,它可能足以询问"何时y小于d"的距离。假设您有一个小数字delta = d*0.001。通过计算,您可以看到y距离delta小于d的位置:

dist = np.abs(y-d)

由于您知道y单调地靠近d,您可以从数组的末尾回到开头,找到它第一次超出目标距离的时间:

close = np.flipud(dist) < delta # flipud time reverses dist, close is True where we are close to d
idx = np.where(close == False)[0][0] # find index of first time we were not close
tValue = np.flipud(t)[idx] # find corresponding value of t

这里有一个很大的假设,t足够长,允许振荡衰减到delta以下d。另请注意,您无法从头到尾搜索y接近d,因为您可能会再次振荡。您可以通过将t = np.linspace(0, 100, 1000)设置为更密集的样本y来证明这一点。