Dans le cadre de mon TIPE sur l'équation de Van der Pol, je souhaiterais mettre en évidence les limites de la méthode d'Euler pour tracer le portrait de phase (par exemple) , donc j'ai écrit en python les fonctions effectuant le tracé avec la méthode d'Euler et avec la méthode de Runge-Kutta d'ordre 2. Seulement, j'ai un problème j'ai l'impression que la méthode d'Euler renvoie le bon résultat, mais que la méthode de RK2 diverge sur l'équation de l'oscillateur harmonique ! Et pour l'équation de Van der Pol, les 2 portraits de phases sont quasiment les mêmes et je n'arrive pas à mettre en évidence la différence entre les 2 méthodes...
Je joins le code au cas où :
Code : Tout sélectionner
import numpy as np
import matplotlib.pyplot as plt
def F(x,y):
return y
def G(x,y):
eps=1
return (((eps)-(x**2))*y)-x
def rk2(F,G,n,t_lim,x0,y0):
t=0
deltaT = t_lim/n
x = x0
y = y0
liste_x = [x0]
liste_y = [y0]
temps = [t]
while t<t_lim :
t = t + deltaT
temps.append(t)
inter1_x = x + (deltaT/2)*F(x,y)
inter1_y = y + (deltaT/2)*G(x,y)
inter2_x = F(inter1_x,inter1_y)
inter2_y = G(inter1_x,inter1_y)
x = x+deltaT*inter2_x
y = y+deltaT*inter2_y
liste_x.append(x)
liste_y.append(y)
return temps, liste_x, liste_y
def euler(F,G,n,t_lim,x0,y0):
t=0
deltaT = t_lim/n
x = x0
y= y0
liste_x = [x0]
liste_y = [y0]
temps = [t]
while t<t_lim :
t = t + deltaT
temps.append(t)
x = x+deltaT*F(x,y)
y = y+deltaT*G(x,y)
liste_x.append(x)
liste_y.append(y)
return temps, liste_x, liste_y
temps,liste_x_rk2,liste_y_rk2 = rk2(F,G,500,90,0,1)
tps,liste_x_euler,liste_y_euler = euler(F,G,500,90,0,1)
plt.figure(1)
plt.plot(liste_x_euler, liste_y_euler,label = "Euler")
plt.legend()
plt.plot(liste_x_rk2, liste_y_rk2, label = "RK2")
plt.legend()
plt.show()
Merci beaucoup !