Estou estudando um caso particular do problema restrito de três corpos. Verificou-se que alguns objetos seguem um padrão de órbita em ferradura e estou tentando resolver algo através de um código de integração em C. Estou seguindo alguns conselhos no artigo Famílias de órbitas em ferradura periódicas no problema restrito de três corpos , o que me dá condições iniciais ideais e as equações no sistema do centro de massa. (m é a massa da Terra e a conseqüente posição do sol no sistema de referência do centro de massa, (x, y) são as coordenadas do terceiro corpo, assumidas sem massa (conforme requer o problema restrito).
As posições do "sol" e "terra" são fixadas em (m, 0) e (m-1,0), no mesmo sistema de referência. (sistema de referência rotativo, assumindo que a Terra tenha uma órbita circular.)
De tudo isso, calculei as equações para descrever o sistema:
a (x) = x + \ dfrac {(m-1) (xm)} {((xm) ^ 2 + y ^ 2) ^ 1,5} - \ dfrac {2m (x-m + 1)} {((x (xm) ^ 2 + y ^ 2) ^ 1,5} + 2v (y)
Eu usei o algoritmo do Runge-Kutta 4 para integrar essas equações. (Eu sei que o código é bastante perturbador, mas eu simplesmente não posso usar ponteiros e uso estruturas em todos os lugares).
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define dt 0.0001
#define N 100
typedef struct{
long double x,y;
}vec;
typedef struct{
vec k1,k2,k3,k4;
}runge;
typedef struct{
runge r,v;
}big;
double dS,dE,m;
double accx(double,double,double);
double accy(double,double,double);
void rad(vec);
big rungekutta(vec,vec);
vec moto(vec,runge);
double jacobi(vec);
int main(){
vec r,v;
big f;
double J,t;
int i,Num;
FILE* s1;
s1=fopen("HorseShoe.dat","w");
Num=(int)N/dt;
scanf("%Lf",&r.x);
scanf("%Lf",&r.y);
scanf("%Lf",&v.x);
scanf("%Lf",&v.y);
scanf("%lf",&m);
for(i=0;i<Num;i++){
t=(i+1)*dt;
rad(r);
f=rungekutta(r,v);
r=moto(r,f.r);
v=moto(v,f.v);
J=jacobi(r);
fprintf(s1,"%lf\t%Lf\t%Lf\t%Lf\t%Lf\t%lf\n",t,r.x,r.y,v.x,v.y,J);
}
return 0;
}
void rad(vec r){
dS=pow(r.x-m,2)+pow(r.y,2);
dE=pow(r.x-m+1,2)+pow(r.y,2);
}
double jacobi(vec r){
return pow(r.x,2)+pow(r.y,2)+2*(1-m)/dS+2*m/dE+m*(1-m);
}
double accx(double x,double y,double v){
return x-(x-m)*(1-m)/pow(pow(x-m,2)+pow(y,2),1.5)-m*(x-m+1)/pow(pow(x-m+1,2)+pow(y,2),1.5)+2*v;
}
double accy(double x,double y,double v){
return y-(1-m)*y/pow(pow(y,2)+pow(x-m,2),1.5)-m*y/pow(pow(y,2)+pow(x-m+1,2),1.5)-2*v;
}
big rungekutta(vec r,vec v){
big f;
f.r.k1.x=v.x;
f.r.k1.y=v.y;
f.v.k1.x=accx(r.x,r.y,v.y);
f.v.k1.y=accy(r.x,r.y,v.x);
f.r.k2.x=v.x+f.v.k1.x*dt/2;
f.r.k2.y=v.y+f.v.k1.y*dt/2;
f.v.k2.x=accx(r.x+f.r.k1.x*dt/2,r.y+f.r.k1.y*dt/2,v.y+f.v.k1.y*dt/2);
f.v.k2.y=accy(r.x+f.r.k1.x*dt/2,r.y+f.r.k1.y*dt/2,v.x+f.v.k1.x*dt/2);
f.r.k3.x=v.x+f.v.k2.x*dt/2;
f.r.k3.y=v.y+f.v.k2.y*dt/2;
f.v.k3.x=accx(r.x+f.r.k2.x*dt/2,r.y+f.r.k2.y*dt/2,v.y+f.v.k2.y*dt/2);
f.v.k3.y=accy(r.x+f.r.k2.x*dt/2,r.y+f.r.k2.y*dt/2,v.x+f.v.k2.x*dt/2);
f.r.k4.x=v.x+f.v.k3.x*dt;
f.r.k4.y=v.y+f.v.k3.y*dt;
f.v.k4.x=accx(r.x+f.r.k3.x*dt,r.y+f.r.k3.y*dt,v.y+f.v.k3.y*dt);
f.v.k4.y=accy(r.x+f.r.k3.x*dt,r.y+f.r.k3.y*dt,v.x+f.v.k3.x*dt);
return f;
}
vec moto(vec r,runge rk){
r.x+=(rk.k1.x+2*rk.k2.x+2*rk.k3.x+rk.k4.x)*dt/6;
r.y+=(rk.k1.y+2*rk.k2.y+2*rk.k3.y+rk.k4.y)*dt/6;
return r;
}
Traçando os resultados, eu apenas recebo uma espiral; enquanto estiver usando as entradas fornecidas, devo obter uma órbita em ferradura. Eu tentei muitas entradas diferentes (m = 0,0001 em = 0,000003, a última está em escala com os valores reais das massas da Terra e do Sol (a massa do sol é de 1 m)).
Eu simplesmente não consigo ver o que está errado (provavelmente tudo: D), alguém pode me ajudar?