0% ont trouvé ce document utile (0 vote)
82 vues6 pages

Méthode d'Euler pour équations diff.

Ce document présente plusieurs exercices sur la résolution numérique d'équations différentielles par la méthode d'Euler. Les exercices proposent de programmer la méthode d'Euler pour résoudre différentes équations différentielles du premier et second ordre, et d'étudier la convergence en fonction du pas h.

Transféré par

Happiness Itoua
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
82 vues6 pages

Méthode d'Euler pour équations diff.

Ce document présente plusieurs exercices sur la résolution numérique d'équations différentielles par la méthode d'Euler. Les exercices proposent de programmer la méthode d'Euler pour résoudre différentes équations différentielles du premier et second ordre, et d'étudier la convergence en fonction du pas h.

Transféré par

Happiness Itoua
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

[Link]

fr

Informatique en CPGE (2015-2016)


Corrigé TP 10 : résolution numérique
d’équations différentielles ; méthode d’Euler

Exercice 1
Objectif : programmer la méthode d’Euler pour résoudre l’équation différentielle y 0 = y sur l’inter-
valle [0; 4] avec y(0) = 1.

1.

def euler(a,b,y0,h,f):
x=a
y=y0
liste_x=[a]
liste_y=[y0]
while x+h<=b:
y+=h*f(x,y)
liste_y.append(y)
x+=h
liste_x.append(x)
return liste_x,liste_y

def f(x,y):
return y

2. On complète le programme avec print(euler(0,4,1,1,f)). Le résultat doit être : ([0,


1, 2, 3, 4], [1, 2, 4, 8, 16]).

3.

# calcul de l’erreur
e=0
h=0.1
x,y=euler(0,4,1,h,f)
for i in range(len(x)):
if abs(exp(x[i])-y[i])>e:
e=abs(exp(x[i])-y[i])
print("Pour h = ",h,"l’erreur est ",e)
# ou bien
x,y=euler(0,4,1,h,f)
print(x[-1],y[-1],exp(4)-y[-1]) # l’erreur max est sur le dernier terme

Pour la dernière valeur des deux listes, il y a un problème d’arrondi, donc le x final n’est pas toujours
égal à 4. Pour remédier à ce problème, on peut modifier le test "while" dans la fonction euler en écrivant :
while round(x+h,6)<=b:.

4. Afin que l’erreur maximale soit de l’ordre de 10−2 , on prend h = 0.0001.

Serge Bays 1 Lycée Les Eucalyptus


[Link]

5. Représentations graphiques.

import [Link] as plt

# écriture solution exacte


x=[i*0.1 for i in range(41)]
y=[exp(u) for u in x]
[Link](x,y)

# écriture sol approchée h=1


x,y=euler(0,4,1,1,f)
[Link](x,y)
# écriture sol approchée h=0.5
x,y=euler(0,4,1,0.5,f)
[Link](x,y)
# écriture sol approchée h=0.2
x,y=euler(0,4,1,0.2,f)
[Link](x,y)
# écriture sol approchée h=0.1
x,y=euler(0,4,1,0.1,f)
[Link](x,y)

[Link]()

Exercice 2
On reprend le programme 1 avec les modifications nécessaires sur l’écriture de la fonction f, l’écriture
de la solution exacte et l’appel de la fonction euler.

from math import exp,cos,sin


import [Link] as plt

def f(x,y):
return cos(2*x)-y

# solution exacte
def solex(x):
return 3.8*exp(-x)+0.2*cos(2*x)+0.4*sin(2*x)
xex=[i*0.01 for i in range(1201)]
yex=[solex(u) for u in xex]
[Link](xex,yex,’r’)

# solution approchée h=0.1


x,y=euler(0,12,4,0.1,f)
[Link](x,y)

[Link]()

Exercice 3
Objectif : résoudre l’équation différentielle y 0 = −y avec y(0) = 1 sur l’intervalle [0; 30].
1. On reprend le programme de l’exercice 1. On modifie la fonction f (x, y) = −y et les appels de la
fonction euler.

Serge Bays 2 Lycée Les Eucalyptus


[Link]

import [Link] as plt

def euler(a,y0,b,h,f):
x=a
y=y0
liste_x=[a]
liste_y=[y0]
while x+h<=b:
y+=h*f(x,y)
liste_y.append(y)
x+=h
liste_x.append(x)
return liste_x,liste_y

def f(x,y):
return -y

# solution approchée h=3


x,y=euler(0,1,30,3,f)
[Link](x,y)

# solution approchée h=2.5


x,y=euler(0,1,30,2.5,f)
[Link](x,y)

[Link]()

2. Stabilité pour h ≤ 2.

# solution approchée h=1.5


x,y=euler(0,1,30,1.5,f)
[Link](x,y)

# solution approchée h=2


x,y=euler(0,1,30,2,f)
[Link](x,y)

[Link]()

3. L’erreur de discrétisation e est inférieure à 10−1 pour h = 0.4. (On utilise le code de l’exercice 1
en modifiant la valeur exacte.

# calcul de l’erreur
e=0
h=0.4
x,y=euler(0,1,30,h,f)
for i in range(len(x)):
if abs(exp(-x[i])-y[i])>e:
e=abs(exp(-x[i])-y[i])
print("Pour h = ",h,"l’erreur est ",e)

Serge Bays 3 Lycée Les Eucalyptus


[Link]

Exercice 4
Objectif : résoudre l’équation différentielle du second ordre y 00 + y = 0 pour x ∈ [0; 10] avec les
conditions initiales y(0) = 0 et y 0 (0) = 1.

On reprend les éléments du programme de l’exercice 1 avec quelques modifications.


1. Modification de la fonction f .

def f(x,y): # y est un couple


return (y[1],-y[0])

2. Modification de la fonction euler.

def euler(a,b,y0,h,f):
x=a
y=y0
liste_x=[a]
liste_y=[y0]
while x+h<=b:
y=(y[0]+h*(f(x,y)[0]),y[1]+h*(f(x,y)[1])) # la difficulté
liste_y.append(y)
x+=h
liste_x.append(x)
return liste_x,liste_y

3. L’appel de la fonction.

# solution approchée h=0.01


x,y=euler(0,10,(0,1),0.01,f)

4.

from math import sin # pour la sol exacte

import [Link] as plt

u=[y[i][0] for i in range(len(y))]

[Link](x,u)

# solution exacte y(x)=sin(x)


x=[i*0.01 for i in range(1001)]
y=[sin(u) for u in x]
[Link](x,y)

[Link]()

Serge Bays 4 Lycée Les Eucalyptus


[Link]

Exercice 5
La définition de la fonction euler s’écrit comme dans l’exercice 1. On modifie la définition de la
fonction f qui renvoie un objet de type array et l’appel de la fonction euler :

# y’’+y=0 soit (y,y’)’=(y’,-y)=F(y,y’)

from math import sin

from numpy import array

def f(x,y):
return array((y[1],-y[0])) # utilisation d’un array
def euler(a,b,y0,h,f):
x=a
y=y0
liste_x=[a]
liste_y=[y0]
while x+h<=b:
y=y+h*f(x,y) # plus aucun problème de calcul
liste_y.append(y)
x+=h
liste_x.append(x)
return (liste_x,liste_y)

x,y=euler(0,10,array((0,1)),0.01,f)

u=[y[i][0] for i in range(len(y))]

[Link](x,u)

[Link]()

Exercice 6
Objectif : l’équation θ00 = −k1 sin θ − k2 θ0 .

# y’’= -k1 sin(y) - k2 y’ pendule amorti (si k2=0, pendule simple)


# soit (y,y’)’=(y’,-k1 sin(y)- k2 y)=F(y,y’)

from math import sin,pi

from numpy import array

def f(x,y):
return array((y[1],-5*sin(y[0])-0.5*y[1])) # les valeurs de k1 et k2

def euler(a,b,y0,h,f):
x=a
y=y0
liste_x=[a]
liste_y=[y0]
while x+h<=b:
y=y+h*f(x,y)
liste_y.append(y)
x+=h

Serge Bays 5 Lycée Les Eucalyptus


[Link]

liste_x.append(x)
return (liste_x,liste_y)

# solution approchée h=0.01


x,y=euler(0,20,array((pi/6,0)),0.01,f)
for i in range(len(x)):
[Link](str(x[i])+’\t’+str(y[i][0])+’\n’)
[Link](str(y[i][0])+’\t’+str(y[i][1])+’\n’)

u=[y[i][0] for i in range(len(y))]


v=[y[i][1] for i in range(len(y))]

[Link](x,u)
[Link](u,v)

[Link]()

Exercice 7
Pour une équation du type x0 (t) = f (x(t), t), on utilise la fonction odeint de [Link].

from math import sin, pi


import numpy as np
import [Link] as plt
import [Link] as integ

def f(u,t):
return [u[1],-5*sin(u[0])-0.5*u[1]]

t=[Link](0,20,num=400)
sol=[Link](f,[pi/6,0],t)

[Link](2,1,1)
[Link]()
[Link](t,sol[:,0]) # angle fonction de t
[Link](2,1,2)
[Link]()
[Link](sol[:,0],sol[:,1]) #diagramme de phase
[Link]()

Serge Bays 6 Lycée Les Eucalyptus

Vous aimerez peut-être aussi