みその計算物理学
ホーム はじめに リンク集
三体問題の数値計算例
  • プログラムソース

    三体問題で説明した条件をルンゲクッタ法で解く。

    #include <stdio.h>
    #include <math.h>
    
    #define m1 0.7          //m1+m2=1.0は厳守
    #define m2 0.3
    
    double f1(double t,double x,double y,double vx,double vy);
    double f2(double t,double x,double y,double vx,double vy);
    double f3(double t,double x,double y,double vx,double vy);
    double f4(double t,double x,double y,double vx,double vy);
                    
    int main(void)
    {
            double t,x,y,vx,vy,dt,tmax;
            double k0[4],k1[4],k2[4],k3[4];
    
            dt=0.01;                        //刻み幅
            tmax=100.0;                     //最大時間
    
            x=0.5;                          //ここから初期条件
            y=0.0;
            vx=0.0;
            vy=1.0;
    
            FILE *output;
            output=fopen("output.data","w");
    
    //ルンゲクッタの公式を用いて解く
            for(t=0.0;t<tmax;t+=dt) {
                    k0[0]=dt*f1(t,x,y,vx,vy);
                    k0[1]=dt*f2(t,x,y,vx,vy);
                    k0[2]=dt*f3(t,x,y,vx,vy);
                    k0[3]=dt*f4(t,x,y,vx,vy);
    
                    k1[0]=dt*f1(t+dt/2.0,x+k0[0]/2.0,y+k0[1]/2.0,vx+k0[2]/2.0,vy+k0[3]/2.0);
                    k1[1]=dt*f2(t+dt/2.0,x+k0[0]/2.0,y+k0[1]/2.0,vx+k0[2]/2.0,vy+k0[3]/2.0);
                    k1[2]=dt*f3(t+dt/2.0,x+k0[0]/2.0,y+k0[1]/2.0,vx+k0[2]/2.0,vy+k0[3]/2.0);
                    k1[3]=dt*f4(t+dt/2.0,x+k0[0]/2.0,y+k0[1]/2.0,vx+k0[2]/2.0,vy+k0[3]/2.0);
    
                    k2[0]=dt*f1(t+dt/2.0,x+k1[0]/2.0,y+k1[1]/2.0,vx+k1[2]/2.0,vy+k1[3]/2.0);
                    k2[1]=dt*f2(t+dt/2.0,x+k1[0]/2.0,y+k1[1]/2.0,vx+k1[2]/2.0,vy+k1[3]/2.0);
                    k2[2]=dt*f3(t+dt/2.0,x+k1[0]/2.0,y+k1[1]/2.0,vx+k1[2]/2.0,vy+k1[3]/2.0);
                    k2[3]=dt*f4(t+dt/2.0,x+k1[0]/2.0,y+k1[1]/2.0,vx+k1[2]/2.0,vy+k1[3]/2.0);
    
                    k3[0]=dt*f1(t+dt,x+k2[0],y+k2[1],vx+k2[2],vy+k2[3]);
                    k3[1]=dt*f2(t+dt,x+k2[0],y+k2[1],vx+k2[2],vy+k2[3]);
                    k3[2]=dt*f3(t+dt,x+k2[0],y+k2[1],vx+k2[2],vy+k2[3]);
                    k3[3]=dt*f4(t+dt,x+k2[0],y+k2[1],vx+k2[2],vy+k2[3]);
    
                    x=x+(k0[0]+2.0*k1[0]+2.0*k2[0]+k3[0])/6.0;
                    y=y+(k0[1]+2.0*k1[1]+2.0*k2[1]+k3[1])/6.0;
                    vx=vx+(k0[2]+2.0*k1[2]+2.0*k2[2]+k3[2])/6.0;
                    vy=vy+(k0[3]+2.0*k1[3]+2.0*k2[3]+k3[3])/6.0;
    
                    fprintf(output,"%f %f %f %f\n",x,y,vx,vy);
    
            }
    
            fclose(output);
    
            return 0;
    }
    
    double f1(double t,double x,double y,double vx,double vy)
    {
            double r;
    
            r=vx;
    
            return r;
    }
    
    double f2(double t,double x,double y,double vx,double vy)
    {
            double r;
    
            r=vy;
    
            return r;
    }
    
    double f3(double t,double x,double y,double vx,double vy)
    {
            double r;
    
            r=2*vy+x+(-m1*(x-m2)/((pow((x-m2)*(x-m2)+y*y,1.5)))-m2*(x+m1)/(pow((x+m1)*(x+m1)+y*y,1.5)));
    
            return r;
    }
    
    double f4(double t,double x,double y,double vx,double vy)
    {
            double r;
    
            r=-2*vx+y+(-m1*y/(pow((x-m2)*(x-m2)+y*y,1.5))-m2*y/(pow((x+m1)*(x+m1)+y*y,1.5)));
    
            return r;
    }
    
  • GNUPLOT出力結果

    m1=0.8,m2=0.2の場合。

    m1=0.7,m2=0.3の場合。初期条件を変えると、上の花みたいなのと、このらせん系の軌道しかでてこない。この理由は考察中。