修正オイラー法の数値計算例(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出力結果
下の画像を見ると、わずかだが、まだ誤差の影響が見られる。ここでは繰り返し回数が少ないからわかりにくいが、繰り返し回数を多くすれば、一定の円からずれていく。しかし、オイラー法よりは誤差の影響がずいぶんと小さくなったといえる。この方法よりももっと優れたルンゲクッタ法というものがある。常微分方程式を解く時は、ルンゲクッタ法を使うのがよい。
|
|
|
|
|
|