[C] programme sur rotation d'un satellite autour de la Terre

programme sur rotation d'un satellite autour de la Terre [C] - C - Programmation

Marsh Posté le 20-05-2006 à 22:40:34    

Salut à tous. J'aurais simplement eu besoin d'un petit coup de main pour mon programme qui compile bien mais qui ne fonctionne pas comme je le souhaiterais.
 
En fait, je veux juste tracer la trajectoire d'un satellite à partir d'une vitesse et d'une position de départ. J'utilise les coordonnées cartésiennes.
 
Je me demande si l'erreur ne provient pas des fonctions vitessex-vitessey: est-ce que si dans une fonction par exemple je mets vx=vx+1, à l'appel de cette fonction dans une boucle "for" le vx de droite (donc le vx à l'itération précédente) va  pouvoir être utilisé? Je ne sais pas si vous voyez ce que je veux dire, allez voir les fonctions vitessex-vitessey pour mieux comprendre. Merci :)
 
Voici le code:  
 

Code :
  1. [EDIT] erreure de ma part, voir plus bas le bon code que j'ai reposté

Message cité 1 fois
Message édité par PoLuxR le 20-05-2006 à 23:08:08

---------------
Bandit 400
Reply

Marsh Posté le 20-05-2006 à 22:40:34   

Reply

Marsh Posté le 20-05-2006 à 22:47:50    

PoLuxR a écrit :

Salut à tous. J'aurais simplement eu besoin d'un petit coup de main pour mon programme qui compile bien mais qui ne fonctionne pas comme je le souhaiterais.


Tu ne respectes pas les regles de codage du langage C. Le comportement est indéfni.


Compiling: main.c
main.c: In function `main_':
main.c:27: error: implicit declaration of function `vitessex'
main.c:27: warning: nested extern declaration of `vitessex'
main.c:27: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:27: error: implicit declaration of function `accelerationx'
main.c:27: warning: nested extern declaration of `accelerationx'
main.c:29: error: implicit declaration of function `vitessey'
main.c:29: warning: nested extern declaration of `vitessey'
main.c:29: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:29: error: implicit declaration of function `accelerationy'
main.c:29: warning: nested extern declaration of `accelerationy'
main.c: At top level:
main.c:37: warning: declaration of 'y0' shadows a global declaration
C:/Program Files/CodeBlocks/include/math.h:251: warning: shadowed declaration is here
main.c:37: warning: no previous prototype for 'vitessex'
main.c: In function `vitessex':
main.c:39: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:39: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c: At top level:
main.c:44: warning: declaration of 'y0' shadows a global declaration
C:/Program Files/CodeBlocks/include/math.h:251: warning: shadowed declaration is here
main.c:44: warning: no previous prototype for 'vitessey'
main.c: In function `vitessey':
main.c:46: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:46: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c: At top level:
main.c:52: warning: declaration of 'y0' shadows a global declaration
C:/Program Files/CodeBlocks/include/math.h:251: warning: shadowed declaration is here
main.c:52: warning: no previous prototype for 'accelerationx'
main.c: In function `accelerationx':
main.c:55: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:55: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c: At top level:
main.c:61: warning: declaration of 'y0' shadows a global declaration
C:/Program Files/CodeBlocks/include/math.h:251: warning: shadowed declaration is here
main.c:61: warning: no previous prototype for 'accelerationy'
main.c: In function `accelerationy':
main.c:64: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:64: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
Process terminated with status 1 (0 minutes, 0 seconds)
4 errors, 26 warnings


Le plus simple, pour commencer, est de suivre la regle 'définir avant d'utiliser... (petit coup de réindentation au passage...)

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #define G 6.67e-11
  5. #define M 5.9736e24
  6. double dt = 1; //déclaration du pas temporel
  7. int vitessex(double x0, double y0, double vxp){        //fonction vitesse selon x (vxp=vx précédent)
  8.    double vx0;
  9.    vx0 = vxp + dt * ( -(G * M * x0) / (pow((pow(x0, 2) + pow(y0, 2)), 1.5)));    //vx0=vx0+dt*ax0
  10.    return (vx0);
  11. }
  12. int vitessey(double x0, double y0, double vyp){        //fonction vitesse selon y (vyp = vy précédent)
  13.    double vy0;
  14.    vy0 = vyp + dt * ( -(G * M * y0) / (pow((pow(x0, 2) + pow(y0, 2)), 1.5)));    //vy0=vy0+dt*ay0
  15.    return (vy0);
  16. }
  17. int accelerationx(double x0, double y0){                    //fonction acceleration selon x
  18.    double ax0;
  19.    ax0 = -(G * M * x0) / (pow((pow(x0, 2) + pow(y0, 2)), 1.5));
  20.    return (ax0);
  21. }
  22. int accelerationy(double x0, double y0){                    //fonction acceleration selon y
  23.    double ay0;
  24.    ay0 = -(G * M * y0) / (pow((pow(x0, 2) + pow(y0, 2)), 1.5));
  25.    return (ay0);
  26. }
  27. int main(){
  28.    double x, y, vx, vy, ax, ay; //déclaration position-vitesse-acceleration
  29.    double t; //déclaration variable temporelle
  30.    x = 35784000; //position initiale du satellite (metres)
  31.    y = 0; //
  32.    vx = 0; //vitesse initiale du satellite (m/s)
  33.    vy = 2.648865e8; // perimetre/période de révolution
  34.    ax = -3.357201e-2; //acceleration initiale du satellite=-v²/r (m/s²)
  35.    ay = 0; //
  36.    FILE *PositionS = fopen("PositionS.out", "w" );
  37.    for (t = 0;t <= 86160;t = t + dt)
  38.    { //developpement limité abscisses & ordonnées
  39.       fprintf(PositionS, "%f %f\n", x, y);       //création du fichier affichant la position du satellite
  40.       x = x + dt * vitessex(x, y, vitessex(x, y)) + ((pow(dt, 2)) / 2) * accelerationx(x, y);    //calcul abscisse position
  41.       y = y + dt * vitessey(x, y) + ((pow(dt, 2)) / 2) * accelerationy(x, y); //calcul ordonnée position
  42.    }
  43.    return 0;
  44. }


Léger mieux, mai c'est pas encore ça...


Compiling: main.c
main.c:10: warning: declaration of 'y0' shadows a global declaration
C:/Program Files/CodeBlocks/include/math.h:251: warning: shadowed declaration is here
main.c:10: warning: no previous prototype for 'vitessex'
main.c: In function `vitessex':
main.c:12: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:12: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c: At top level:
main.c:17: warning: declaration of 'y0' shadows a global declaration
C:/Program Files/CodeBlocks/include/math.h:251: warning: shadowed declaration is here
main.c:17: warning: no previous prototype for 'vitessey'
main.c: In function `vitessey':
main.c:19: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:19: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c: At top level:
main.c:25: warning: declaration of 'y0' shadows a global declaration
C:/Program Files/CodeBlocks/include/math.h:251: warning: shadowed declaration is here
main.c:25: warning: no previous prototype for 'accelerationx'
main.c: In function `accelerationx':
main.c:28: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:28: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c: At top level:
main.c:34: warning: declaration of 'y0' shadows a global declaration
C:/Program Files/CodeBlocks/include/math.h:251: warning: shadowed declaration is here
main.c:34: warning: no previous prototype for 'accelerationy'
main.c: In function `accelerationy':
main.c:37: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:37: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c: In function `main_':
main.c:60: error: too few arguments to function `vitessex'
main.c:60: warning: passing arg 3 of `vitessex' as floating rather than integer due to prototype
main.c:60: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
main.c:62: error: too few arguments to function `vitessey'
main.c:62: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
Process terminated with status 1 (0 minutes, 0 seconds)
2 errors, 23 warnings


Le plus gros problème est que tu ne passes pas le bon nombre de paramètres aux fonctions vitessex() et vitessey()... Je ne sais pas comment corriger, car je ne connais pas la partie 'métier' de ton code. (Au feeling, je mets vx, vy...)
 
J'ai passé les types retournés en double (je doute fort que tu ais voulu des int !)
 
Ceci compile et fonctionne (un fichier est crée ...)

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #define G 6.67e-11
  5. #define M 5.9736e24
  6. //fonction vitesse selon x (vxp=vx précédent)
  7. static double vitessex(double x, double y, double vxp, double dt)
  8. {
  9.    double vx0;
  10.    vx0 = vxp + dt * ( -(G * M * x) / (pow((pow(x, 2.0) + pow(y, 2.0)), 1.5)));    //vx0=vx0+dt*ax0
  11.    return vx0;
  12. }
  13. //fonction vitesse selon y (vyp = vy précédent)
  14. static double vitessey(double x, double y, double vyp, double dt)
  15. {
  16.    double vy0;
  17.    vy0 = vyp + dt * ( -(G * M * y) / (pow((pow(x, 2.0) + pow(y, 2.0)), 1.5)));    //vy0=vy0+dt*ay0
  18.    return vy0;
  19. }
  20. //fonction acceleration selon x
  21. static double accelerationx(double x, double y)
  22. {
  23.    double ax0;
  24.    ax0 = -(G * M * x) / (pow((pow(x, 2.0) + pow(y, 2.0)), 1.5));
  25.    return ax0;
  26. }
  27. //fonction acceleration selon y
  28. static int accelerationy(double x, double y)
  29. {
  30.    double ay0;
  31.    ay0 = -(G * M * y) / (pow((pow(x, 2.0) + pow(y, 2.0)), 1.5));
  32.    return ay0;
  33. }
  34. int main()
  35. {
  36.    /* invariants */
  37.    double const dt = 1; //déclaration du pas temporel
  38.    double const vx = 0; //vitesse initiale du satellite (m/s)
  39.    double const vy = 2.648865e8; // perimetre/période de révolution
  40.    double const ax = -3.357201e-2; //acceleration initiale du satellite=-v²/r (m/s²)
  41.    double const ay = 0; //
  42.    /* variables */
  43.    double x = 35784000; //position initiale du satellite (metres)
  44.    double y = 0; //
  45.    double t; //déclaration variable temporelle
  46.    FILE *PositionS = fopen("PositionS.out", "w" );
  47.    if (PositionS != NULL)
  48.    {
  49.       for (t = 0;t <= 86160;t = t + dt)
  50.       {
  51.          //developpement limité abscisses & ordonnées
  52.          //création du fichier affichant la position du satellite
  53.          fprintf(PositionS, "%f %f\n", x, y);
  54.          //calcul abscisse position
  55.          x = x + dt * vitessex(x, y, vitessex(x, y, vx, dt), dt)
  56.              + ((pow(dt, 2.0)) / 2.0) * accelerationx(x, y);
  57.          //calcul ordonnée position
  58.          y = y + dt * vitessey(x, y, vy, dt) + ((pow(dt, 2.0)) / 2.0) * accelerationy(x, y);
  59.       }
  60.       fclose (PositionS) , PositionS = NULL;
  61.    }
  62.    return 0;
  63. }


Message édité par Emmanuel Delahaye le 20-05-2006 à 23:17:31

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 20-05-2006 à 23:05:58    

Ah mince! Je vous ai donné le mauvais programme, un truc faux que j'avais essayé, du coup c'était dur pour vous de bien comprendre la question!! Voici le "bon"code:
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #define G 6.67e-11
  5. #define M 5.9736e24
  6. double dt=1; //déclaration du pas temporel
  7. int main(){
  8. double x,y,vx,vy,ax,ay; //déclaration position-vitesse-acceleration
  9. double t; //déclaration variable temporelle
  10. x=35784000;//position initiale du satellite (metres)
  11. y=0; //
  12. vx=0; //vitesse initiale du satellite (m/s)
  13. vy=2.648865e8; // perimetre/période de révolution
  14. ax=-3.357201e-2; //acceleration initiale du satellite=-v²/r (m/s²)
  15. ay=0; //
  16. FILE *PositionS = fopen("PositionS.out","w" );
  17. for(t=0;t<=86160;t=t+dt){ //developpement limité abscisses & ordonnées
  18.     fprintf(PositionS,"%f %f\n",x,y);       //création du fichier affichant la position du satellite
  19.    
  20.     x=x+dt*vitessex(x,y)+((pow(dt,2))/2)*accelerationx(x,y);    //calcul abscisse position
  21.    
  22.     y=y+dt*vitessey(x,y)+((pow(dt,2))/2)*accelerationy(x,y);//calcul ordonnée position
  23.    
  24. }
  25. return 0;
  26. }
  27. int vitessex(double x0,double y0){        //fonction vitesse selon x
  28.     double vx0;
  29.     vx0=vx0+dt*(-(G*M*x0)/(pow((pow(x0,2)+pow(y0,2)),1.5)));    //vx0=vx0+dt*ax0
  30.    
  31.     return(vx0);
  32. }
  33. int vitessey(double x0,double y0){        //fonction vitesse selon y  
  34.     double vy0;
  35.     vy0=vy0+dt*(-(G*M*y0)/(pow((pow(x0,2)+pow(y0,2)),1.5)));    //vy0=vy0+dt*ay0
  36.    
  37.     return(vy0);
  38. }
  39. int accelerationx(double x0,double y0){                    //fonction acceleration selon x
  40.     double ax0;
  41.    
  42.     ax0=-(G*M*x0)/(pow((pow(x0,2)+pow(y0,2)),1.5));
  43.    
  44.     return(ax0);
  45. }
  46. int accelerationy(double x0,double y0){                    //fonction acceleration selon y
  47.     double ay0;
  48.    
  49.     ay0=-(G*M*y0)/(pow((pow(x0,2)+pow(y0,2)),1.5));
  50.    
  51.     return(ay0);
  52. }


 


---------------
Bandit 400
Reply

Marsh Posté le 20-05-2006 à 23:18:42    

PoLuxR a écrit :

Ah mince! Je vous ai donné le mauvais programme, un truc faux que j'avais essayé, du coup c'était dur pour vous de bien comprendre la question!! Voici le "bon"code:


Merci, je viens de passe 30 minutes à corriger ton ancien code... Je te laisse faire la transposition...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-05-2006 à 15:36:52    

Merci beaucoup Emmanuel. J'ai fais la transposition et j'obtiens un fichier de sortie:
35784000.000000 0.000000
-1.#QNAN0         -1.#QNAN0
-1.#QNAN0         -1.#QNAN0
-1.#QNAN0         -1.#QNAN0
etc...
 
Mais comme je l'ai dit en début de topic, mon problème n'est pas un problème de compilation, mais un problème en sortie de programme car le fichier m'affiche des valeurs fausses (surtout les ordonnées qui stagnent)! Donc si quelqu'un a une idée....  
 
Merci :)


---------------
Bandit 400
Reply

Marsh Posté le 21-05-2006 à 17:18:09    

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #define G 6.67e-11
  5. #define M 5.9736e24
  6. double dt=1; //déclaration du pas temporel
  7. int main(){
  8. double x,y,vx,vy,ax,ay; //déclaration position-vitesse-acceleration
  9. double t; //déclaration variable temporelle
  10. x=35784000;//position initiale du satellite (metres)
  11. y=0; //
  12. vx=0; //vitesse initiale du satellite (m/s)
  13. vy=2.648865e8; // perimetre/période de révolution
  14. ax=-3.357201e-2; //acceleration initiale du satellite=-v²/r (m/s²)
  15. ay=0; //
  16. FILE *PositionS = fopen("PositionS.out","w" );
  17. for(t=0;t<=86160;t=t+dt){ //developpement limité abscisses & ordonnées
  18.     fprintf(PositionS,"%f %f\n",x,y);       //création du fichier affichant la position du satellite
  19.     vx=vitessex(x,y);
  20.     ax=accelerationx(x,y);
  21.     x=x+dt*vx+((pow(dt,2))/2)*ax;    //calcul abscisse position
  22.    
  23.     vy=vitessey(x,y);
  24.     ay=accelerationy(x,y);
  25.     y=y+dt*vy+((pow(dt,2))/2)*ay;//calcul ordonnée position
  26.    
  27. }
  28. return 0;
  29. }
  30. int vitessex(double x0,double y0){        //fonction vitesse selon x
  31.     double vx0;
  32.     vx0=vx0+dt*(-(G*M*x0)/(pow((pow(x0,2)+pow(y0,2)),1.5)));    //vx0=vx0+dt*ax0
  33.    
  34.     return(vx0);
  35. }
  36. int vitessey(double x0,double y0){        //fonction vitesse selon y  
  37.     double vy0;
  38.     vy0=vy0+dt*(-(G*M*y0)/(pow((pow(x0,2)+pow(y0,2)),1.5)));    //vy0=vy0+dt*ay0
  39.    
  40.     return(vy0);
  41. }
  42. int accelerationx(double x0,double y0){                    //fonction acceleration selon x
  43.     double ax0;
  44.    
  45.     ax0=-(G*M*x0)/(pow((pow(x0,2)+pow(y0,2)),1.5));
  46.    
  47.     return(ax0);
  48. }
  49. int accelerationy(double x0,double y0){                    //fonction acceleration selon y
  50.     double ay0;
  51.    
  52.     ay0=-(G*M*y0)/(pow((pow(x0,2)+pow(y0,2)),1.5));
  53.    
  54.     return(ay0);
  55. }


---------------
Bandit 400
Reply

Marsh Posté le 21-05-2006 à 18:15:28    

PoLuxR a écrit :

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #define G 6.67e-11
  5. #define M 5.9736e24
  6. double dt=1; //déclaration du pas temporel
  7. int main(){
  8. <...>



Tu t'obstines à ne pas respecter les regles du langage. Je t'ai indiqué comment faire. Fait le ou je ne peux plus rien pour toi.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-05-2006 à 22:29:51    

PoLuxR a écrit :

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #define G 6.67e-11
  5. #define M 5.9736e24
  6. double dt=1; //déclaration du pas temporel
  7. int main(){
  8. double x,y,vx,vy,ax,ay; //déclaration position-vitesse-acceleration
  9. double t; //déclaration variable temporelle
  10. x=35784000;//position initiale du satellite (metres)
  11. y=0; //
  12. vx=0; //vitesse initiale du satellite (m/s)
  13. vy=2.648865e8; // perimetre/période de révolution
  14. ax=-3.357201e-2; //acceleration initiale du satellite=-v²/r (m/s²)
  15. ay=0; //
  16. FILE *PositionS = fopen("PositionS.out","w" );
  17. for(t=0;t<=86160;t=t+dt){ //developpement limité abscisses & ordonnées
  18.     fprintf(PositionS,"%f %f\n",x,y);       //création du fichier affichant la position du satellite
  19.     vx=vitessex(x,y);
  20.     ax=accelerationx(x,y);
  21.     x=x+dt*vx+((pow(dt,2))/2)*ax;    //calcul abscisse position
  22.    
  23.     vy=vitessey(x,y);
  24.     ay=accelerationy(x,y);
  25.     y=y+dt*vy+((pow(dt,2))/2)*ay;//calcul ordonnée position
  26.    
  27. }
  28. return 0;
  29. }
  30. int vitessex(double x0,double y0){        //fonction vitesse selon x
  31.     double vx0;
  32.     vx0=vx0+dt*(-(G*M*x0)/(pow((pow(x0,2)+pow(y0,2)),1.5)));    //vx0=vx0+dt*ax0
  33.    
  34.     return(vx0);
  35. }
  36. int vitessey(double x0,double y0){        //fonction vitesse selon y  
  37.     double vy0;
  38.     vy0=vy0+dt*(-(G*M*y0)/(pow((pow(x0,2)+pow(y0,2)),1.5)));    //vy0=vy0+dt*ay0
  39.    
  40.     return(vy0);
  41. }
  42. int accelerationx(double x0,double y0){                    //fonction acceleration selon x
  43.     double ax0;
  44.    
  45.     ax0=-(G*M*x0)/(pow((pow(x0,2)+pow(y0,2)),1.5));
  46.    
  47.     return(ax0);
  48. }
  49. int accelerationy(double x0,double y0){                    //fonction acceleration selon y
  50.     double ay0;
  51.    
  52.     ay0=-(G*M*y0)/(pow((pow(x0,2)+pow(y0,2)),1.5));
  53.    
  54.     return(ay0);
  55. }



Les fonctions "vitesseX" et "vitesseY" sont très similaires. Même remarque pour "accelerationX" et "accelerationY"
Peut-être serait-il pratique de les regrouper, quitte à y inclure un paramètre supplémentaire pour faire le choix "X" ou "Y".
Petit pb: tes fonctions de type "int" retournent des doubles...
 
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 09-06-2006 à 01:33:19    

Merci à tous pour votre aide. Finalement j'ai réussi à terminer ce programme, avec simplement une erreure à un scalaire multiplicatif près. Voici les lignes, si ça peut aider quelqu'un qui fait une recherche à l'avenir:
 

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. double GM=3.98439e8; //G en N.km².kg-², à la puissance -17 car nous sommes en km pour éviter les calculs trop gros  
  5. double dt=1; //déclaration du pas temporel
  6. double vitessex(double x0,double y0,double vx){        //fonction vitesse selon x
  7.     double vx0;
  8.     vx0=vx+dt*(-(GM*x0)/(pow((pow(x0,2)+pow(y0,2)),1.5)));    //vx0=vx0+dt*ax0
  9.    
  10.     return(vx0);
  11. }
  12. double vitessey(double x0,double y0, double vy){        //fonction vitesse selon y  
  13.     double vy0;
  14.     vy0=vy+dt*(-(GM*y0)/(pow((pow(x0,2)+pow(y0,2)),1.5)));    //vy0=vy0+dt*ay0
  15.    
  16.     return(vy0);
  17. }
  18. double accelerationx(double x0,double y0){                    //fonction acceleration selon x
  19.     double ax0;
  20.    
  21.     ax0=-(GM*x0)/(pow((pow(x0,2)+pow(y0,2)),1.5)); //ax0=(-GM*x0)/((x²+y²)^1.5)
  22.    
  23.     return(ax0);
  24. }
  25. double accelerationy(double x0,double y0){                    //fonction acceleration selon y
  26.     double ay0;
  27.    
  28.     ay0=-(GM*y0)/(pow((pow(x0,2)+pow(y0,2)),1.5)); //ay0=(-GM*y0)/((x²+y²)^1.5)
  29.    
  30.     return(ay0);
  31. }
  32. int main(){
  33. double x,y,vx,vy,ax,ay; //déclaration position-vitesse-acceleration
  34. double t; //déclaration variable temporelle
  35. printf("\t Bonjour, choisissez une valeur d'abscisse (x) pour la position initiale du satellite (en km)\n" );//choix de x
  36. scanf("%lf",&x);
  37. printf("\t Choisissez une valeur d'ordonnée (y) pour la position initiale du satellite (en km)\n" );//choix de y
  38. scanf("%lf",&y);
  39. printf("\t Choisissez une valeur pour la composante de la vitesse du satellite selon les abscisses (vx en km/s)\n" );//vx
  40. scanf("%lf",&vx);
  41. printf("\t Choisissez une valeur pour la composante de la vitesse du satellite selon les ordonnées (vy en km/s)\n" );//vy
  42. scanf("%lf",&vy);
  43. ax=0; //acceleration initiale du satellite
  44. ay=0; //
  45. FILE *PositionS = fopen("orbite.out","w" );
  46. for(t=0;t<=86160;t=t+dt){ //developpement limité abscisses & ordonnées
  47.     fprintf(PositionS,"%f %f\n",x,y);       //création du fichier affichant la position du satellite
  48.     vx=vitessex(x,y,vx);  // assimilation des appels de fonctions à un nom (vx,vy,ax,ay) pour pouvoir utiliser  
  49.     vy=vitessey(x,y,vy);  // la condition initiale
  50.     ax=accelerationx(x,y);//
  51.     ay=accelerationy(x,y);//
  52.     x=x+dt*vx+((pow(dt,2))/2.)*ax;    //calcul abscisse position
  53.     y=y+dt*vy+((pow(dt,2))/2.)*ay; //calcul ordonnée position
  54.     if (sqrt(x*x+y*y)<6374) break;    //si racine de (x²+y²) inférieur au rayon de la Terre, on stoppe l'itération
  55. }
  56. fclose(PositionS);
  57. FILE *graphe = fopen("graphe.out","w" );
  58. fprintf(graphe,"set terminal gif\n" );
  59. fprintf(graphe,"set output 'Orbite.gif'\n" );
  60. fprintf(graphe,"plot 'orbite.out' u 1:2\n" );
  61. fprintf(graphe,"q\n" );
  62. fclose(graphe);
  63. system("gnuplot graphe.out" );
  64. system("konqueror Orbite.gif" );
  65. return 0;
  66. }


---------------
Bandit 400
Reply

Marsh Posté le 09-06-2006 à 13:55:33    

PoLuxR a écrit :

Code :
  1. double accelerationx(double x0,double y0){                    //fonction acceleration selon x
  2.     double ax0;
  3.    
  4.     ax0=-(GM*x0)/(pow((pow(x0,2)+pow(y0,2)),1.5)); //ax0=(-GM*x0)/((x²+y²)^1.5)
  5.    
  6.     return(ax0);
  7. }
  8. double accelerationy(double x0,double y0){                    //fonction acceleration selon y
  9.     double ay0;
  10.    
  11.     ay0=-(GM*y0)/(pow((pow(x0,2)+pow(y0,2)),1.5)); //ay0=(-GM*y0)/((x²+y²)^1.5)
  12.    
  13.     return(ay0);
  14. }



 

Code :
  1. double accelerationxy(double x0, double y0, double axe){                    //fonction acceleration selon x ou y au choix
  2.      return (-GM * axe)/(pow((pow(x0,2)+pow(y0,2)),1.5));
  3. }


Et tu appelles "accelerationxy()" en lui passant en 3° paramètre "x0" si tu veux une accélération selon X, ou "y0" si tu veux une accélération selon Y.
On peut même remplacer cette fonction par un "#define"...
 
Même méthode pour "vitessex" et "vitessey"
 :sol:


Message édité par Sve@r le 09-06-2006 à 22:39:28

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed