Any way to solve a system of coupled differential equations in python?
In addition to SciPy methods odeint
and ode
that were already mentioned, it now has solve_ivp
which is newer and often more convenient. A complete example, encoding [v11, v22, v12]
as an array v
:
from scipy.integrate import solve_ivp
def rhs(s, v):
return [-12*v[2]**2, 12*v[2]**2, 6*v[0]*v[2] - 6*v[2]*v[1] - 36*v[2]]
res = solve_ivp(rhs, (0, 0.1), [2, 3, 4])
This solves the system on the interval (0, 0.1)
with initial value [2, 3, 4]
. The result has independent variable (s in your notation) as res.t
:
array([ 0. , 0.01410735, 0.03114023, 0.04650042, 0.06204205,
0.07758368, 0.0931253 , 0.1 ])
These values were chosen automatically. One can provide t_eval
to have the solution evaluated at desired points: for example, t_eval=np.linspace(0, 0.1)
.
The dependent variable (the function we are looking for) is in res.y
:
array([[ 2. , 0.54560138, 0.2400736 , 0.20555144, 0.2006393 ,
0.19995753, 0.1998629 , 0.1998538 ],
[ 3. , 4.45439862, 4.7599264 , 4.79444856, 4.7993607 ,
4.80004247, 4.8001371 , 4.8001462 ],
[ 4. , 1.89500744, 0.65818761, 0.24868116, 0.09268216,
0.0345318 , 0.01286543, 0.00830872]])
With Matplotlib, this solution is plotted as plt.plot(res.t, res.y.T)
(the plot would be smoother if I provided t_eval
as mentioned).
Finally, if the system involved equations of order higher than 1, one would need to use reduction to a 1st order system.
For the numerical solution of ODEs with scipy, see scipy.integrate.solve_ivp
, scipy.integrate.odeint
or scipy.integrate.ode.
Some examples are given in the SciPy Cookbook (scroll down to the section on "Ordinary Differential Equations").