Méthodes d'Euler et Runge-Kutta 2

Messages : 0

Inscription : 24 nov. 2015 19:51

Profil de l'utilisateur : Élève de lycée

Méthodes d'Euler et Runge-Kutta 2

Message par DMIII » 10 mai 2016 12:15

Bonjour,
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...
Image
Image
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()
Est-ce que c'est normal que la méthode de RK2 diverge sur l'équation de l'oscillateur harmonique ou bien l'erreur vient-elle de mon programme?
Merci beaucoup !

Messages : 0

Inscription : 11 déc. 2015 08:24

Profil de l'utilisateur : Élève de lycée

Re: Méthodes d'Euler et Runge-Kutta 2

Message par left_shift » 10 mai 2016 14:21

À vue de nez j'ai bien l'impression que les deux méthodes sont codées correctement. Cela dit, la méthode d'Euler est connue pour ne pas être bien adaptée dans le cas des systèmes conservatifs (cf le sujet d'informatique de tronc commun de centrale de l'année dernière). Ce qui m'étonne beaucoup, c'est que la méthode d'Euler fonctionne aussi bien dans le cas de l'oscillateur harmonique. Peux-tu nous fournir les fonctions F et G que tu utilises pour modéliser l'oscillateur ?

Messages : 0

Inscription : 24 nov. 2015 19:51

Profil de l'utilisateur : Élève de lycée

Re: Méthodes d'Euler et Runge-Kutta 2

Message par DMIII » 10 mai 2016 14:25

Voici les fonctions F et G pour l'oscillateur harmonique :

Code : Tout sélectionner

def F(x,y):
    return y
def G(x,y):
    w0=1
    return (-1)*(w0*w0)*x
Ce qui m'étonne c'est que logiquement on devrait avoir un portrait de phase parfaitement circulaire pour RK2 et divergent pour Euler, et j'ai le contraire...

Messages : 0

Inscription : 11 déc. 2015 08:24

Profil de l'utilisateur : Élève de lycée

Re: Méthodes d'Euler et Runge-Kutta 2

Message par left_shift » 10 mai 2016 14:38

En essayant avec ces fonctions F et G, j'ai deux ellipses en portrait de phase, aussi bien pour Euler que pour RK2.

Messages : 0

Inscription : 24 nov. 2015 19:51

Profil de l'utilisateur : Élève de lycée

Re: Méthodes d'Euler et Runge-Kutta 2

Message par DMIII » 10 mai 2016 17:33

En effet, j'ai oublié de préciser un détail : les figures que j'ai obtenues en haut sont celles pour n = 200 (nombre de points) et j'ai mis le code pour n=500. Donc en fait je voulais mettre en évidence le fait que si le nombre de points n'est pas suffisant, la méthode d'Euler diverge et RK2 converge, et j'arrive à l'opposé :?

Messages : 9679

Inscription : 30 juil. 2008 16:59

Profil de l'utilisateur : Élève de lycée

Re: Méthodes d'Euler et Runge-Kutta 2

Message par fakbill » 10 mai 2016 18:19

RK2 va être exact uniquement pour si les solutions sont des polynôme de degré 2 et ca c'est sans compter les erreur d'arrondi mais uniquement les erreurs de méthode.

Ton équation a des solutions lisses et gentilles donc Euler peut donner un résultat """correct""" pendant assez longtemps....reste À définir "correct".
Rk2 avec le même pas va être plus """précise""".

Tout cela est bien sûr à rapprocher du fait que toute fonction gentille est localement un polynome.

je n'ai pas lu tout ton code mais temps.append(t) est une HORREUR. Pourquoi garder le temps dans une liste??? on s'en tape et même si on ne s'en tape pas, on ne construit surtout pas cette list avec des .append
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

Messages : 0

Inscription : 24 nov. 2015 19:51

Profil de l'utilisateur : Élève de lycée

Re: Méthodes d'Euler et Runge-Kutta 2

Message par DMIII » 10 mai 2016 18:44

fakbill a écrit :RK2 va être exact uniquement pour si les solutions sont des polynôme de degré 2 et ca c'est sans compter les erreur d'arrondi mais uniquement les erreurs de méthode.

Ton équation a des solutions lisses et gentilles donc Euler peut donner un résultat """correct""" pendant assez longtemps....reste À définir "correct".
Rk2 avec le même pas va être plus """précise""".
Dans ce cas je ne comprends justement pas pourquoi RK2 part en sucette sur le portrait de phase de l'oscillateur harmonique alors qu'Euler donne la bonne figure...
je n'ai pas lu tout ton code mais temps.append(t) est une HORREUR. Pourquoi garder le temps dans une liste??? on s'en tape et même si on ne s'en tape pas, on ne construit surtout pas cette list avec des .append
J'ai besoin d'une liste contenant le temps pour tracer les solutions x(t) en fonction de t.
Quel problème est-ce que ça pose de créer cette liste avec .append ? J'aurais pu utiliser linspace mais il me semble qu'au final ça revient au même :?:

abouMPSI

Re: Méthodes d'Euler et Runge-Kutta 2

Message par abouMPSI » 10 mai 2016 18:58

peut-être les erreurs d'arrondis ?
(un sujet très important dont fakbill parle souvent)

Messages : 0

Inscription : 24 nov. 2015 19:51

Profil de l'utilisateur : Élève de lycée

Re: Méthodes d'Euler et Runge-Kutta 2

Message par DMIII » 10 mai 2016 19:05

Donc en fait je n'arriverais jamais à mettre en évidence la meilleure précision de RK2 par rapport à Euler puisque c'est RK2 qui déconne le premier quand n diminue :x :x

abouMPSI

Re: Méthodes d'Euler et Runge-Kutta 2

Message par abouMPSI » 10 mai 2016 19:12

peut-être que les messages de fakbill peuvent aider ? (je connais pas, mais ça te coûte quoi d'étudier cet aspect des choses...)

IEEE754
http://forum.prepas.org/search.php?st=0 ... ds=IEEE754*

Répondre