我有一个模型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
?或者有一种更简单的方法吗?
答案 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
来证明这一点。