IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Runge Kutta 4


Sujet :

Langage C++

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Runge Kutta 4
    Bonjour!
    Je cherche à faire fonctionner runge kutta 4 sous c++ pour modéliser la trajectoire d'une planète autour du soleil. J'ai beau rentrer correctement le code à base des équations de Newton, impossible de trouver des résultats convenables.. Mon x ne bouge pas de position tandis que y diverge complètement...
    J'ai tout essayé, du coup j'appelle à l'aide maintenant. Voici mon code , merci à tous ceux qui prendront le temps de m'aider !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    double f(double x,double y){
        double G=6.674*pow(10,-11);
        double Ms=1.989*pow(10,30);
        double Aso=13.34*pow(10,19);
        double F;
        double r=sqrt(x*x+y*y);
        F=-((Aso*x)/(r*r*r));
        return F;
     
    }    
    double g(double x,double y){
        double G=6.674*pow(10,-11);
        double Ms=1.989*pow(10,30);
        double Aso=13.34*pow(10,19);
        double r=sqrt(x*x+y*y);
        double g;
        g=-((Aso*y)/(r*r*r));
        return g;
    }    
     
     
     
    double RK4_PLANETE(double x, double y, double u, double v, double n){
     
        double h=0.1; 
       double kx1,kx2,kx3,kx4,A,B; 
       double ky1,ky2,ky3,ky4; 
       double ku1,ku2,ku3,ku4; 
       double kv1,kv2,kv3,kv4;
       ofstream traj("traj.txt");
     
        for (float t=0 ; t<1 ; t+=h){
     
        kx1=u*h;
        ky1=v*h;
        ku1=f(x,y)*h;
        kv1=g(x,y)*h;
     
        kx2=(u+ku1/2.0)*h;
        ky2=(v+kv1/2.0)*h;
        ku2=(f(x+kx1/2.0,y+ky1/2.0))*h;
        kv2=(g(x+kx1/2.0,y+ky1/2.0))*h;
     
        kx3=(u+ku2/2.0)*h;
        ky3=(v+kv2/2.0)*h;
        ku3=(f(x+kx2/2.0,y+ky2/2))*h;
        kv3=(g(x+kx2/2.0,y+ky2/2))*h;
     
        kx4=(u+ku3)*h;
        ky4=(v+kv3)*h;
        ku4=(f(x+kx3,y+ky3))*h;
        ku4=(g(x+kx3,y+ky3))*h;
     
        x=x+((1/6.0)*(kx1+2*kx2+2*kx3+kx4));
        y=y+((1/6.0)*(ky1+ky2*2+ky3*2+ky4));
        u=u+((1/6.0)*(ku1+ku2*2+ku3*2+ku4));
        v=v+((1/6.0)*(kv1+kv2*2+kv3*2+kv4));
     
        traj<<x<<"  "<<y<<endl;     
     
        }; 
     
    }

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut


    Déjà, ta manière d'encoder tes constantes est assez particulière : tu pourrais écrire tout simplement 6.674e-11, par exemple. Aussi, au lieu de définir une variable g, d'y assigner une valeur, puis de la retourner, tu pourrais simplement retourner -((Aso*y)/(r*r*r)).

    As-tu vérifié le résultat de f et g ? (D'ailleurs, que sont f et g, très exactement ?)
    Ton pas h est-il assez petit ?
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour, Oui je conçois mais c'est pour que je sache à peu près ce que je fais !

    f et g correspondent aux valeurs de la Force de gravitation pour résoudre l'équation de Newton .

    Pour h j'ai tout essayé, ca ne change rien ..

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Nom : Capture d’écran (49).png
Affichages : 807
Taille : 92,5 Ko

    Voici la figure que j'obtiens, quand je code avec un pas de1 pour 365 itérations..

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mai 2016
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 313
    Points : 1 237
    Points
    1 237
    Par défaut
    Je n'ai pas vérifié le détail des formules utilisées, juste qu'elles ont l'air bien symétriques en x, y, il ne parait pas y avoir de fautes de frappe à ce niveau.
    Ca peut être un problème de précision numérique.
    Par exemple, lorsque tu calcules kx2 = (u + ku1/2)*h, que vaut le rapport ku1/u ?
    Si ce rapport est inférieur à 1e-15, le bruit numérique dû aux erreurs d'arrondis devient dominant, avec la précision du type 'double'.
    Tu pourrais ajouter un test et afficher une alerte si cela se produit.
    Si au contraire il est trop grand, les dérivées sont peut-être mal calculées.
    Quelles sont les conditions de convergence de la méthode et comment s'accumulent les erreurs ?
    Par ailleurs, est-ce que les coordonnées cartésiennes sont bien le meilleur choix et est-ce que ça ne marcherait pas mieux en polaire ?
    (pour une trajectoire de planète, r est une fonction lentement variable, et theta une fonction à dérivée lentement variable, ce qui est plutôt intéressant pour une résolution numérique stable d'équation différentielle).

    Ce sont plus des questions d'algorithmique que de langage de programmation...

Discussions similaires

  1. Runge Kutta d'ordre 4
    Par Physicien dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 08/12/2006, 16h50
  2. probleme de divergence avec runge kutta d'ordre 2 pour un pendule simple
    Par fab13 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 25/11/2006, 20h19
  3. Runge-Kutta à une variable?
    Par PadawanDuDelphi dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 22/11/2006, 09h20
  4. probleme avec runge kutta dimension 4
    Par fab13 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 14/11/2006, 21h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo