solving two dimension-differential equations in python with scipy

℡╲_俬逩灬. 提交于 2019-12-05 07:46:53

问题


i am a newbie to python. I have a simple differential systems, which consists of two variables and two differential equations and initial conditions x0=1, y0=2:

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

now i am trying to solve these two differential equations and i choose odeint. Here is my code:

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()

but the result is incorrect and there is a error message:

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

I don't know what is wrong with my code and how can i solve it. Any help will be a useful to me.


回答1:


Apply trick to desingularize the division by y, print all ODE function evaluations, plot both components, and use the right differential equation with the modified code

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()

and you see that at t=0.64230232515 the singularity of y=0 is assumed, where y behaves like a square root function at its apex. There is no way to cross that singularity, as the slope of y goes to infinity. At this point, the solution is no longer continuously differentiable, and thus this is the extremal point of the solution. The constant continuation is an artifact of the desingularization, not a valid solution.



来源:https://stackoverflow.com/questions/34616775/using-odeint-to-solve-two-first-order-differential-equations-with-a-vector-as-in

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!