Accueil > Forum > > > > Capture d une etoile par une planete
Capture d une etoile par une planete
dimanche 13 mars 2011 à 13:10:21 |
Capture d une etoile par une planete

Xzin
|
Bonjour, j'aurai besoin d'un peu d'aide pour mon projet d'informatique.
Mon thème est la capture d'une planete par une etoile qui s'approche. Je dois résoudre ce problème à 3 corps complet avec RK4. Et j'affiche le résultat sous gnuplot.
J'ai dejà programmé en C++ la partie différentielle, affichage gnuplot mais mon probleme est sur les Conditions initiales de l'approche de l'étoile.
Voici mon programme :
Code C/C++ : #include<iostream>
#include<fstream>
#include<math.h>
#include<cstdlib>
#define PM 4
#define N 12
using namespace std;
void masse(double m[]);
void sys(double q[],double t, double qp[],int n);
double stabilite(double q[]);
void determination_CI(double q[], int np, double dt);
void val_init(double q[], double alpha, double Di, double Vi);
void calcul_bonne_trajectoire(double q[], int np, double dt);
void tracer_gnuplot();
void rk4(void(*sd)(double *,double,double *,int),double q[],double t,double dt,int n);
int main()
{
int np;
double q[N], dt, tfin;
np=100001; // Nombre de point
tfin=100000; // temps de fin de la simulation
dt=tfin/(np-1); // Intervalle de temps
determination_CI(q,np,dt);
//val_init(q,0.1,150,0.0002);
calcul_bonne_trajectoire(q,np,dt); // On calcul la bonne trajectoire et l'enregistre
tracer_gnuplot(); // on trace
return 0;
}
// Déclaration masses
double masse(int a)
{
//En masse solaire
double m[3];
m[0]=1.00000597682; // Masse etoile 1
m[1]=0.00000354786104043; // Masse planete 1
m[2]=1.00000597682; //Masse etoile 2
return m[a];
}
//Systeme differentiel
void sys(double q[],double t, double qp[],int n)
{
double G=2.96E-4;
static double c=3./2.;
double r1,r2,r3;
double m[3];
m[0]=masse(0);
m[1]=masse(1);
m[2]=masse(2);
//Distance Etoile 1-Planete 1
r1=pow((q[0]-q[8])*(q[0]-q[8])+(q[1]-q[9])*(q[1]-q[9]),c);
//Distance Planete 1-Etoile 2
r2=pow((q[0]-q[4])*(q[0]-q[4])+(q[1]-q[5])*(q[1]-q[5]),c);
//Distance Etoile 1-Etoile 2
r3=pow((q[4]-q[8])*(q[4]-q[8])+(q[5]-q[9])*(q[5]-q[9]),c);
//Systeme Planete 1
qp[0]=q[2];
qp[1]=q[3];
qp[2]=-G*m[0]*(q[0])/r1-G*m[2]*(q[0]-q[4])/r2;
qp[3]=-G*m[0]*(q[1])/r1-G*m[2]*(q[1]-q[5])/r2;
//Systeme Etoile 1
qp[8]=q[10];
qp[9]=q[11];
qp[10]=-G*m[2]*(q[8]-q[4])/r3-G*m[1]*(q[8]-q[0])/r1;
qp[11]=-G*m[2]*(q[9]-q[5])/r3-G*m[1]*(q[9]-q[1])/r1;
//Systeme Etoile 2
qp[4]=q[6];
qp[5]=q[7];
qp[6]=-G*m[0]*(q[4])/r3-G*m[1]*(q[4]-q[0])/r2;
qp[7]=-G*m[0]*(q[5])/r3-G*m[1]*(q[5]-q[1])/r2;
}
void val_init(double q[],double alpha, double Di, double Vi)
{
//Valeur en UA.
//Valeurs initiales Planete 1
q[0]=-30.0023653; //x1
q[1]=7.1169847; //y1
q[2]=-0.000865429; //vx1
q[3]=-0.00072490; //vy1
//Valeur initiales Etoile 1
q[8]=0;
q[9]=0;
q[10]=0;
q[11]=0;
//Valeur initiales Etoile 2
q[4]=Di/sqrt(2);
q[5]=Di/sqrt(2);
q[6]=-Vi*cos(alpha);
q[7]=-Vi*sin(alpha);
}
//Détermination des conditions initiales pour que ça marche
void determination_CI(double q[], int np, double dt)
{
int l; //Variable boucle
int i=0,j=0,k=0;
double t=0,alpha,alpha_max,Vi,Vimax,Di,Dimax,r1,r2;
// Test des différentes conditions initiales
//On fait varier la vitesse et l'angle de l'étoile et la position initiale
Di=120;
Dimax=200;
// Variation de la position
while (Di<=Dimax && i==0)
{
// Variation de la vitesse
Vi=0.001;
Vimax=0.003;
while (Vi <= Vimax && i==0)
{
// Variation de l'angle
alpha=0;
alpha_max=M_PI/3;
while (alpha<=alpha_max && i==0)
{
t=0;
val_init(q,alpha,Di,Vi); // initialisation conditions
for(l=1;l<=np;l++)
{
rk4(sys,q,t,dt,N);
t=t+dt;
}
r2=sqrt((q[0]-q[4])*(q[0]-q[4])+(q[1]-q[5])*(q[1]-q[5])); //Distance Etoile 2 - Planete
r1=sqrt((q[0]-q[8])*(q[0]-q[8])+(q[1]-q[9])*(q[1]-q[9])); //Distance Etoile 1 - Planete
if (r2<500) {j=1;}
k=stabilite(q);
i=k*j;
alpha=alpha+alpha_max/30;
cout << "Distance Etoile 1 - Planète : " << r1 << endl;
cout << "Distance Etoile 2 - Planète : " << r2 << endl;
cout << "Angle initial Etoile 2 : " << alpha << endl;
cout << "Vitesse initiale Etoile 2 : " << Vi << endl;
cout << "Distance Initiale Etoile 2 : " << Di << endl;
if(i==1)
{
cout << "Orbite stable" << endl;
}
else
{
cout << "Orbite instable" << endl;
}
}
Vi=Vi+0.0005;
}
Di=Di+10;
}
val_init(q,alpha,Di,Vi); // On met les bonnes CI
}
// Critère de stabilité
double stabilite(double q[])
{
int i=0; //i=0 => orbite instable, i=1 => orbite stable
double G=2.96E-4;
static double c=3./2.;
double f1p, f2p, r1, r2;
double rapport,vlib,vplan;
double m[3];
m[0]=masse(0);
m[1]=masse(1);
m[2]=masse(2);
//Distance Etoile 1-Planete 1
r1=pow((q[0]-q[8])*(q[0]-q[8])+(q[1]-q[9])*(q[1]-q[9]),c);
//Distance Planete 1-Etoile 2
r2=pow((q[0]-q[4])*(q[0]-q[4])+(q[1]-q[5])*(q[1]-q[5]),c);
f1p=G*m[0]*m[1]/r1; //force etoile 1 sur planete
f2p=G*m[1]*m[2]/r2; // force etoile 2 sur planete
rapport=f1p/f2p; // Si rapport<<1 alors la force de l'étoile 1 est négligeable
vlib=sqrt(2*G*m[2]/r2); // Vitesse libération
vplan=sqrt(q[2]*q[2]+q[3]*q[3]); // Vitesse de la planete
if(rapport<0.01 && vplan<vlib) {i=1;}
cout << endl;
cout << "Rapport :" << rapport << endl;
cout << "Vitesse liberation :" << vlib << endl;
cout << "Vitesse planete :" << vplan << endl;
return (i);
}
//Calcul Trajectoire
void calcul_bonne_trajectoire(double q[], int np, double dt)
{
int i;
double t=0;
fstream traj("traj2.dat",ios::out);
fstream origine("origine.dat",ios::out);
for(i=1;i<=np;i++)
{
traj << t << " " << q[0] << " " << q[1] << " " << q[4] << " " << q[5] << endl;
origine << t << " " << q[8] << " " << q[9] << endl;
rk4(sys,q,t,dt,N);
t=t+dt;
}
traj.close();
origine.close();
}
// Commandes gnuplot
void tracer_gnuplot()
{
fstream gnu("test.gnu",ios::out);
gnu << "set xlabel 'Abscisse'" << endl;
gnu << "set ylabel 'Ordonnée'" << endl;
gnu << "plot 'traj2.dat' every 5 using 2:3 title 'Planète' w l,'traj2.dat' every 5 using 4:5 title 'Etoile' w l, 'origine.dat' every 5 using 2:3 title 'Soleil' w l" << endl;
gnu << "pause -1" << endl;
gnu.close();
system("gnuplot test.gnu");
}
/* Runge Kunta */
void rk4(void(*sd)(double *,double,double *,int),double q[],double t,double dt,int n)
{
/* Declarations et initialisations */
int i,k,p;
double *y[PM+1],*z[PM];
static const double a[PM][PM]={{1./2,0,0,0},{0,1./2,0,0},{0,0,1,0},{1./6,1./3,1./3,1./6}};
static const double b[PM]={0,1./2,1./2,1};
/* Allocations */
for(i=0;i<PM+1;i++) y[i]=(double *)malloc(n*sizeof(double));
for(i=0;i<PM;i++) z[i]=(double *)malloc(n*sizeof(double));
/* Calcul */
for(i=0;i<n;i++) y[0][i]=q[i];
for(p=1;p<=PM;p++)
{
sd(y[p-1],t+b[p-1]*dt,z[p-1],n);
for(i=0;i<n;i++) y[p][i]=q[i];
for(k=0;k<p;k++) {for(i=0;i<n;i++) y[p][i]=y[p][i]+dt*a[p-1][k]*z[k][i];}
}
for(i=0;i<n;i++) q[i]=y[PM][i];
/* Desallocations */
for(i=0;i<PM+1;i++) {free(y[i]); y[i]=NULL;}
for(i=0;i<PM;i++) {free(z[i]); z[i]=NULL;}
}
Merci.
|
|
dimanche 13 mars 2011 à 13:16:01 |
Re : Capture d une planete par une etoile

Xzin
|
Désolé pour le titre, je me suis trompé ^^.
|
|
Cette discussion est classée dans : int, void, double, planete, etoile
Répondre à ce message
Sujets en rapport avec ce message
probléme avec un Slider : comment envoyé la valeur généré par le slider a une intérface opengl [ par controlleur ]
Bonjour dans mon projet j'ai réalisé une petite interface que je l'ai intégré dans un mainwindow class mainwindow : public QMainWindow { Q
pikcing opengl [ par znb ]
J 'ai fait un code et ça marche très bien; il détecte les couleurs des objets. Mais je veux que, pour une valeur particulière de la couleur, dessiner
matrice et vecteur [ par memoireph ]
salut tous le monde je sollicite votre aide sur un problème voilà,j'ai deux classe vecteur et Matrice que je doit faire avec des opération élémentai
j'ai besoin de vous!!! [ par baster200x ]
bonjour les amis [^^happy13] j'ai trouvé la solution pour mes problème que je l'ai poser précédemment sur le forum à propos de l'intégration d'u
code ecris de la croissance [ par Flopy21 ]
Salut, en fait j'ai ecris le code avec beaucoup de difficultes et quelques aides de part et d'autres personnes. Mais j'ai rencontrer des problemes lor
Premiere prog en Smfl [ par tiouil ]
Bonjour, je viens vous demander votre aide car voila une semaine que je corrige des erreurs et encore des erreurs et certaines persistent donc voila.
problème d'intégrer mon algorithme [ par baster200x ]
Slt tous le mande! je vous adresse pour m'aider à trouver une solution à mon problème! j'ai un outil Open source Nommé [url=http://home.dei.polimi
erreur code [ par ucf662 ]
[code=cpp]class point{ int x,y; public: void initialiser( int x1 , int y1 ) ; void deplacer( i
suppression d'une ligne ou colonne d'une matrice avec C++ [ par saidkoukou ]
j'ai écrit un petit programme C++ avec lequel je manipule une matrice.j'ai essayé d'appliquer la suppression d'une ligne et d'une colonne de cette mat
IntToStr en C [ par RENTMEESTERS ]
bonjour à tous, Je dois convertir un nombre entier INT en une chaîne de caractère qui devra être affichée sur un LCD (*char). J'utilise un 16F887 et
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|