限制3身体模拟无法正常工作

时间:2012-12-19 10:28:12

标签: c physics simulation gravity orbit

我目前正在尝试进行一项任务,我必须为受限制的3体引力问题编写模拟,其中包含两个固定质量和一个测试质量。我就这个问题提供的信息是:Check out this link,到目前为止这是我的程序:

#include<stdlib.h>
#include<stdio.h>
#include <math.h>

int main (int argc, char* argv[])
{
    double dt=0.005, x[20000],y[20000],xv,yv,ax,ay,mneg,mpos,time,radius=0.01;
    int n,validation=0;
    FILE* output=fopen("proj1.out", "w");

    printf("\n");


    if((argv[1]==NULL) || (argv[2]==NULL) || (argv[3]==NULL) || (argv[4]==NULL) ||     (argv[5]==NULL) || (argv[6]==NULL)) 
    {
        printf("************************ ERROR! ***********************\n");
        printf("**     Not enough comand line arguments input.       **\n");
        printf("**     Please run again with the correct amount (6). **\n");
        printf("*******************************************************\n");
        validation=1;
        goto VALIDATIONFAIL;
    }
if((sscanf(argv[1], "%lf", &mneg)==NULL) || (sscanf(argv[2], "%lf", &mpos)==NULL) || (sscanf(argv[3], "%lf", &x[0])==NULL) ||
(sscanf(argv[4], "%lf", &y[0])==NULL) || (sscanf(argv[5], "%lf", &xv)==NULL) || (sscanf(argv[6], "%lf", &yv)==NULL) )
{
    printf("************************* ERROR! ************************\n");
    printf("** Input values must be numbers. Please run again with **\n");                 
    printf("** with numerical inputs (6).                          **\n");
    printf("*********************************************************\n");
    validation=1;
  goto VALIDATIONFAIL;
}

sscanf(argv[1], "%lf", &mneg);
sscanf(argv[2], "%lf", &mpos);
sscanf(argv[3], "%lf", &x[0]);
sscanf(argv[4], "%lf", &y[0]);
sscanf(argv[5], "%lf", &xv);
sscanf(argv[6], "%lf", &yv);


    x[1]=x[0]+(xv*dt);
    y[1]=y[0]+(yv*dt);

for(n=1;n<10000;n++)
    {
        if(x[n-1]>=(1-radius) && x[n-1]<=(1+radius) && y[n-1]>=(0-radius) && y[n-1]<=(0+radius))
        {
            printf("Test mass has collided with M+ at (1,0), Exiting...\n");
            goto EXIT;
        }
        else if(x[n-1]>=(-1-radius) && x[n-1]<=(-1+radius) && y[n-1]>=(0-radius) && y[n-1]<=(0+radius))
        {
            printf("Test mass has collided with M- at (-1,0), Exiting...\n");
            goto EXIT;
        }
        else
        {
            double dxn = x[n] + 1;
            double dxp = x[n] - 1;
            double mnegdist = pow((dxn*dxn + (y[n]*y[n])), -1.5);
            double mposdist = pow((dxp*dxp + (y[n]*y[n])), -1.5);

            ax =  -(mpos*dxp*mposdist+mneg*dxn*mnegdist);
            ay =  -(mpos*y[n]*mposdist+mneg*y[n]*mnegdist); 


            x[n+1]=((2*x[n])-x[n-1] +(dt*dt*ax));
            y[n+1]=((2*y[n])-y[n-1]+(dt*dt*ay));


            fprintf(output, "%lf %lf\n",x[n-1], y[n-1]); 
        }
    }
VALIDATIONFAIL: 
printf("\n");
return(EXIT_FAILURE);   

EXIT:
return(EXIT_SUCCESS);
}

我的程序在某种程度上正在发挥作用,但我遇到了一些奇怪的问题,我希望有人可以帮助我。

主要问题是,当测试质量到达其轨迹中的一个点时,它应该关闭并开始围绕另一个质量进行轨道运行,而不是直线射向无限远!起初我认为群众正在碰撞,所以我进行了半径检查,但在某些情况下这确实有效,在某些情况下它没有,并且在某些情况下,群众在轨道出错之前碰撞更早所以这显然不是问题。我不确定我是否已经解释得太好所以这里有一张图片向你展示我的意思。 (右边的模拟来自here

line

然而,情况并非总是这样,有时候不是直线,当它应该转移到另一个质量时,轨迹就会变得疯狂,就像这样: crazy

我真的完全不知道发生了什么事情,我花了好几天试图解决这个问题,但似乎无法到达任何地方,所以在确定我的问题所在的任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

我发现很难理解你的代码,所以如果我告诉你你已经知道的事情,我会努力尽可能地帮助并道歉。

我发现计算涉及重力的模拟的物理学的最好方法是使用万用万有引力定律。这由公式给出:

F =(( - G * M1 * M2)/(R * R))* r_unit_vector;

其中:

G~ = 6.67e-11, M1是第一个物体的质量, M2是第二个物体的质量, R是两个对象之间的距离:sqrt(pow(X2 - X1, 2) + pow(Y2 - Y1, 2))

X1是对象1的X坐标, X2是对象2的X坐标, Y1是对象1的Y坐标, Y2是对象2的Y坐标。

r_unit_vector是一个从对象2指向对象1的单位向量

struct r_unit_vector_struct{
    double x, y;
}r_unit_vector;

r_unit_vector有一个x分量,它是对象2的x坐标 - 对象1的x坐标, r_unit_vector有一个y分量,它是对象2的y坐标 - 对象1的y坐标。

要使r_unit_vector成为单位向量,必须将(x和y分量)分别除以其长度,由sqrt(pow(r_unit_vector.x, 2) + pow(r_unit_vector.y - Y1, 2))

给出

你应该准备好了!希望这是有道理的。如果没有,我会给你写一个课程来做这些事情或者如果可以的话进一步解释它!