我是python的新手。我有一个简单的微分系统,它由两个变量和两个微分方程和初始条件x0=1, y0=2组成:

dx/dt=6*y
dy/dt=(2t-3x)/4y


现在,我试图求解这两个微分方程,然后选择odeint。这是我的代码:

import matplotlib.pyplot as pl
import numpy as np
from scipy.integrate import odeint

def func(z,b):
    x, y=z
    return [6*y, (b-3*x)/(4*y)]

z0=[1,2]
t = np.linspace(0,10,11)
b=2*t
xx=odeint(func, z0, b)
pl.figure(1)
pl.plot(t, xx[:,0])
pl.legend()
pl.show()


但是结果不正确,并且出现错误消息:



Excess work done on this call (perhaps wrong Dfun type).
Run with full_output = 1 to get quantitative information.


我不知道我的代码有什么问题以及如何解决。
任何帮助对我都是有用的。

最佳答案

应用技巧将除以y的除数分解为整数,打印所有ODE函数求值,绘制两个分量,并在修改后的代码中使用正确的微分方程

import matplotlib.pyplot as pl
import numpy as np
from scipy.integrate import odeint

def func(z,t):
    x, y=z
    print t,z
    return [6*y, (2*t-3*x)*y/(4*y**2+1e-12)]

z0=[1,2]
t = np.linspace(0,1,501)
xx=odeint(func, z0, t)
pl.figure(1)
pl.plot(t, xx[:,0],t,xx[:,1])
pl.legend()
pl.show()


并且您看到在t=0.64230232515处假定为y=0的奇点,其中y的行为类似于顶点的平方根函数。由于y的斜率达到无穷大,因此无法克服这种奇异之处。此时,解不再是连续可微的,因此这是解的极值点。常数连续是去奇化的产物,不是有效的解决方案。

python - 用scipy在python中求解二维微分方程-LMLPHP

关于python - 用scipy在python中求解二维微分方程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34618488/

10-11 20:21