オイラー法の数値計算例(C言語) |
- プログラムソース (1次元の単振動)
#include <stdio.h>
double f1(double t,double x,double v);
double f2(double t,double x,double v);
int main()
{
double x,v,t,dt,tmax;
double k0[2];
FILE *output;
output=fopen("output.data","w");
x=1.0;
v=0.0;
dt=0.03;
tmax=100;
for(t=0.0;t<=tmax;t+=dt) {
k0[0]=dt*f1(t,x,v);
k0[1]=dt*f2(t,x,v);
x=x+k0[0];
v=v+k0[1];
fprintf(output,"%f %f %f\n",t,x,v);
}
fclose(output);
return 0;
}
double f1(double t,double x,double v)
{
return v;
}
double f2(double t,double x,double v)
{
return (-x);
}
- GNUPLOT出力結果
下の画像を見ると、横軸が位置を表し、縦軸が速度を表しているが、明らかに各値が発散している。単振動において、外部からの力や摩擦や抵抗がなければ、位置と速度の最大値と最小値は変わらないから、一定の円を描くはずである。このずれは誤差によるものである。オイラー法では1次までしか近似しなかったためである。よって、オイラー法はあまり実用的ではない。
|
|
|