Tôi đang nghiên cứu một trường hợp cụ thể của vấn đề ba cơ thể bị hạn chế. Người ta phát hiện ra rằng một số vật thể theo mô hình quỹ đạo móng ngựa và tôi đang cố gắng sắp xếp thứ gì đó thông qua mã tích hợp trong C. Tôi đang làm theo một số lời khuyên trong bài viết Các gia đình có quỹ đạo hình móng ngựa định kỳ trong vấn đề ba thân bị hạn chế , cung cấp cho tôi các điều kiện ban đầu lý tưởng và các phương trình ở trung tâm của hệ thống đại chúng. (m là khối lượng của Trái đất và vị trí của mặt trời ở trung tâm của hệ quy chiếu khối lượng, (x, y) là tọa độ của vật thể thứ ba, giả định không có khối lượng (như vấn đề hạn chế yêu cầu).
Vị trí của "mặt trời" và "trái đất" được cố định là (m, 0) và (m-1,0), trong cùng một hệ quy chiếu. (hệ quy chiếu quay, giả sử trái đất có quỹ đạo tròn.)
Từ tất cả những điều này tôi đã tính toán các phương trình để mô tả hệ thống:
Tôi đã sử dụng thuật toán của Runge-Kutta 4 để tích hợp các phương trình đó. (Tôi biết mã này khá khó hiểu, nhưng tôi không thể sử dụng con trỏ và tôi sử dụng cấu trúc ở mọi nơi).
#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;
}
Vẽ kết quả Tôi chỉ nhận được một vòng xoắn ốc, trong khi sử dụng các đầu vào đã cho, tôi sẽ có được quỹ đạo hình móng ngựa. Tôi đã thử nhiều đầu vào khác nhau, (m = 0,0001 và m = 0,000003, đầu vào có tỷ lệ với các giá trị thực tế của khối lượng Trái đất và Mặt trời (khối lượng mặt trời là 1 m)).
Tôi chỉ không thể nhìn thấy những gì sai (có thể là tất cả mọi thứ: D), bất cứ ai có thể xin vui lòng giúp tôi?