みその計算物理学
ホーム はじめに リンク集
修正オイラー法の数値計算例(C言語)
  • プログラムソース
    #include <stdio.h>
    
    double f1(double x,double v);
    double f2(double x,double v);
    
    int main()
    {
            double t,dt,x,v,tmax;
            double k0[2],k1[2];
    
            dt=0.1;                 //刻み幅設定
            x=1.0;                  //位置初期値
            v=0.0;                  //速度初期値
            tmax=100;               //繰り返し最大回数
    
            FILE *output;
            output=fopen("output.data","w");
    
            fprintf(output,"%f %f\n",x,v);
    
            for(t=0;t<tmax;t+=dt) {
                    k0[0]=f1(x,v);
                    k0[1]=f2(x,v);
                    k1[0]=f1(x+dt*k0[0],v+dt*k0[1]);
                    k1[1]=f2(x+dt*k0[0],v+dt*k0[1]);
                    x=x+dt*(k0[0]+k1[0])/2.0;
                    v=v+dt*(k0[1]+k1[1])/2.0;
    
                    fprintf(output,"%f %f\n",x,v);
            }
    
            fclose(output);
    
            return 0;
    }
    
    double f1(double x,double v)
    {
            return v;
    }
    
    double f2(double x,double v)
    {
            return (-x);
    }
    
      
  • GNUPLOT出力結果

    下の画像を見ると、わずかだが、まだ誤差の影響が見られる。ここでは繰り返し回数が少ないからわかりにくいが、繰り返し回数を多くすれば、一定の円からずれていく。しかし、オイラー法よりは誤差の影響がずいぶんと小さくなったといえる。この方法よりももっと優れたルンゲクッタ法というものがある。常微分方程式を解く時は、ルンゲクッタ法を使うのがよい。