J'ai travaillé avec sympy et scipy, mais je ne peux pas trouver ou comprendre comment résoudre un système d'équations différentielles couplées (non linéaire, de premier ordre).
Existe-t-il un moyen de résoudre des équations différentielles couplées?
Les équations sont de la forme:
V11'(s) = -12*v12(s)**2
v22'(s) = 12*v12(s)**2
v12'(s) = 6*v11(s)*v12(s) - 6*v12(s)*v22(s) - 36*v12(s)
avec les conditions initiales pour v11 (s), v22 (s), v12 (s).
Pour la solution numérique des ODE avec scipy, voir scipy.integrate.solve_ivp
, scipy.integrate.odeint
ou scipy.integrate.ode .
Quelques exemples sont donnés dans le SciPy Cookbook (faites défiler jusqu'à la section "Equations différentielles ordinaires").
En plus des méthodes SciPy odeint
et ode
qui ont déjà été mentionnées, il a maintenant solve_ivp
qui est plus récent et souvent plus pratique. Un exemple complet, encodant [v11, v22, v12]
Comme un tableau 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])
Cela résout le système sur l'intervalle (0, 0.1)
Avec la valeur initiale [2, 3, 4]
. Le résultat a une variable indépendante (s dans votre notation) comme res.t
:
array([ 0. , 0.01410735, 0.03114023, 0.04650042, 0.06204205,
0.07758368, 0.0931253 , 0.1 ])
Ces valeurs ont été choisies automatiquement. On peut fournir t_eval
Pour faire évaluer la solution aux points souhaités: par exemple t_eval=np.linspace(0, 0.1)
.
La variable dépendante (la fonction que nous recherchons) est dans 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]])
Avec Matplotlib, cette solution est tracée comme plt.plot(res.t, res.y.T)
(le tracé serait plus fluide si je fournissais t_eval
Comme mentionné).
Enfin, si le système impliquait des équations d'ordre supérieur à 1, il faudrait utiliser réduction à un système de 1er ordre .