一様重力場での質点の2次元平面内の運動を計算しましょう。 質点の質量mは1kgとし、 初期条件は位置qが原点(qx=0,qy=0)単位は[m]、 運動量pが(px=1,py=2)単位は[kgm/s]とします。 この運動方程式は
であり、この解は簡単に解析的に求められます。解析的に求まるとは、 要するに紙と鉛筆で式を変形して、解の数式を書き表すことができると いうことです。しかし、このような解析的な作業はあえてせずに、 コンピュータにより数値的に解の値を計算することにします。 この意義の深さはすぐにわかるでしょう。(1-1)式のqの2階の微分方程式よりも 次式のq,pの1階の連立微分方程式の方が微分が簡単で計算も簡単です。
この式の右辺に時刻 t=0 での値、つまり初期条件の値を入れると 時刻 t=0 でのq(0),p(0)の時間変化を表す1階微係数になります。 非常に短い時間 dT の間でのq,pの時間変化のテンポは一定であると 近似することができます。つまりq(dT),p(dT)を次式で近似するのです。 この変化分を表す式は任意の時刻においてそのまま使えます。 q(0),p(0)からq(dT),p(dT)を計算して、次に q(dT),p(dT)からq(2dT),p(2dT)を計算して、さらに同様に 次々と先の時間でのq(t),p(t)をこの方法により計算することができます。 これで微分方程式を数値的に解くことになるのです。(1-3)式は t=0 まわりでのq(dT),p(dT)の Taylar展開で dTの2次以上の 項を完全に無視した非常に粗い近似です。 このように、dTの1次の項しか考えない近似式で微分方程式を 数値的に解くこと方法をEuler(オイラー)法と呼びます。
プログラムでは(1-3)式は次のようになります。
つまり変化分を足しあわせるわけです。qx += px/M*dT; qy += py/M*dT; px += M*0*dT; py += -M*G*dT;
質点が地面より上にある間の軌跡を描くことにしましょう。 次のようになります。
//=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* // Program project //=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=* #include <stdio.h> #include "nxgraph.h" //---- physical setting #define G (9.80665) #define M (1.0) #define dT (1.0/256) //---- graphic setting #define WIN_WIDTH (256) #define WIN_HEIGHT (256) //---- main function int main(void) { NXOpenWindow("Projection Motion", WIN_WIDTH, WIN_HEIGHT ); double qx=0.0, qy=0.0; double px=1.0, py=2.0; do{ NXDrawPoint( (int)(512*qx), WIN_HEIGHT-(int)(512*qy) ); qx += px/M*dT; qy += py/M*dT; px += M*0*dT; py += -M*G*dT; }while( qy > 0.0 ); XEvent ev; NXCheckEvent( NX_WAIT, ev ); return(0); }
短い時間幅 dT は256分の1秒としました。do whileループで 位置のy座標 qy が正の間ループを回ることにしています。 位置のプロットの際には(qx,qy)の値は非常に小さいので適当に 拡大して、さらにy軸がwindowでは上下逆なので、それにあわせて変換して からプロットします。 ループを抜けた後はプログラムはwindowがマウスかキーで叩かれるまで 停止します。
放物運動のプログラムはこれだけでできあがりです。 この応用として次のプログラムを作ってみてください。