OverflowError: (34, 'Result too large') on the resolution of a differential equation with Euler method
OverflowError: (34, 'Result too large') on the resolution of a differential equation with Euler method
我正在尝试求解物理问题的微分方程:高尔夫球下落。
我使用的是欧拉解析法,我有这样的代码:
def F(Z, t):
res = [Z[1], (-K/m)*Z[1]*sqrt((Z[1]**2) + (Z[1]**2)), Z[3], (-K/m)*Z[3]*sqrt((Z[3]**2) + (Z[3]**2))]
return res
def reso_z_euler(liste_t, F, CI, K):
n = len(liste_t)
Z = CI
pas = (liste_t[-1] - liste_t[0])/(n-1)
listeZ = [Z]
for i in range(1, n):
Z = F(Z, temps[i-1])
listeZ.append(Z)
return listeZ
listeZ = reso_z_euler(temps, F, Z0, K)
当我运行这段代码时,终端抛出一个错误:OverflowError: (34, 'Result too large')
我从来没有见过这个错误,我不知道该怎么办..
你的帮助会很好..
谢谢
您使用的时间未知或非本地数组,temps
而不是 liste_t
你没有实现欧拉方法Z = Z + pas*F(Z,liste_t[i-1])
,你必须使用某种机制来实现向量运算,例如
Z = [ zk+pas*fk for zk, fk in zip(Z, F(Z,liste_t[i-1])) ]
您忘记在导数计算中包括重力。
一般来说,Euler 方法只适合学习数值 ODE 积分的原理,对于任何有用的结果,请使用高阶方法。
我正在尝试求解物理问题的微分方程:高尔夫球下落。 我使用的是欧拉解析法,我有这样的代码:
def F(Z, t):
res = [Z[1], (-K/m)*Z[1]*sqrt((Z[1]**2) + (Z[1]**2)), Z[3], (-K/m)*Z[3]*sqrt((Z[3]**2) + (Z[3]**2))]
return res
def reso_z_euler(liste_t, F, CI, K):
n = len(liste_t)
Z = CI
pas = (liste_t[-1] - liste_t[0])/(n-1)
listeZ = [Z]
for i in range(1, n):
Z = F(Z, temps[i-1])
listeZ.append(Z)
return listeZ
listeZ = reso_z_euler(temps, F, Z0, K)
当我运行这段代码时,终端抛出一个错误:OverflowError: (34, 'Result too large') 我从来没有见过这个错误,我不知道该怎么办.. 你的帮助会很好.. 谢谢
您使用的时间未知或非本地数组,
temps
而不是liste_t
你没有实现欧拉方法
Z = Z + pas*F(Z,liste_t[i-1])
,你必须使用某种机制来实现向量运算,例如Z = [ zk+pas*fk for zk, fk in zip(Z, F(Z,liste_t[i-1])) ]
您忘记在导数计算中包括重力。
一般来说,Euler 方法只适合学习数值 ODE 积分的原理,对于任何有用的结果,请使用高阶方法。