CPGE OUJDA                                                                                                                                                       SPE

Résolution approchée d'une équation différentielle

1.     Equations différentielles du premier ordre

De nombreux problèmes conduisent à la résolution d'équations différentielles du premier ordre du type :

Ecrite aussi          :(1).

Remarque :

Une équation différentielle du premier ordre normalisée peut toujours s'écrire sous la forme (1).

Par exemple : s'écrira :  avec .

Parfois la fonction fne dépend que de y ; n’empêche, la fonction fdevra toujours être déclarée avecles deux variables t et y (dans cet ordre : variable puis fonction).

Par exemple :  s'écrira :

Ø   Fonction odeint

La bibliothèque scipy.integrate contient la fonction odeint, qui résout numériquement des équations différentielles. On commence donc par la charger via :

fromscipy.integrateimportodeint

L'utilisation se fait sous la forme :

odeint(f, y0,t)

 

Exemple1 :

importmatplotlib.pyplotasplt

fromscipy.integrateimportodeint

import numpy asnp

f = lambdax,y: -y #équivalent à def f(x,y) : return -y

a=0

b=5

t=np.linspace(a,b,101)

y=odeint(f,1,t)

print(t,y)

plt.plot(t,y)

plt.grid()

plt.show()

 

Exemple 2 :

Le code ci-dessous permet de résoudre l’équation différentielle du premier ordre suivante :

fromscipyimport*

fromscipy.integrateimportodeint #Pour résoudre l’équation différentielle

importmatplotlib.pyplotasplt #Permet de tracer des graphes

defderiv (y , x ) :

       return y*sin(y) + sin (x)

#Choix de l’intervalle d’intégration

x0 = 0

xmax = 20

npoints = 1000

x = linspace( x0 , xmax , npoints )

#Condition initiale

y0 = 2 # y(x0) = y0

solution = odeint( deriv , y0 , x)

y = solution [ : , 0 ]

plt.plot (x , y)

plt.show ()

 

 

 

 

 

 

 

I.        Méthode d'Euler

Ø  Lorsqu'il n'est pas possible d'obtenir une solution explicite sous forme de fonctions usuelles, on détermine une solution approchée (numérique). Il existe plusieurs méthodes permettant de réaliser ceci. L'une d'entre elles est la méthode d'Euler qui sera étudiée ici.

Ø  On veut déterminer une solution approchée de l’équation différentielle :

Où : est une fonction continue sur l’intervalle.

Avec une condition initiale :

 

·         On considère une subdivision régulière  de de, on a donc :

Si h est suffisamment petit on a :

·         Les approximations sont alors calculées de proche en proche par :

Voici une implémentation de la méthode Euler en python

import numpy asnp

defeuler(a,b,f,y0,n):

            '''integration de y'(t)=f(t,y(t)) par la méthode d'Euler sur un intervalle [a,b] avecn points et la condition initiale y(a)=y0 (a,y0)'''

            x=np.linspace(a,b,n+1)

            y=np.zeros(n+1) # tableau de n+1 éléments

            y[0]=y0

            h=(b-a)/n

            for k inrange(n):

                        y[k+1]=y[k]+h*f(x[k],y[k])

            return(x,y)

Illustrons l'utilisation de la fonction Euler pour trouver une solution approchée de l'équation :

y'=-y intégrée sur [0,5] avec la condition initiale y(0)=1.

importmatplotlib.pyplotasplt

f = lambdax,y:-y           #équivalent à def f(x,y) : return -y

(x,y)=euler(0,5,f,1,100)

print(x,y)

plt.plot(x,y)

plt.grid()

plt.show()

 

 

 

 

 

 

 

2.    Résolution d’équations différentielles du deuxième ordre

Exemple :

On attache une bille au pendule. En l’absence de frottements, les oscillations du pendule vérifient l’équation différentielle :          (2)

On prendra dans toute la suite ω0 = 3 rad · s−1.

Dans le cas des petits angles , on a , et l’on retrouve l’équation différentielle d’un oscillateur harmonique : (3)

L’équation 2 n’a pas de solutions analytiques, on se propose donc de l’intégrer avec SciPy pour comparer ses solutions à celles de l’équation 3.

On prendra comme conditions initiales (t = 0) = 0,1 rad et(t = 0) = 0.

fromscipyimport*

fromscipy.integrateimportodeint

omega0 = 3#rad/s

defderiv (TH, t ) :

# prend comme arguments :

# TH : une liste contenant theta et thetap

# t : un instant donné

# retourne la liste : [thetap ,-omega**2*theta]

            theta= TH[ 0 ]

            thetap= TH[ 1 ]

       return [thetap,-omega0**2*theta]

#définition de l’intervalle de temps

t0 = 0

tmax = 15

npoints = 1000

t = linspace( t0 , tmax , npoints )

#Définition des conditions initiales

theta0 = .1 #rad

thetap0 = 0#rad/s

ci = [ theta0 , thetap0 ]

solution = odeint( deriv , ci , t )

#la résolution proprement dite

theta = solution [ : , 0 ]

thetap = solution [ : , 1 ]

plt.plot(t ,theta)

plt.show ()