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

MATLAB Discussion :

Simulation du mouvement des planètes sous l'effet de la gravitation


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 22
    Points
    22
    Par défaut Simulation du mouvement des planètes sous l'effet de la gravitation
    Bonjour.

    J'ai voulu essayer de faire un programme qui simule le mouvement de planètes sous l'effet de la gravitation. Voici mon programme:

    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
    n=5;
    mass=1;
    speed=0;
    scale=3000;
    distance=1;
    time=200;
    p=0.001;
    G=1;
     
    x=distance*(2*rand(1,n)-1);
    y=distance*(2*rand(1,n)-1);
    m=mass*rand(1,n);
    vx=speed*(2*rand(1,n)-1);
    vy=speed*(2*rand(1,n)-1);
    fx=zeros(1,n);
    fy=zeros(1,n);
     
    for t=1:time
     
    for a=1:n
     
        for b=1:n
     
            if b~=a
     
               fx(a)=0;
               fy(a)=0; 
     
               fx(a)=(G*m(b)/((y(b)-y(a))^2+(x(b)-x(a))^2))*((x(b)-x(a))/sqrt((x(b)-x(a))^2+(y(b)-y(a))^2));
               fy(a)=(G*m(b)/((y(b)-y(a))^2+(x(b)-x(a))^2))*((y(b)-y(a))/sqrt((x(b)-x(a))^2+(y(b)-y(a))^2));
     
               vx(a)=vx(a)+fx(a);
               vy(a)=vy(a)+fy(a);
     
               x(a)=x(a)+vx(a);
               y(a)=y(a)+vy(a);
     
            end
     
        end
     
        plot(x(a),y(a),'o')
        xlim([-scale,scale])
        ylim([-scale,scale])
        hold on
     
    end
     
    pause(p)
    hold off
     
    end
    Le début ce sont juste des paramètres qu'on peut ajuster. Le paramètre 'n' c'est le nombre de corps présent dans la simulation. 'p' est le temps de pause en secondes entre deux graphiques. 'G' est la valeur de la constante de gravitation. 'fx' c'est la force selon l'axe x, 'fy' la force selon l'axe y. 'vx' c'est la vitesse selon l'axe x, 'vy' la vitesse selon l'axe y. 'x' c'est la position selon l'axe x, 'y' la position selon l'axe y. La position initiale, la vitesse initiale et la masse initiale de chacun des corps est prise au hasard.

    Après je compte mettre des valeurs proches de la réalité: G = 6,67 . 10^(-11) qui est la véritable valeur de la constante de gravitation, distance = 10^11 qui est un ordre de grandeur de distance typique dans le système solaire (en mètres), mass = 10^25 qui est un ordre de grandeur pour la masse des planètes (en kg), etc.

    Mais le problème c'est que mon programme marche pas du tout: au lieu que les corps s'attire, ils se répulsent ! Mon programme simule de l'anti-gravité !...

    Je comprends vraiment pas pourquoi. J'ai lu et re-lu mon programme pendant des heures et n'ai pas trouvé où sont les erreurs... Notez que je ne suis qu'un débutant en programmation, alors y'a peut-être juste quelque chose qui m'échappe.

    Merci d'avance pour vos réponses.

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2014
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 109
    Points : 151
    Points
    151
    Par défaut
    Première chose, tu devrais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xlim([-scale scale])
    ylim([-scale scale])
    J'ai remplacé la virgule par un espace

    Tu devrais également déclarer l'ouverture d'une figure avant la boucle for sur a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fig=figure('Name','<name>','NumberTitle','off')
    Ça te permet de mettre un nom à ta figure. C'est plus facile pour l'enregistrer par la suite.


    J'ai plusieurs question à te poser.

    1) A quoi te sers la boucle sur t? Cette variable n'intervient pas dans le calcul. Tu peux donc l'enlever.

    2) Est-ce que tu as vérifié l'allure des fonctions fx et fy. Il se peut qu'elles changent de comportement pour les paramètres que tu as choisis.

    3) Ensuite pour ce genre de calculs il est souvent recommandé d'adimensionner les variables afin qu'elles soient de l'ordre de l'unité. Il peut y avoir des problèmes engendrés par un trop grand écart de valeur entre les variables

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2015
    Messages : 25
    Points : 22
    Points
    22
    Par défaut
    Je ne comprend pas ce qu'est une "figure". Ca m'a l'air un peu compliqué. Je ne suis qu'un débutant en programation. Enfin en tout cas l'erreur ne peux pas possiblement venir de là je pense.

    La boucle sur t représente le défilement du temps. Si j'enlève cette boucle les n corps ne se déplaceraient pas dans le temps vu qu'il n'y aurait qu'un seul instant.

    J'avais tenté de regarder les valeurs des variables fx et fy, je n'ai pas vu d'erreur flagrante mais je ne peux pas garantir que les valeurs de fx et fy soient vraiment bonnes.

    J'ai encore passé une bonne heure aujourd'hui à chercher l'erreur mais je l'ai pas trouvé. Je pense que l'erreur vient soit du calcul de fx et fy (peut-être qu'on a pas le droit de projeter les forces comme ça ?), soit du calcul de vx, vy, x et y (peut-être qu'intégrer comme ça ne marche pas, mais je vois pas comment calculer la vitesse et la position alors).

  4. #4
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    une "figure" c'est le truc dans lequel se trace ton animation
    elle est créée implicitement par ton premier appel à la fonction plot, Beltharion te suggère de la créer explicitement

    mais tu as raison, cela n'a aucun rapport avec ton problème
    par contre une suggestion : pourquoi ne pas travailler directement sur des vecteurs ... c'est un peu la force de matlab
    la distance entre deux points se calcul simplement avec la fonction norm

Discussions similaires

  1. [Lazarus] Projet de simulation des mouvements de planètes
    Par beatz dans le forum Lazarus
    Réponses: 1
    Dernier message: 07/05/2010, 10h35
  2. Affichage des composants cachés sous l'effet d'une action d'un menu en Java
    Par nehlaING dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 31/03/2010, 14h06
  3. Détourner des IRQ sous Windows
    Par Blustuff dans le forum Assembleur
    Réponses: 15
    Dernier message: 06/12/2002, 10h16
  4. Réponses: 2
    Dernier message: 23/10/2002, 13h38

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