みその計算物理学
ホーム はじめに リンク集
修正オイラー法の数値計算例(Java)
  • プログラムソース
    import java.io.*;
    
    class Meuler
    {
            public static void main()
            {
                    double t,dt,x,v,tmax;
                    double k0[]=new double[2],k1[]=new double[2];
    
                    dt=0.1;
                    x=1.0;
                    v=0.0;
                    tmax=100.0;
    
                    Meuler f=new Meuler();
    
                    try
                    {
                            FileWriter fw=new FileWriter("output.data");
    
                            fw.write(+ x + " " + v + "\n");
    
                            for(t=0;t<tmax;t+=dt)
                            {
                                    k0[0]=f.f1(x,v);
                                    k0[1]=f.f2(x,v);
                                    k1[0]=f.f1(x+dt*k0[0],v+dt*k0[1]);
                                    k1[1]=f.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;
    
                                    fw.write(+ x + " " + v + "\n");
                            }
                            fw.close();
                    }
                    catch (Exception e)
                    {
                            System.out.println("error");
                    }
    
    
    
            }
    
            double f1(double x,double v)
            {
                    return v;
            }
    
            double f2(double x,double v)
            {
                    return -x;
            }
    
    }
    
    
  • GNUPLOT出力結果

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