Holaaa!!! alguien sabe como resolver el problema de kepler de los dos cuerpos mediante c++ y empleando el metodo de integracion de euler, para una vez conocida la fuerza, poder hallar la velocidad y luego la posicion de ambos cuerpos y trazar asi su trayectoria???
llevo ya unas semanas peleandome con este proyecto pero no soy quien a sacarlo a delante!!
muchas gracias!!!
Hola, si se hacerlo :P
saludos!
y me podrias, por favor, echar una mano?
Claro, mas de uno te ayudara aca, solo deja tu intento, porque tareas no se hacen acá.
Esto es lo que he intentado hacer, pero no hay forma. No obtengo ningun resultado.
//El cuerpo 1 se corresponde a la Tierra. El 2, a la Luna.
// Consideramos que el centro de masas del sistema Tierra-Luna se encuentra en el origen de coordenadas.
// La Tierra se encuentra a 4668 km del CM. La Luna a 379432 km.
// Para calcular la velocidad de rotacion de ambos cuerpos multiplicamos la velocidad angular del sistema (2.67e-6) por la distancia a la que se encuentra cada cuerpo.
#include <cmath>
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
double dt = 1;
const int L=200;
double d= 3.84e8;
double X01= -4.5e3, vx01= -8.79 , vx1[L], ax1[L], X1[L], fx1[L];
double Y01= 4.5e3, vy01= 8.79, vy1[L], ay1[L], Y1[L], fy1[L];
double q1[L], q10 = -0.785;
double X02= 2.68e5, vx02= 715.54, vx2[L], ax2[L], X2[L], fx2[L];
double Y02= 2.68e5, vy02= 715.54, vy2[L], ay2[L], Y2[L], fy2[L];
double q2[L], q20 = 0.785;
double G= 6.674e-11 , m1= 5.97e24, m2=7.35e22 ;
int main()
{
ofstream output("output.dat");
for(int i=1;i<=L;i++)
{
vx1[0]=vx01;
X1[0]=X01;
vy1[0]=vy01;
Y1[0]=Y01;
q1[0]=q10;
q1=atan(Y1/X1);
vx2[0]=vx02;
X2[0]=X02;
vy2[0]=vy02;
Y2[0]=Y02;
q2[0]=q20;
q2=atan(Y2/X2);
/*OX para el primer cuerpo*/
fx1[i-1] = ((G*m1*m2)/(sqrt(pow(d,2))))*cos(q1[i-1]);
ax1[i-1]= fx1[i-1]/m1;
vx1=vx1[i-1]+(ax1[i-1]*dt);
X1=X1[i-1]+(vx1[i-1]*dt);
cout<<"\n Las posiciones OX1 son:"<<X1[i-1];
/*OY para el primer cuerpo*/
fy1[i-1] = ((G*m1*m2)/(sqrt(pow(d,2))))*sin(q1[i-1]);
ay1[i-1]= fy1[i-1]/m1;
vy1=vy1[i-1]+(ay1[i-1]*dt);
Y1=Y1[i-1]+(vy1[i-1]*dt);
cout<<"\n Las posiciones OY1 son:"<<Y1[i-1];
/*OX para el segundo cuerpo*/
fx2[i-1] = ((G*m1*m2)/(sqrt(pow(d,2))))*cos(q2[i-1]);
ax2[i-1]= fx2[i-1]/m2;
vx2=vx2[i-1]+(ax2[i-1]*dt);
X2=X2[i-1]+(vx2[i-1]*dt);
cout<<"\n Las posiciones OX2 son:"<<X2[i-1];
/*OY para el segundo cuerpo*/
fy2[i-1] = ((G*m1*m2)/(sqrt(pow(d,2))))*sin(q2[i-1]);
ay2[i-1]= fy2[i-1]/m2;
vy2=vy2[i-1]+(ay2[i-1]*dt);
Y2=Y2[i-1]+(vy2[i-1]*dt);
cout<<"\n Las posiciones OY2 son:"<<Y2[i-1];
output << X1[i-1] << " " << Y1[i-1] << endl;
output << X2[i-1] << " " << Y2[i-1] << endl;
}
return 0 ;
}
Muchas gracias a todo aquel que me ayude!!
He simplificqdo el problema que quiero resolver. Ahora considero que el sol esta fijo y quiero calcular la orbita de la tierra elrededor del sol. Aqui esta:
#include <cmath>
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
double dt = 1;
const int L=365;
double d[L];
double X01= 1.52e8, vx01= 0 , vx1[L], ax1[L], X1[L], fx1[L];
double Y01= 0, vy01= 2.98e4, vy1[L], ay1[L], Y1[L], fy1[L];
double q1;
double G= 6.674e-11 , m2=1.98e30 , m1=5.97e24 ;
int main()
{
ofstream output("output.dat");
for(int i=0;i<=L;i++)
{
vx1[0]=vx01;
X1[0]=X01;
vy1[0]=vy01;
Y1[0]=Y01;
q1=atan(Y1/X1);
d= sqrt((pow((X1),2))+(pow((Y1),2)));
fx1= (G*m1*m2*(cos(q1)))/(pow(d,2));
ax1= fx1/m1;
vx1[i+1]=vx1+(ax1*dt);
X1[i+1]=X1+(vx1*dt);
// cout<<"\n Les positions OX1 sont:"<<X1;
fy1=(G*m1*m2*(sin(q1)))/(pow(d,2));
ay1= fy1/m1;
vy1[i+1]=vy1+(ay1*dt);
Y1[i+1]=Y1+(vy1*dt);
// cout<<"\n Les positions OY1 sont:"<<Y1;
output << X1 << " " << Y1 << endl;
}
return 0 ;
}
Por que obtengo una recta y no la orbita eliptica que deberia de salir?? muchas gracias!!!
En las expresiones:
X1[i+1]=X1+(vx1*dt);
.........
.........
Y1[i+1]=Y1+(vy1*dt);
que te dan la posición hay aceleración, tanto en OX como en OY y veo que usas las expresiones: x=x0+vx*t .....¿ y no faltaría: +1/2ax*t^2?. Idem para la y.
acabo de probar y sigue dando una recta... pero gracias!!!!
La correccion de leosansan no era para que de unacurva, sino para incluir la aceleración.
Te comento:
1º) No estas aplicando las ecuaciones de Kepler (conservación del momento angular), sino las de gravitación universal (Newton)
2º) No vas a obtener una trayectoria elíptica de ninguna de las maneras, ya que supones la masa de la Tierra despreciable frente a la del Sol, diciendo que este último permanece quieto. Obtendras si acaso una trayectoria circular.
3º) Considerar dt=1dia es mucho considerar. Con esta consideración no se te cerrará la trayectoria ni por asomo.
Dicho todo esto, viendo el codigo, diría que falta cambiar el ángulo en cada iteración. Tampoco se muy bien que es lo que haces con las variables iniciales, que se te inicializan en cada iteración.
Igual me pongo a hacerlo de nuevo y si eso te cuento.
Un Saludo
Les dejo en el siguiente enlace el programa:
http://cypascal.blogspot.com.es/2012/11/orbita-de-la-tierra-entorno-al-sol.html (http://cypascal.blogspot.com.es/2012/11/orbita-de-la-tierra-entorno-al-sol.html)
y aqui mismo:
#include <stdio.h>
#include <math.h>
const int L=31536000;/*SEGS. EN UN AÑO*/
const double dt=1;/*DT ES UN SEG.*/
const double m1=5.97e24, m2=1.99e30, G= 6.674e-11;
int i;
double F,coseno,seno,d;
struct estado{
double X;
double Y;
double Vx;
double Vy;
double Ax;
double Ay;
}Solido1[L];
//Situacion inicial;
int main()
{
Solido1[0].X=1.5e11;
Solido1[0].Y=0;
Solido1[0].Vx=0;
Solido1[0].Vy=2.98e4;
d=sqrt(pow(Solido1[0].X,2)+pow(Solido1[0].X,2));
F=(G*m1*m2)/(pow(d,2));
Solido1[0].Ax=-F/m1;
Solido1[0].Ay=0;
printf("\n\n ORBITA DE LA TIERRA EN TORNO AL SOL\n\n\n");
for (i=1;i<=L;i++)
{
Solido1[i].X=Solido1[i-1].X+Solido1[i-1].Vx*dt;
Solido1[i].Y=Solido1[i-1].Y+Solido1[i-1].Vy*dt;
d=sqrt(pow(Solido1[i].X,2)+pow(Solido1[i].Y,2));
coseno=Solido1[i].X/d;
seno=Solido1[i].Y/d;
Solido1[i].Vx=Solido1[i-1].Vx+Solido1[i-1].Ax*dt;
Solido1[i].Vy=Solido1[i-1].Vy+Solido1[i-1].Ay*dt;
F=(G*m1*m2)/(pow(d,2));
Solido1[i].Ax=-F*coseno/m1;
Solido1[i].Ay=-F*seno/m1;
if ((i%86400)==1){/*PARA NO IMPRIMIR DEMASIDADOS DATOS*/
printf(" DIA %4d) X=%10.4f MKm",i/86400,Solido1[i].X/1000000000);
printf(" Y=%10.4f MKm",Solido1[i].Y/1000000000);
printf(" d=%10.4f MKm\n",d/1000000000);
}
}
printf("\n\n MKm significa MegaKilometro o Millones de kilometros.");
return 0;
}
Un Saludo!
Muchisimas gracias! ahora ya puedo avanzar con el trabajo.
Un saludo! :)