Informatique en PCSI et MPSI Champollion 2013
Transcription
Informatique en PCSI et MPSI Champollion 2013
Informatique en PCSI et MPSI Champollion 2013-2014 Méthodes d’Analyse Numérique Implémentation et Application en Python Équations différentielles ordinaires A. HASSAN 19 février 2014 A. Hassan@Champollion PCSI-MPSI – 1 Résolution des équation différentielles ordinaires (EDO) Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) A. Hassan@Champollion Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 2 Champs de vecteurs Solution Le Problème Soit I un intervalle de R, D un ouvert de R n et f une fonction connue de R n × I −→ R n . On cherche y : I → R n telle que y1 ( t ) f 1 ( y1 ( t ), · · · , y n ( t ); t ) . .. et y ( t ) = y′ (t) = f (y(t); t) où f (y(t); t) = .. . f n ( y1 ( t ), · · · , y n ( t ); t ) yn (t) Ce type d’équations s’appelle Équation résolue en y′ . Par contre sin(t.y′ + cos(y′ + y)) = t.y + y′ n’est pas résolue en y′ . I.e. Impossible d’écrire y′ = f (t, y) (avoir y′ explicitement en fonction de t et y) Ordinaire : la dérivation est effectuée par rapport à t uniquement. ∂2 T ∂2 T ∂T = 2 + 2 , fonction inconnue Équation aux dérivées partielles(EDP) : ∂t ∂x ∂y T (t, x, y) (Équation de la chaleur ou de la diffusion) A. Hassan@Champollion PCSI-MPSI – 3 Le Problème (suite) Problème de Cauchy (ou dela condition initiale) : y1 ( t ) Trouver t 7→ y(t) = ... de I −→ R n telle que yn (t) y ( t0 ) = y0 y ′ ( t ) = f ( y ( t ); t ) Problème des conditions aux limites : Cas où l’on dispose d’informations sur y à des valeurs différentes de t. Conditions initiales ′ y1 (t) = −y1 (t) + y2 (t) + sin(t) y2′ (t) = 2y1 (t) − 3y2 (t) (y1 (0); y2 (0)) = (0, 3) A. Hassan@Champollion Conditions aux limites ′ y (t) = −y1 (t) + y2 (t) + sin(t) 1′ y2 (t) = 2y1 (t) − 3y2 (t) y1 (0) = 2 y2 ( π4 ) = −1 PCSI-MPSI – 4 Problème de Cauchy Sauf quelques cas particuliers, il est presque impossible de trouver des solutions analytiques(i.e. se ramener à un calcul de primitives). On cherche des solutions approchées, donc Résolutions numériques. Principe : Si l’on connaît y à l’instant (abscisse) t, comment obtenir y à l’instant t + h, y(t + h), puis recommencer avec y(t + h) ? Choisir h assez petit et utiliser les Développements limités y′ ( t )= f ( t,y(t) 1 2 ′′ n y(t + h) = y(t) + hy (t) + h y (t) + · · · + o(h ) ===========⇒ 2 ′ = y(t) + Φ(t, h, f (y, t)) + o(hn ) On cherche Φ(t, h, f (y, t)) de telle sorte l’ordre de o(hn ) soit le plus élevé possible (en minimisant le coût et la complexité des calculs). A. Hassan@Champollion Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 5 Champs de vecteurs Solution Méthodes de résolution : Ordres 1 et 2 • Le plus souvent h = (t f − t0 )/N où [t0 ; t f ] désigne l’intervalle de résolution et N le nombre de sous-intervalles. • Sinon : On considère T = {t0 ; t1 ; · · · ; tn−1 ; tn } et h i = ( t i +1 − t i ) Ainsi y(t) est l’estimation courante en t et y(t + h) l’estimation au pas suivant Pour n = 1 ⇒ Méthode d’Euler (ou Runge Kutta d’ordre 1). y(t + h) ≈ y(t) + h f (t, y(t)) Pour n = 2 ⇒ Méthode de Runge Kutta d’ordre 2. K1 = h. f (t, y(t)) 1 1 K2 = h. f (t + h; K1 + y(t)) 2 2 y ( t + h ) ≈ y ( t ) + K2 A. Hassan@Champollion Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 6 Champs de vecteurs Solution Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Principe de la méthode : Chercher une solution approchée de t f − t0 y′ = f (t; y) sur l’intervalle I = [t0 ; t f ] y0 = y ( t0 ) ) où h = ( t i +1 − t i ) ⇒ y ( t i + h ) ≈ y ( t i ) + h i . f ( y ( t i ), t i ) Géométriquement : Remplacer la courbe sur [ti ; ti + h] par la tangente. Si Mn (tn ; yn ) est le point courant de la courbe "solution", le nouveau point : Mn+1 (tn + h; yn + h f (tn , yn )). pas d’intégration : h = ( N b δy bc yn erreur commise bc hn A. Hassan@Champollion bc bc tn t n +1 PCSI-MPSI – 7 Algorithme d’Euler (Runge Kutta d’ordre un) Euler ( f , y0 , t0 , t f , N ) Entrées : f fonction données (t0 ; y0 ) point initial t f abscisse final N nombre de points de [t0 ; t f ] Sorties : Ly liste des ordonnées yk , k = 0; 1; · · · ; N ( t f − t0 ) h← N L y ← y0 , L t ← t0 pour k de 1 à N faire y0 ← y0 + h. f (t0 , y0 ) t0 ← t0 + h L y ← L y , y0 ; L t ← L t , t0 retourner Ly et Lt A. Hassan@Champollion # stocker les solutions # stocker les abscisses Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 8 Champs de vecteurs Solution Implémentation de l’algorithme d’Euler 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1. On charge les modules numpy (ou scipy ) pour les calculs 2. 3. numériques et matplotlib.pyplot (ou pylab ) pour les graphiques. La fonction (y; t) 7→ f (y; t) est définie au préalable. On rappelle que y0 = y(t0 ) ∈ R n éventuellement import numpy as np import matplotlib . pyplot as mp ## def Euler (f , t0 , y0 , tf ,N ): h =......... # definiton du pas fixe # sinon h =t [ i +1] - t[ i ] Ly , Lt =[...] ,[...] # stockage du point initial f o r k in ..........: # A la limite Lt peut etre donne ailleurs # prevoir que y0 peut etre vectoriel y0 =...................... ... t0 +=..................... ... ................... ... ... ... ................... ... ... ... r e t u r n array ( Lt ) , array ( Ly ) ## A. Hassan@Champollion Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 9 Champs de vecteurs Solution Implémentation de la méthode d’Euler en Python 1. On charge les modules numpy (ou scipy )pour les calculs numériques et 2. 3. matplotlib.pyplot (ou pylab )pour les graphiques La fonction (y; t) 7→ f (y; t) est définie au préalable. On rappelle que y0 = y(t0 ) ∈ R n éventuellement Version pédagogique 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import numpy as np import matplotlib . pyplot as mp ## def Euler (f ,t0 , y0 , tf , N ): h =( tf - t0 )/ N # definition du pas fixe # sinon h= t [i +1] - t [ i] Ly , Lt =[ y0 ] ,[ t0 ] # stockage du point initial f o r k in range ( N ): # A la limite Lt peut etre donne ailleurs # prevoir que y0 peut etre vectoriel y0 = y0 + h * np . array ( f (t0 , y0 )) t0 += h Ly . append ( y0 ) Lt . append ( t0 ) r e t u r n np . array ( Lt ) , np . array ( Ly ) ## A. Hassan@Champollion Version optimisée 1 2 3 4 5 6 7 8 9 import numpy as np def euler ( dXdt ,X0 , t ): n = len ( t) X = np . zeros (( len ( t ) ,)+ np . shape ( X0 )) X [0]= X0 f o r i in range (n -1): h =( t [ i +1] - t[ i ]) X [ i +1]= X [ i ]+ dXdt ( X [i ] , t[ i ])* h return X PCSI-MPSI – 10 Runge Kutta d’ordre 4 (RK4) Soit (t; y(t)) un point courant, y(t + h) est une estimation de la solution en t + h Pour n = 4 ⇒ Méthode ou Runge Kutta d’ordre 4. K1 = h. f (y(t); t); 1 2 1 2 K2 = h. f ( K1 + y(t); t + h) 1 1 K3 = h. f (y(t) + K2 ; t + h); 2 2 K4 = h f ( y ( t ) + K3 : t + h ) 1 6 y(t + h) ≈ y(t) + (K1 + 2K2 + 2K3 + K4 ) Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Il existe des méthodes à pas adaptatif (h n’est pas fixe). A. Hassan@Champollion Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 11 Champs de vecteurs Solution Méthode de Runge-Kutta d’ordre 4 en Python On charge au préalable le module numpy (ou scipy ). La fonction f est pointée par dXdt . 1 import numpy as np Voici un code de RK4 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 def rk4 ( dXdt ,X0 , t ): # Runge Kutta d ’ ordre 4 """ Entrees : t : contient les points de la subdivision X0 : les conditions initiales dXdt : la fonction connue Sorties : X : Solutions approchees aux points de t """ # import numpy as np n = len (t ) X = np . zeros (( len ( t ) ,)+ np . shape ( X0 )) # on construit une matrice de 0 X [0]= X0 # stocker les valeurs initiales f o r i in range (n -1): k1 =................ # k1 =f (y ,t ) h =................ k2 =................ k3 =................ k4 =................ X [i +1]= X [i ]+................ # on a deja divise h par 2 return (X) A. Hassan@Champollion PCSI-MPSI – 12 Méthode de Runge-Kutta d’ordre 4 en Python On charge au préalable le module numpy (ou scipy ) 1 import numpy as np Voici un code de RK4 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 def rk4 ( dXdt ,X0 , t ): # Runge Kutta d ’ ordre 4 """ Entrees : t : contient les points de la subdivision X0 : les conditions initiales dXdt : la fonction connue Sorties : X : Solutions approchees aux points de t """ # import numpy as np n = len (t ) X = np . zeros (( len ( t ) ,)+ np . shape ( X0 )) # on construit une matrice de 0 X [0]= X0 # stocker les valeurs initiales f o r i in range (n -1): k1 = dXdt ( X[ i ] ,t [ i ]) # k1 = f(y , t) h =( t [i +1] - t [ i ])/2 k2 = dX_dt (X [ i ]+ h * k1 , t [i ]+ h) k3 = dX_dt (X [ i ]+ h * k2 , t [i ]+ h) k4 = dX_dt (X [ i ]+2* h* k3 ,t [ i ]+2* h ) X [i +1]= X [i ]+ h /3*( k1 +2* k2 +2* k3 + k4 ) # on a deja divise h par 2 return (X) A. Hassan@Champollion PCSI-MPSI – 13 Utilisation de la commande odeint du module scipy.integrate Le module scipy.integrate fournit la commande odeint qui est un "mix" de Runge Kutta d’ordre 4 avec des méthodes à pas adaptatif. Syntaxe et utilisation : 1. 2. 3. chargement du module adéquat : from scipy.integrate import odeint forme simplifiée : odeint(func,CondInit,t) forme complète : odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0, ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0) A. Hassan@Champollion PCSI-MPSI – 14 Commande odeint (suite) Forme simplifiée : Ys=odeint(f, CondInit, t) 1. 2. f pointe sur la fonction CONNUE f dans y′ (t) = f (y(t), t). Attention : le premier argument de f est la fonction vectorielle inconnue y. CondInit pointe sur le vecteur des conditions initiales y1 ( t0 ) y(t0 ) = ... y n ( t0 ) 3. t pointe sur les points définissant le découpage de l’intervalle de résolution I = [t0 ; t0 + T ] La solution Ys contient les valeurs des solutions approchées sur les différents points indiqués de I A. Hassan@Champollion Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 15 Champs de vecteurs Solution Exercice : L’équation de Van Der Pol (1924) Il s’agit de l’équation différentielle y′′ + f (y2 − 1)y′ + y = 0 ( f ≥ 0) Où f .(y2 − 1) représente un facteur d’amortissement non linéaire ( f ∈ R + ). 1. 2. 3. 4. Préciser à quoi correspond le cas f = 0 ? f 6= 0 et a 6= 0 ?. Écrire l’équation de Van der Pol sous forme d’une équation vectorielle de premier ordre. Montrer que 0 est le seul point d’équilibre et qu’il n’est pas stable. Expliquer qualitativement le comportement lorsque y ≈ 0 ou bien lorsque y croît. Pour les simulations on prend kπ (y0 ; y0′ ) ∈ {r (cos( kπ ) ; sin ( 5 5 )) : k ∈ [[ 0, 9 ]] et r ∈ {1; 3}} A. Hassan@Champollion Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 16 Champs de vecteurs Solution Implémentation en Python Préambule 1 2 3 4 # # modules a charger from scipy import * from matplotlib . pyplot import * from scipy . integrate import odeint Programmation Van Der Pol : 1 2 3 4 5 6 7 def VdPol (......): ........... ........... ........... ........... ........... # Simulation 1 2 3 du système correspondant à l’équation de #y′′ + f (y2 − 1)y′ + y = 0 et utilisation de odeint : t = linspace (...........) ci =[.... ,....] Ys = odeint (..... , ..... , ..........) A. Hassan@Champollion Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 17 Champs de vecteurs Solution Exploitation graphique y1 ( t ) Réponses Temporelles Si Y (t) = solution de y2 ( t ) Y ′ = f (Y, t). Les courbes temporelles correspondent aux courbes (t; y1 (t)) et (t; y2 (t)) 1 2 3 4 5 6 clf () # Tracer la reponse temporelle plot ( , , ’r ’) # premiere composante plot ( , , ’g ’) # seconde composante grid (); # grille show () Portraits de phase : Le portrait de phase correspond la trajectoire M (t) = (y1 (t); y2 (t)) 1 2 CIs =[[ , ] ,[ , ] ,[ , ] ,[ , ]] # ensemble de conditions initiales f o r n in ................: 3 4 Ysol =................... 5 6 7 plot (................. .. ... ... ... ) show () A. Hassan@Champollion Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 18 Champs de vecteurs Solution Exploitation graphique : Champs de vecteurs On voudrait en chaque point M du plan faire apparat̂re un vecteur ~v tangent à la courbe intégrale passant par ce point (i.e. ~v colinéaire à (1; f (y, t)) dans notre cas) 1 2 3 4 5 6 7 8 9 10 11 12 # # Creation des champs de vecteurs x = linspace ( -4 ,4 ,20) # subdiviser l ’ intervalle de x [−4; 4] y = linspace ( -4 ,4 ,20) # subdiviser l ’ intervalle de y [−4; 4] X1 , Y1 = meshgrid (x ,y ) # grille de noeuds en x , y dX , dY = VdPol ([ X1 , Y1 ] ,0) # generer les vecteurs tangents M = hypot ( dX , dY ) # normalisation M [M ==0]=1. # Normes d ’ eventuels vecteurs nuls dX /= M # remplaces par 1 avant division dY /= M quiver ( Y1 ,X1 ,dY , dX , M ) # generation du champs de vecteurs show () ## Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) A. Hassan@Champollion Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 19 Champs de vecteurs Solution Solution 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 # # Resolution de l ’ equation de Van der Pol y′′ + f ∗ (y2 − 1)y′ + y = 0 def VdPol (y , t ): # """ Attention d ’ abord y ( t) puis t """ f =1 v =y [0]; # y vp = y [1]; # y′ vpp = f *(1 - v **2)* vp - v # y′′ = −y + f (1 − y2 )y′ r e t u r n array ([ vp , vpp ]) ## t = linspace (0 ,20 ,1000) # on simule sur 1000 points de T = [0; 20] # genere des conditions initiales ci = array ([[0.5* cos ( k * pi /5) ,0.5* sin ( k* pi /5)] f o r k in range (10)]) ci2 = array ([[2.5* cos ( k* pi /5) ,2.5* sin (k * pi /5)] f o r k in range (10)]) # f o r i in range (10): Ys = odeint ( VdPol , ci [ i ] ,t ) Yys = odeint ( VdPol , ci2 [i ] , t) Vp = Ys [: ,1]; V= Ys [: ,0] # recuperer les reponses temporelles plot ( Vp ,V , ’r ’) # le portrait de phase ( rouge ) plot ( Yys [: ,1] , Yys [: ,0] , ’g ’) # encore des portraits de phases plot ( ci [: ,0] , ci [: ,1] , ’o ’) plot ( ci2 [: ,0] , ci2 [: ,1] , ’ob ’) title (" Trajectoires de Van der Pol : y′′ + f (y2 − 1)y′ + y = 0" ) xlabel ( " Apparition du cycle limite " ); grid () savefig ( " G :\\ Azzam \\ MyPython \\ TpChampollion \\ VanDerPol . eps ") show () A. Hassan@Champollion PCSI-MPSI – 20 Portrait de phase 3 Trajectoires de Van der Pol: Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) y′′+ f(y2 −1)y′ + y =0 2 1 Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du 0 −1 −2 −3 −4 A. Hassan@Champollion module scipy.integrate −3 −2 −1 1 0 Apparition du cycle limite 2 3 4 Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 21 Champs de vecteurs Solution Solution(suite) Réponses temporelles : 1 2 3 4 5 6 7 8 9 10 11 subplot (221) plot (t , Vp ); grid (); title (" évolution de y′ (t) " ) subplot (222) plot (t , V ); grid (); title (" évolution de y(t) ") subplot (212) plot ( Vp , V ); grid (); title (" portrait de phase correspondant ") show () savefig ( " C :// Users // David // Desktop // Info // Python // Cours // analysenum // RepTempo . eps ") A. Hassan@Champollion PCSI-MPSI – 22 Solution : Graphiques(suite) évolution de y (t) ′ 3 3 2 2 1 1 0 0 −1 −1 −2 −2 −3 0 5 10 15 20 −3 0 évolution de y(t) 5 15 10 portrait de phase correspondant 3 Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) 20 2 1 0 −1 module scipy.integrate −2 −3 −3 A. Hassan@Champollion Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du −2 −1 0 1 2 3 Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 23 Champs de vecteurs Solution Solution : Champs de vecteurs 1 2 3 4 5 6 7 8 9 10 11 12 13 clf () x = linspace ( -4 ,4 ,30) y = linspace ( -4 ,4 ,30) X1 , Y1 = meshgrid (x ,y ) dX , dY = VdPol ([ X1 , Y1 ] ,0) M = hypot ( dX , dY ) M [M ==0]=1.0 dX /= M dY /= M # quiver ( Y1 ,X1 ,dY , dX , M ) show () savefig ( " C :// Users // David // Desktop // Info // Python // Cours // analysenum // ChampVdPol . eps " ) A. Hassan@Champollion PCSI-MPSI – 24 4 3 2 1 0 −1 −2 −3 −4 −4 A. Hassan@Champollion −3 −2 −1 0 1 2 3 4 PCSI-MPSI – 25 Solution : Superposition Portrait de phase/ champs de vecteurs 4 3 2 1 0 −1 −2 −3 −4 −4 A. Hassan@Champollion −3 −2 −1 0 1 2 3 4 PCSI-MPSI – 26 Exemple : Le pendule simple (non amorti) Soit une masse m suspendu à un point fixe par un fil non extensible de longueur ℓ. Les lois de la mécanique impliquent : g l mℓ2 θ ′′ = −mgℓ sin(θ ) ⇐⇒ θ ′′ = − sin(θ ) 1. θ angle de l’écart avec la verticale en radians, θ ′ (t) (resp. θ ′′ (t)) vitesse (resp. accélération)angulaire 2. ℓ longueur en mètre. 3. g accélération de la pesanteur en m.s−2 4. À l’instant t = 0, θ = θ0 écart par rapport à la verticale et θ0′ = 0 (vitesse initiale nulle) bc θ bc m~g Question : Trouver la loi du mouvement t 7→ θ (t) ? Pas de solution exprimable à l’aide des fonction usuelles (composées de exp() et de ln() . . . ), (on démontre même que cela est impossible). Remarque : Résolution pour des "petits" θ : q sin( θ )≈ θ ======= ⇒ θ (t) = θ0 cos(ωt) où ω = gℓ A. Hassan@Champollion PCSI-MPSI – 27 Traitement On cherche une fonction y : R + −→ I × R où I = [−π; π ] où θ position angulaire θ où y= θ ′ vitesse angulaire θ′ # " ′ ′ y2 θ θ ′ g g = − sin(θ ) = y = − sin(y1 ) θ ′′ ℓ ℓ Donc f : I × R −→ R × R g ( x1 ; x2 ) 7→ ( x2 ; − sin( x1 )) ℓ L’équation devient (Problème de Cauchy) : y′ = f (y) avec y(0) = θ0 0 Équation différentielle autonome(stationnaire) : f ne dépend pas de t explicitement. A. Hassan@Champollion Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 28 Champs de vecteurs Solution Exemples : Résolution de y′′ + y = 0 (petite oscillation du pendule) On dispose d’une solution exacte de y′′ + y = 0 (n’est-ce pas ?) où (y(0); y′ (0)) = ( a, b) : y(t) = a cos(t) + b sin(t) 1 2 3 4 5 6 7 # # Un exemple : y ’ ’+y =0 def f (y , t ): # definition de la fonction vectorielle """ y (1)= ypp , y (2)= yp """ r e t u r n ( np . array ([ - y [1] , y [0] ])) # t = np . linspace (0 ,30 ,1000) # découpage de l ’ intervalle [0 ,10] en 1000 8 9 10 11 12 13 14 15 16 17 18 19 20 # utilisation des méthodes d ’ Euler et RK4 programmées # cond . init . (y′ (0), y(0)) = (0; 1) ci = np . array ([0 ,1]) # solution par Euler sol1 = euler (f ,ci , t) # solution par RK4 sol2 = rk4 (f , ci , t ) # solution exacte de y ’ ’+ y =0 solexact = np . cos ( t) # y(t) = cos(t) # utilisation de la methode odeint de numpy . integrate sol3 = sint . odeint (f , ci , t ) # A. Hassan@Champollion PCSI-MPSI – 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # Exploitation graphique py . subplot (211) py . title ( " Comparaison : Euler ( rouge ) , solution exacte ( noir ) de y′′ + y = 0" ) py . plot (t , sol1 [: ,1] , color = ’ red ’) py . plot (t , solexact , color = ’ black ’) # py . subplot (212) py . title ( " Comparaison : RK4 ( rouge ) , solution exacte de y′′ + y = 0" ) py . plot (t , sol2 [: ,1] , color = ’ red ’) py . plot (t , solexact , color = ’ black ’) py . grid ( True ) py . savefig ( " edo1 . eps ") # sauvegarder l ’ image dans un fichier , SI JE VEUX py . subplot (111) py . title ( " Comparaison : numpy . odeint ( rouge ) , solution exacte de y′′ + y = 0") py . plot (t , sol3 [: ,1] , color = ’ red ’) py . plot (t , solexact , color = ’ black ’) py . grid ( True ) py . savefig ( " edo2 . eps ") A. Hassan@Champollion PCSI-MPSI – 30 Résultats graphiques Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Comparaison: Euler(rouge), solution exacte(noir) de y + y =0 1.5 ′′ 1.0 0.5 0.0 −0.5 −1.0 −1.5 −2.0 0 1.0 5 10 15 20 25 Comparaison: RK4(rouge), solution exacte de y + y =0 ′′ 30 0.5 0.0 module scipy.integrate −0.5 −1.0 0 A. Hassan@Champollion Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du 5 10 15 20 25 30 Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 31 Champs de vecteurs Solution Résultats graphiques Comparaison: numpy.odeint(rouge), solution exacte de y + y =0 1.0 ′′ 0.5 Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du 0.0 −0.5 module scipy.integrate −1.0 0 A. Hassan@Champollion 5 10 15 20 25 30 Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 32 Champs de vecteurs Solution Pendule simple : y′′ + ω2 sin(y) = 0 Cette fois on ne fait pas l’approximation sin(y) ≈ y. Pas de solution exacte simple, la comparaison avec la solution "petits angles" donne : 1 2 3 # # Resolution de y ’ ’+ sin ( y )=0 def f (y , t ): r e t u r n ( np . array ([ - np . sin (y [1]) , y [0] ])) 1.5 Euler(rouge)de y y) = 0, ′′ + sin( solution petits angles:y ′′ + y =0 1.0 0.5 0.0 −0.5 −1.0 −1.5 0 1.0 5 RK4(rouge) de y ′′ 10 y) = 0, + 2sin( 15 20 25 solution petits angles:y ′′ + y =0 30 0.5 0.0 −0.5 −1.0 0 A. Hassan@Champollion 5 10 15 20 25 30 PCSI-MPSI – 33 Résultats graphiques 1.0 odeint(rouge) de y ′′ y) = 0, + sin( solution petits angles:y ′′ + y =0 0.5 0.0 −0.5 −1.0 0 A. Hassan@Champollion 5 10 15 20 25 30 PCSI-MPSI – 34 Construction du portrait de phases 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 t = np . linspace (0 ,7 ,300) # On stocke pour plusieurs cond init . courbes =[\ ([0 ,1] , t ) ,\ ([0 ,2] , t ) ,\ ([0 ,4] , t ) ,\ ([0 ,5] , t )] # f o r i in range ( len ( courbes )): sol = sint . odeint (f , courbes [ i ][0] , courbes [i ][1]) py . plot ( sol [: ,0] , sol [: ,1]) # portrait de phase # dessin du champs de vecteurs # creation d ’ une grille x = np . linspace ( -5 ,5 ,20) y = np . linspace ( -5 ,5 ,20) X ,Y = py . meshgrid (x , y ) # calcul des vecteurs du champ DX , DY =f ([ X , Y ] ,0) # normalisation N = py . hypot ( DX , DY ) DX /= N ; DY /= N # dessin du champ le dernier paramètre permet \ # de coloriser en fonction de la norme py . quiver (X ,Y , DX ,DY , N) py . title ( " champs et portrait de phase correspondant a y′′ + y = 0" ) py . grid () py . savefig ( " phase1 . eps " ) A. Hassan@Champollion PCSI-MPSI – 35 Portrait de phase de y′′ + y = 0 : Visualisation 6 champs et portrait de phase correspondant a y + y =0 ′′ 4 2 0 −2 −4 −6 −6 A. Hassan@Champollion −4 −2 0 2 4 6 PCSI-MPSI – 36 Portrait de phase de y′′ + sin(y) = 0 : Visualisation champ correspondant à l'équation du pendule: y ′′ y) = 0 + sin( 4 2 0 −2 −4 −4 A. Hassan@Champollion −2 0 2 4 PCSI-MPSI – 37 Attracteur de Lorenz(vers 1963) Les équations de Lorentz, basées sur la mécanique des fluides (équations de Navier-Stokes), modélisent entre autre, l’évolution atmosphérique et expliquent (en partie= les difficultés à rencontrées lors des prévisions météorologiques : x ′ (t) = σ(y(t) − x (t)) y′ (t) = ̺x (t) − y(t) − x (t)z(t) z′ (t) = x (t)y(t) − βz(t) σ ≈ 10, β ≈ 2.66 ̺ ≈ 30 Où σ x (t) y(t) z(t) A. Hassan@Champollion : (dépend de la viscosité et la conductivité thermique) : est proportionnel au taux de convection. : des gradients de températures horizontal et vertical PCSI-MPSI – 38 Résolutions des équations de Lorenz avec Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import matplotlib . pyplot as mp import numpy as np from scipy . integrate import odeint from mpl_toolkits . mplot3d import Axes3D # Module pour graphique 3 D # # Attracteur de Lorentz sigma , rho , b = 10 ,30 ,2 # valeurs des parametres fig = mp . figure () ax = fig . gca ( projection = ’3d ’) # v =[ x ,y , z] dans le modele de Lorenz def fLorenz ( v , t ): r e t u r n ([ sigma *( v [1] - v [0]) , rho * v [0] - v [1] - v [0]* v [2] ,\ v [0]* v [1] - b * v [2]]) # def OrbiteLorenz ( ci ,n , T ): t = np . linspace (0 ,T , n +1) f o r y0 in ci : values = odeint ( fLorenz , y0 , t ) ax . plot ( values [: ,0] , values [: ,1] , values [: ,2] , label = str ( y0 )) OrbiteLorenz ([[20 ,0 ,0] ,[10 ,0 ,0] ,[0.1 ,0 ,0]] ,1000 ,10) ax . legend () mp . savefig ( " Lorenz . eps " ) mp . show () A. Hassan@Champollion Résolution des équation différentielles ordinaires (EDO) Le Problème Le Problème (suite) Problème de Cauchy Méthodes de résolution: Ordres 1 et 2 Méthode d’Euler ou RK1 (Runge-Kutta d’ordre 1) Implémentation de l’algorithme d’Euler Implémentation de la méthode d’Euler en Python Runge Kutta d’ordre 4 (RK4) Méthode de Runge-Kutta d’ordre 4 en Python Méthode de Runge-Kutta d’ordre 4 en Python Utilisation de la commande odeint du module scipy.integrate Commande odeint (suite) Exercice: L’équation de Van Der Pol (1924) Implémentation en Python Exploitation graphique Exploitation graphique: PCSI-MPSI – 39 Champs de vecteurs Solution Attracteur de Lorenz [20, 0, 0] [10, 0, 0] [0.1, 0, 0] 60 50 40 30 20 10 −20−15 −10 −5 0 −10 5 10 −20 15 20 −30 25 0 10 20 0 30 Impossible de prévoir à long terme l’état du système. A. Hassan@Champollion PCSI-MPSI – 40 Le module NUMPY : quelques commandes Vecteurs 1 2 3 4 5 vl = array ([ a ,b ,..]) vc = arry ([[ a ] ,[ b ] ,..]) vl [ i ]; vc [ j ] vl . size S = arange (d ,f , i ) # # # # # vecteur ligne vecteur colonne elemt : vli et vc j longueur de vl S =[d , d +i , d +2i ,...] ( f 6∈ S) # # # # # # # # # # # # # # # # remplissage par lignes mij renvoie le format de mat extrait la ligne i de mat extrait la colonne j de mat 0n × p mij = 1 si i = j, 0 sinon matrice des uns ( matrice d ’ Attila ) no comment re - dimensionner : mat ∈ Mm×q (K ) transformer matrice en tableau transformer tableau -> matrice det(mat) avec le module numpy.linalg mat−1 avec le module numpy.linalg valeurs et vecteurs propres de mat avec le module num vecteurs propres avec le module numpy.linalg Matrices 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 mat =[[ a1 , a2 ,..] ,[ b1 , b2 ,..]] mat [i , j ] mat . shape mat [i ,:] mat [: , j ] zeros ([ n , p ]); zeros (n , p) m = eye (n ,p ) ones ([ n ,p ]) transpose ( mat ) reshape ( mat ,( m ,q )) asarray ( mat ) asmatrix ( m ) det ( mat ) inv ( mat ) eigvals ( mat ) eig ( mat ) A. Hassan@Champollion PCSI-MPSI – 41 Commandes NUMPY (suite) Polynômes 1 2 3 4 5 6 P = poly1d ([ a ,b ,..]) Pf = poly1d ([ a ,b ,..] , True ) P . order P . roots ; roots (P ) P . coeffs P ( x ); polyval (P , x ) A. Hassan@Champollion # P ( x) = axn + bxn−1 + · · · # Pf ( x) = ( x − a)( x − b) · · · # renvoie les racines complexes ( approchees ) # renvoie les coefficients de P # renvoie P ( x) selon Horner PCSI-MPSI – 42 Opération sur les matrices (resp. vecteurs) 1. 2. 3. 4. 5. Combinaisons linéaires Produit de matrices inverse de matrices Produit termes à termes Produit tensoriel A. Hassan@Champollion PCSI-MPSI – 43