Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

Quelques notebooks SAGE / Python. Équations différentielles ou calcul multivariable.

Project: Calcul Libre
Views: 1412
Image: ubuntu2004
Kernel: Python 3

Laboratoire 3 : Systèmes d'équations linéaires

27 octobre 2020, GCH217-MAT217, Prof. : V. Charette

L'objectif de ce labo est d'étudier un système d'équations linéaires à l'aide de python.

Nous avons vu comment résoudre le système suivant : X=AXX'= A X dans le cas où AA est une matrice 2x2. Nous pouvons aussi faire ça avec sympy.

A. Rappels

Nous avons déjà utilisé la fonction dsolve dans sympy. Révisons avec l'exemple suivant :

x1=3x12x2x2=4x12x2\begin{align*} x_1' & = 3x_1-2x_2 \\ x_2' & = 4x_1-2x_2 \end{align*}
from sympy import *
x1=Function('x1') x2=Function('x2') t=Symbol('t') C1=Symbol('C1') C2=Symbol('C2')
sol=dsolve([x1(t).diff(t)-3*x1(t)+2*x2(t),x2(t).diff(t)-4*x1(t)-2*x2(t)],[x1(t),x2(t)]) sol[0]
sol[1]

Exercice 1. À l'aide de sympy, résolvez le système suivant :

x1=2x1x2x2=3x12x2x1(0)=1x2(0)=0\begin{align*} x_1' & = 2x_1-x_2 \\ x_2' & = 3x_1-2x_2 \\ x_1(0) & = 1 \\ x_2(0) & = 0 \\ \end{align*}

Regardons de quoi a l'air le graphe d'une solution particulière, avec des conditions initiales.

x1=3x12x2x2=4x12x2x1(0)=1x2(0)=2\begin{align*} x_1' & = 3x_1-2x_2 \\ x_2' & = 4x_1-2x_2 \\ x_1(0) & = 1 \\ x_2(0) & = 2 \end{align*}
sol=dsolve([x1(t).diff(t)-3*x1(t)+2*x2(t),x2(t).diff(t)-4*x1(t)-2*x2(t)],[x1(t),x2(t)],ics={x1(0):1,x2(0):2}) sol[0]
sol[1]
plot_parametric(sol[0].rhs, sol[1].rhs,(t, 0, 6))

Observez la syntaxe :

"plot_parametric" dessine le graphe d'une courbe paramétrée γ(t)=(x1(t),x2(t))\gamma(t)=(x_1(t),x_2(t)). On doit donc donner les expressions pour x1x_1 (sol[0]) et x2x_2 (sol[1]), donc le côté droit de sol[0] et sol[1].

Exercice 2. À l'aide de sympy, tracez la courbe solution de :

x1=2x1x2x2=3x12x2x1(0)=1x2(0)=0\begin{align*} x_1' & = 2x_1-x_2 \\ x_2' & = 3x_1-2x_2 \\ x_1(0) & = 1 \\ x_2(0) & = 0 \\ \end{align*}

B. Système de trois équations

L'intérêt d'utiliser sympy, c'est surtout pour des plus gros systèmes. Considérons celui-ci.

dxdt=0.4x0.7y+0.01zdydt=0.4xdzdt=0.7y0.01z\begin{align*} \frac{dx}{dt} & = -0.4 x-0.7 y+0.01 z\\ \frac{dy}{dt} & = 0.4 x\\ \frac{dz}{dt} & = 0.7y-0.01 z \end{align*}

On va avoir besoin d'une commande pour dessiner des courbes paramétrées dans R3R^3.

x3=Function('x3') from sympy.plotting import plot3d_parametric_line plot3d_parametric_line(t,t*sin(t),t**2*cos(t),(t,0,25))

Exercice 3. À l'aide de sympy :

a) trouvez la solution générale du système

b) tracez la courbe solution passant par le point (50,40,10).

C. Systèmes non-linéaires : approche numérique

On a déjà vu comment faire, au dernier labo. On rappelle comment faire ici, mais j'ai changé une chose dans les arguments de plot. Comparez le code avec ce qu'on a fait, et notez l'effet du changement.

import numpy as np import matplotlib.pyplot as plt from scipy.integrate import solve_ivp N=100 def lotkavolterra(t, z, a, b, c, d): x, y = z return [a*x - b*x*y, -c*y + d*x*y] sol1 = solve_ivp(lotkavolterra, [0, N], [10, 5], args=(1.5, 1, 3, 1),t_eval=np.arange(0, N, 0.01)) plt.plot(sol1.y[0],sol1.y[1]) # alternative : #sol1 = solve_ivp(lotkavolterra, [0, 15], [10, 5], args=(1.5, 1, 3, 1),dense_output=True) # #t = np.linspace(0, 5, 300) #z = sol1.sol(t) #plt.plot(z[0],z[1]) plt.xlabel('x') plt.ylabel('y') plt.title('Lotka-Volterra') plt.show()

Pour une courbe en 3d, vous aurez besoin de ceci...

import matplotlib.pyplot as plt import mpl_toolkits.mplot3d fig = plt.figure() ax = fig.add_subplot(111, projection='3d') t = np.arange(0, 40, 0.01) ax.plot(t, t*np.cos(t), t**2*np.sin(t)) plt.show()

Exercice 4. Résolvez numériquement le système suivant :

dxdt=0.1xy+0.01zdydt=0.1xy0.7ydzdt=0.7y0.01zx(0)=20,y(0)=10,z(0)=5\begin{align*} \frac{dx}{dt} & = -0.1 xy+0.01 z\\ \frac{dy}{dt} & = 0.1 xy-0.7y\\ \frac{dz}{dt} & = 0.7y-0.01 z \\ x(0) & = 20,\quad y(0)= 10,\quad z(0)=5 \end{align*}

Remarque. Il s'agit d'un modèle "Sain-Infecté-Remis", soit un modèle utilisé dans la modélisation d'épidémies.