web-dev-qa-db-fra.com

Une façon de résoudre un système d'équations différentielles couplées en python?

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

18
faceforest

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").

13
Warren Weckesser

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é).

plot of solution

Enfin, si le système impliquait des équations d'ordre supérieur à 1, il faudrait utiliser réduction à un système de 1er ordre .

3
user6655984