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

  1. #1
    Nouveau Candidat au Club
    Simulation orbite autour de 2 astres - Erreur dimensions lignes/colonnes incohérentes
    Bonjour,
    je suis actuellement sur un projet qui consiste à simuler et tracer en 3d la trajectoire d'un objet(vaisseau,comète,...) dans le système solaire. J'avais déjà fait le script lorsque l'objet n'était attiré que par un seul astre et ça marche très bien, aucun problème.
    Mais je veux simuler le mouvement de l'objet dans le système solaire il faut donc que je rajoute toutes les autres planètes. J'ai donc rajouté la Terre(initialement il n'y avait que le soleil placé sur l'origine du repère). Et j'ai donc refait les équations mais cette fois avec 2 astres, et on peut donc voir qu'il y a un 2ème membre qui apparaît dans l'équation différentielle (j'ai fait le calcul avec les coordonnées cartésiennes) :

    avec ici r=r1:

    et:

    Et donc les M sont les masses des astres, les r les distances entre le centre de l'astre i et l'objet.
    x,y,z sont les coordonnées de l'objet dans le repère dont le centre du soleil est l'origine. Et x2,y2,z2 sont les coordonnées de la terre dans ce même repère.
    Et N est le nombre d'astre donc ici N=2.
    Et donc s'il n'y a qu'un seul astre, B est la matrice nulle.
    Donc lorsqu'il n'y avait qu'un astre, B n'était pas présent et il n'y avait aucun problème.

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    clear
    clc
     
    G=6.67*10^-11;
    //MASSES (kg)
    M_Terre=5.98*10^24;//Masse de la Terre (kg)
    M_Soleil=1.989*10^30;
    //RAYONS (m)
    R_Terre=6.371*10^6;//Rayon de la Terre (en m)
    R_Soleil=696340*10^3;
    //COORDONNEES DE CHAQUE ASTRE (sous la forme (x,y,z))
    //Soleil c'est (0,0,0)
    coordTerre=[149597870*10^3 0 0];//Distance terre-soleil puisque l'origine du repère est le soleil
     
    function u_point=f(t,u)//vecteur u_point régissant les equations du mouvement
        //Norme des vecteurs r avec pour origine chaque astre
        r=sqrt(u(1)^2+u(2)^2+u(3)^2);//Norme r ayant pour origine l'origine du repère donc le premier astre(soleil)
        r2=sqrt((u(1)-coordTerre(1))^2+(u(2)-coordTerre(2))^2+(u(3)-coordTerre(3))^2);//r2 en partant de la terre
     
        M=[M_Soleil M_Terre];//Vecteur des masses
        r_cube=[r^3 r2^3];//Les rayons puissance 3
     
        vect_somme=M./r_cube;
     
        K=-G*sum(vect_somme);
     
        if r<R_Soleil then
            u_point=[0;0;0;0;0;0];
        elseif r2<R_Terre then
            u_point=[0;0;0;0;0;0];
        else
            A=[0 0 0 1 0 0;0 0 0 0 1 0;0 0 0 0 0 1;K 0 0 0 0 0;0 K 0 0 0 0;0 0 K 0 0 0];//matrice A de l'équation u_point=A*u+B
            B=[0;0;0;G*M_Terre*coordTerre(1)/r2^3;G*M_Terre*coordTerre(2)/r2^3;G*M_Terre*coordTerre(3)/r2^3];//Ici c'est une somme mais elle n'est pas écrite car il n'y a que le soleil et la terre, il faudra faire la somme si il y a un 3eme astre
     
            u_point=A*u+B;//Utiliser une autre fonction à cause de B
        end
    endfunction
     
    function [x,y,z]=sphere(phi,teta)//calcul de la sphere
        x=cos(phi).*cos(teta);
        y=cos(phi).*sin(teta);
        z=sin(phi);
    endfunction
     
    function f=afficherAstre(origine,rayon)
        //origine est un vecteur [x y z] representant les coordonnées de l'astre
        //rayon est une valeur donnant le rayon de l'astre
     
        [x,y,z]=eval3dp(sphere,linspace(-%pi/2,%pi/2,40),linspace(0,2*%pi,20));//calcul des facettes de la sphere
        //on va positionner et dimensionner notre astre
        [nbLignes_x,nbColonnes_x]=size(x);
        x=x+origine(1)*ones(nbLignes_x,nbColonnes_x);//on positionne l'origine de la sphere
        [nbLignes_y,nbColonnes_y]=size(y);
        y=y+origine(1)*ones(nbLignes_y,nbColonnes_y);//on positionne l'origine de la sphere
        [nbLignes_z,nbColonnes_z]=size(z);
        z=z+origine(1)*ones(nbLignes_z,nbColonnes_z);//on positionne l'origine de la sphere
        //on dimensionne notre astre pour avoir le bon rayon
        x=x.*rayon;
        y=y.*rayon;
        z=z.*rayon;
     
        clf();
        plot3d(x,y,z);
    endfunction
     
    function u=rotation(distance,v0,hours)
        //distance est la distance entre l'objet et l'astre (en km)
        //v0 est la vitesse initiale (m/s)
        //hours est le temps de la simulation en heures
        u0=[R_Soleil+distance; 0; 0;v0/sqrt(3);v0/sqrt(3);v0/sqrt(3)];//vecteur v0 initial de la forme [x y z x_point y_point z_point]
        distance=distance*1000;
        t=linspace(0,3600*hours,2000);
        u=ode(u0,0,t,f);//resolution du systeme differentiel
     
        afficherAstre([0 0 0],R_Soleil);//affichage de l'astre
     
        //tracer la trajectoire
        comet3d(u(1,<img src="images/smilies/icon_smile.gif" border="0" alt="" title=":)" class="inlineimg" />,u(2,<img src="images/smilies/icon_smile.gif" border="0" alt="" title=":)" class="inlineimg" />,u(3,<img src="images/smilies/icon_smile.gif" border="0" alt="" title=":)" class="inlineimg" />,"colors",3);
    endfunction
     
    //DEBUT DU PROGRAMME
     
    //Parametres initiaux
    altitude=10^10;//en km sans compter le rayon du soleil donc c'est bien l'altitude
    vitesse=20000;
    duree=1000;
    rotation(altitude,vitesse,duree);

    Et voilà l'erreur:

    Alors je ne sais pas pourquoi ça fait une erreur, si vous avez une idée, je suis preneur.
    Merci beaucoup.

  2. #2
    Rédacteur/Modérateur

    Ajoute la commande printf('%d %d - %d %d - %d %d\n', size(u), size(A), size(B)) juste avant la ligne u_point=A*u+B;//Utiliser une autre fonction à cause de B et tu sauras pourquoi l'erreur apparait.
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et Arduino)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Nouveau Candidat au Club
    Merci pour la réponse, c'est bon j'ai modifié mon code mais il se passe quelque chose de bizarre :

    Le nombre de colonnes de u change d'un coup.

###raw>template_hook.ano_emploi###