【发布时间】:2015-04-25 20:16:03
【问题描述】:
我正在尝试使用欧拉方法求解一个常微分方程组,但是当我尝试打印速度时,我得到了
RuntimeWarning: overflow encountered in double_scalars
我得到的是nan(不是数字),而不是打印数字。我认为问题可能出在定义加速度时,但我不确定,如果有人能帮助我,我将不胜感激。
from numpy import *
from math import pi,exp
d=0.0005*10**-6
a=[]
while d<1.0*10**-6 :
d=d*2
a.append(d)
D=array(a)
def a_particula (D,x, v, t):
cc=((1.00+((2.00*lam)/D))*(1.257+(0.400*exp((-1.10*D)/(2.00*lam)))))
return (g-((densaire*g)/densparticula)-((mu*18.0*v)/(cc*densparticula* (D**2.00))))
def euler (acel,D, x, v, tv, n=15):
nv, xv, vv = tv.size, zeros_like(tv), zeros_like(tv)
xv[0], vv[0] = x, v
for k in range(1, nv):
t, Dt = tv[k-1], (tv[k]-tv[k-1])/float(n)
for i in range(n):
a = acel(D,x, v, t)
t, v = t+Dt, v+a*Dt
x = x+v*Dt
xv[k], vv[k] = x, v
return (xv, vv)
g=(9.80)
densaire= 1.225
lam=0.70*10**-6
densparticula=1000.00
mu=(1.785*10**-5)
tv = linspace(0, 5, 50)
x, v = 0, 0 #initial conditions
for j in range(len(D)):
xx, vv = euler(a_particula, D[j], x, v, tv)
print(D[j],xx,vv)
【问题讨论】:
-
请注意,您使用的是辛欧拉,尽管它是一个非保守系统。用
t,x,v = t+Dt, x+v*Dt, v+a*Dt替换欧拉步骤以实现正确的数值方法。再次检查方程的物理特性,其他力项应以重力项为主。第二个(浮力?)更小,第三个(摩擦力)更大,导致速度演化中的正反馈(带有负因素,因此振荡)。如果找不到错误,请说明用于推导力项的物理定律。 -
或者使用与 Lipschitz 常数(倒数)相称的时间步长。这意味着
Dt=1e-8或更小。tv=linspace(0,5e-4,50)和n=1000有效。使用刚性系统的方法(梯形方法,其他隐式方法)能够使用更大的时间步长。
标签: python numpy floating-point differential-equations