ルンゲクッタ法の数値計算例(Java) |
- プログラムソース (1次元の単振動を解く)
import java.io.*;
class Runge
{
public static void main()
{
double t,x,v,dt,tmax;
double k1[]=new double[2],k2[]=new double[2],k3[]=new double[2],k4[]=new double[2];
x=1.0;
v=0.0;
dt=0.01;
tmax=50.0;
Runge f=new Runge();
try
{
FileWriter fw=new FileWriter("output.data");
for(t=0;t<tmax;t+=dt)
{
k1[0]=dt*f.f1(t,x,v);
k1[1]=dt*f.f2(t,x,v);
k2[0]=dt*f.f1(t+dt/2.0,x+k1[0]/2.0,v+k1[1]/2.0);
k2[1]=dt*f.f2(t+dt/2.0,x+k1[0]/2.0,v+k1[1]/2.0);
k3[0]=dt*f.f1(t+dt/2.0,x+k2[0]/2.0,v+k2[1]/2.0);
k3[1]=dt*f.f2(t+dt/2.0,x+k2[0]/2.0,v+k2[1]/2.0);
k4[0]=dt*f.f1(t+dt,x+k3[0],v+k3[1]);
k4[1]=dt*f.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;
fw.write( + t + " " + x + " " + v + "\n" );
}
fw.close();
}
catch(Exception e)
{
System.out.println("error");
}
}
double f1(double t,double x,double v)
{
return v;
}
double f2(double t,double x,double v)
{
return -x;
}
}
- GNUPLOT出力結果
前のオイラー法と修正オイラー法に比べて、繰り返し最大回数を多くしたにもかかわらず、単振動の位相空間の特徴である一定の円が得られた。かなりの回数を繰り返しても、一定の円からずれることはない。非常にルンゲクッタ法は実用的である。
|
|
|
|
|
|