オイラー法の数値計算例(Java) |
- プログラムソース (1次元の単振動)
import java.io.*;
class Euler
{
public static void main(String arg[])
{
double x,v,t,dt,tmax;
double k0[]=new double[2];
x=1.0;
v=0.0;
dt=0.03;
tmax=100.0;
Euler f=new Euler();
try
{
FileWriter fw=new FileWriter("output.data");
for(t=0;t<tmax;t+=dt)
{
k0[0]=dt*f.f1(t,x,v);
k0[1]=dt*f.f2(t,x,v);
x=x+k0[0];
v=v+k0[1];
fw.write(+ x + " " + v + "\n");
}
fw.close();
}
catch (Exception e)
{
System.out.println(e);
}
}
double f1(double t,double x,double v)
{
return v;
}
double f2(double t,double x,double v)
{
return (-x);
}
}
- GNUPLOT出力結果
下の画像を見ると、横軸が位置を表し、縦軸が速度を表しているが、明らかに各値が発散している。単振動において、外部からの力や摩擦や抵抗がなければ、位置と速度の最大値と最小値は変わらないから、一定の円を描くはずである。このずれは誤差によるものである。オイラー法では1次までしか近似しなかったためである。よって、オイラー法はあまり実用的ではない。
|
|
|
|
|
|