如何在Python中求解三个二次微分方程?

时间:2018-05-27 12:22:07

标签: python-3.x numpy matplotlib scipy differential-equations

我刚刚开始使用Python进行科学绘图来绘制微分方程的数值解。我知道如何使用模块来求解和绘制单微分方程,但不了解微分方程系统。我如何绘制以下耦合系统?

我的微分方程系统是:

dw/dx=y
dy/dx=-a-3*H*y
dz/dx=-H*(1+z)

a = 0.1H=sqrt((1+z)**3+w+u**2/(2*a))

我的代码是:

import numpy as N 
from scipy.integrate import odeint
import matplotlib.pyplot as plt

def model(w,y,z,x,H): 
    dwdx=y
    dydx=-a-3*H*y
    dzdx=-H*(1+z)
    a=0.1
    H=sqrt((1+z)**3+w+u**2/(2*a))
    return [w,y,z,H]   

z0=1100      #initial condition
w0=-2.26e-8
y0=-.38e-4
H0=36532.63
b=0
c=10000
x=N.arange(b,c,0.01)

y=odeint(model,y0,x)    #f=Function name that returns derivative values at requested y and t values as dydt = f(y,t) 
w=odeint(model,w0,x)
z=odeint(model,z0,x)

plt.plot(w,x)
plt.plot(y,x)
plt.plot(z,x)
plt.legend(loc='best')
plt.show()

1 个答案:

答案 0 :(得分:1)

通用ODE集成商期望动态系统简化为抽象的一阶系统。这样的系统具有状态向量空间,并且微分方程为该空间提供速度向量。这里的状态有3个标量组件,它们将3D矢量作为状态。如果要单独使用这些组件,ODE函数的第一步是从状态向量中提取这些组件,最后一步是按正确的顺序从组件的导数组成返回向量。

此外,您需要按依赖顺序排列计算步骤

def model(u,t): 
    w, y, z = u
    a=0.1
    H=sqrt((1+z)**3+w+u**2/(2*a))
    dwdx=y
    dydx=-a-3*H*y
    dzdx=-H*(1+z)
    return [dwdx, dydx, dzdx]   

然后使用组合初始状态

调用积分器一次
u0 = [ w0, y0, z0]
u = odeint(model, u0, x)

w,y,z = u.T

还请检查绘图函数的参数,一般方案是plot(x,y)