我用四阶龙格-库塔法求解带有numpy阵列的duffing振子的微分方程,但我收到了一个错误。
RuntimeWarning: overflow encountered in double_scalars
是否有人知道可能导致溢出错误的错误源以及我可以尝试解决它的方法?
t = np.linspace(0,1,steps)
# start at t=0
h = t[1] - t[0]
xn = np.zeros(steps)
xn[0] = 1
vn = np.zeros(steps)
vn[0] = 1
for n in range(1,steps):
k1 = vn[n-1]
l1 = g * np.cos(w * t[n-1]) - d * vn[n-1] - a * xn[n-1] - b * xn[n-1]**3
k2 = vn[n-1] + h*k1/2
l2 = g * np.cos(w * (t[n-1] + h/2)) - d * (vn[n-1] + h*k1/2) - a * (xn[n-1] + h*l1/2) - b * (xn[n-1] + h*l1/2)**3
k3 = vn[n-1] + h*k2/2
l3 = g * np.cos(w * (t[n-1] + h/2)) - d * (vn[n-1] + h*k2/2) - a * (xn[n-1] + h*l2/2) - b * (xn[n-1] + h*l2/2)**3
k4 = vn[n-1]*k3
l4 = g * np.cos(w * (t[n-1] + h)) - d * (vn[n-1] + h*k3) - a * (xn[n-1] + h*l3) - b * (xn[n-1] + h*l3)**3
vn[n] = vn[n-1] + h/6 * (k1 + 2* k2 + 2 * k3+ k4)
xn[n] = xn[n-1] + h/6 * (l1 + 2* l2 + 2* l3 + l4)
这是我的代码供参考,如果有人需要它。vn表示v泳u numerical到维基百科的链接,以供公式参考:https://en.wikipedia.org/wiki/runge%e2%80%93kutta_methods 我认为理解这个公式不是很重要,我可以尝试解决这个问题的一些可能的解决方案会很有帮助。
1条答案
按热度按时间bjp0bcyl1#
这个
k
是否有更新x
,的l
的更新v
,作为v=dx/dt
. 你要把常微分方程变成两个半耦合的一阶方程组。还要注意中的打字错误或删除错误
k4
.