Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Euler';s法_Python_Numpy_Floating Point_Differential Equations - Fatal编程技术网

Python 使用Euler';s法

Python 使用Euler';s法,python,numpy,floating-point,differential-equations,Python,Numpy,Floating Point,Differential Equations,我试图用欧拉方法解一个常微分方程组,但当我试图打印速度时,我得到 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

我试图用欧拉方法解一个常微分方程组,但当我试图打印速度时,我得到

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)
从numpy导入*
从数学导入pi,exp
d=0.0005*10**-6
a=[]

虽然d在将来,如果您在问题中包含完整的警告信息,这将很有帮助-它将包含出现问题的行:

tmp/untitled.py:15: RuntimeWarning: overflow encountered in double_scalars
  return (g-((densaire*g)/densparticula)-((mu*18.0*v)/(cc*densparticula*  (D**2.00))))
当变量的大小超过可以表示的最大值时发生。在这种情况下,
double_scalars
指的是64位浮点,其最大值为:

print(np.finfo(float).max)
# 1.79769313486e+308
因此表达式中有一个标量值:

(g-((densaire*g)/densparticula)-((mu*18.0*v)/(cc*densparticula*  (D**2.00))))
这超过了~1.79e308。要找出哪一个错误,您可以使用在发生这种情况时引发
FloatingPointError
,然后捕获它并启动:

然后,可以在调试器中检查此表达式各个部分的值。溢出似乎发生在:

(mu*18.0*v)/(cc*densparticula*  (D**2.00))
第一次出现警告时,
(cc*Denspaticula*(D**2.00)
的计算结果为2.3210168586496022e-12,而
(mu*18.0*v)
的计算结果为-9.9984582297025182e+299

基本上,您将一个非常大的数字除以一个非常小的数字,结果的大小超过了可以表示的最大值。这可能是您的数学问题,也可能是您对函数的输入没有合理缩放。

您的系统减少到

dv/dt = a = K - L*v
K
大约
10
L
范围在,乍一看
1e+5
1e+10
之间时。使用的实际系数确认:

D=1.0000e-09        K= 9.787995      L=1.3843070e+08
D=3.2000e-08        K= 9.787995      L=4.2570244e+06
D=1.0240e-06        K= 9.787995      L=9.0146813e+04

速度的欧拉步长为

v[j+1]=v[j]+(K-L*v[j])*dt =(1-L*dt)*v[j] + K*dt

对于任何类似预期摩擦效应的情况,即速度降至
K/L
时,需要
abs(1-L*dt)请注意,尽管辛欧拉是一个非保守系统,但您使用的是辛欧拉。将欧拉步骤替换为
t,x,v=t+Dt,x+v*Dt,v+a*Dt
,以实现正确的数值方法。再次检查方程的物理性质,其他力项应以重力项为主。第二个(浮力?)较小,第三个(摩擦力)大得惊人,导致速度演化中的正反馈(带有负因子,因此振荡)。如果找不到误差,请说明用于推导力项的物理定律。或者使用与(力项的倒数)相当的时间步长Lipschitz常数。这意味着
Dt=1e-8
或更小。
tv=linspace(0,5e-4,50)
n=1000
有效。使用刚性系统的方法(梯形方法,其他隐式方法)能够使用更大的时间步长。
v[j+1]=v[j]+(K-L*v[j])*dt =(1-L*dt)*v[j] + K*dt
v[j+1] = v[j] + dt * ( K - L*(v[j]+v[j+1])/2 )
v[j+1] = ( (1-L*dt/2)*v[j] + K*dt ) / (1+L*dt/2)
(-L*v')/(K-L*v)=-L  =>  K-L*v(t)=C*exp(-L*t), C=K-L*v(0)

v(t)=K/L + exp(-L*t)*(v(0)-K/L)
x(t)=x(0)+K/L*t+(1-exp(-L*t))/L*(v(0)-K/L).