みその計算物理学
ホーム はじめに リンク集
エムデン方程式の数値計算例(C言語)
  • プログラム例
    #include <stdio.h>
    #include <math.h>
    
    double n;       //ポリトロピック指数
    
    double f1(double t,double x,double v);
    double f2(double t,double x,double v);
    
    int main()
    {
            double t,t0,x,v,dt,tmax;
            double k1[2],k2[2],k3[2],k4[2];
    
                    t0=0.0001;      //初期値
            x=1.0-1.0/6.0*t0*t0+n/120.0*t0*t0*t0*t0;        //初期値
            v=-1.0/3.0*t0+n/30.0*t0*t0*t0;  //初期値
            dt=0.001;       //刻み幅
            tmax=10000.0;   //最大値
    
            FILE *output,*outputt,*outputx,*outputv;
            output=fopen("output.data","w");        //gnuplot表示用データファイル
                    outputt=fopen("outputt.data","w");      //excel表示用データファイル
                    outputx=fopen("outputx.data","w");
                    outputv=fopen("outputv.data","w");
    
                    printf("ポリトロープ指数の値は?");
                    scanf("%lf",&n);
    
            for(t=t0;t<tmax;t+=dt) {
                    k1[0]=dt*f1(t,x,v);
                    k1[1]=dt*f2(t,x,v);
    
                    k2[0]=dt*f1(t+dt/2.0,x+k1[0]/2.0,v+k1[1]/2.0);
                    k2[1]=dt*f2(t+dt/2.0,x+k1[0]/2.0,v+k1[1]/2.0);
    
                    k3[0]=dt*f1(t+dt/2.0,x+k2[0]/2.0,v+k2[1]/2.0);
                    k3[1]=dt*f2(t+dt/2.0,x+k2[0]/2.0,v+k2[1]/2.0);
    
                    k4[0]=dt*f1(t+dt,x+k3[0],v+k3[1]);
                    k4[1]=dt*f2(t+dt,x+k3[0],v+k3[1]);
    
                    x=x+(k1[0]+2.0*k2[0]+2.0*k3[0]+k4[0])/6.0;
                    v=v+(k1[1]+2.0*k2[1]+2.0*k3[1]+k4[1])/6.0;
    
                    fprintf(output,"%f %f %f\n",t,x,v);
                                    fprintf(outputt,"%f\n",t);
                                    fprintf(outputx,"%f\n",x);
                                    fprintf(outputv,"%f\n",v);
    
                                    if(x<0) break;
            }
    
            fclose(output);
    
            return 0;
    }
    
    double f1(double t,double x,double v)
    {
            return v;
    }
    
    double f2(double t,double x,double v)
    {
            return -pow(x,n)-2.0/t*v;
    }
    
    
  • 数値計算結果

    以下に上記のプログラムで求めた解を示す。グラフにはExcel(エクセル)を用いた。