![]() |
(4) |
x(t) = 5 e-2 t | (5) |
ここでは,(4)の数値解をMaTXによる シミュレーションで計算してみましょう.
シミュレーションプログラムは次のようになります.
(//
はコメントです)
// "1stdiffeqn.mm" // Simulation of the following system: // dx/dt = -2 x, x(0)=5 Func void main() { Real t0,t1; Real h,dtsav; Matrix x0,TC,XC,UC; void diff_eqs(),link_eqs(); t0 = 0.0; //シミュレーションの開始時刻を t=0 にする t1 = 10.0; //シミュレーションの終了時刻を t=10 にする x0 = [5.0]; //初期状態を x(0)=5.0 にする h = 5.0e-4; // シミュレーションの刻を0.5msecにする dtsav = 1.0e-3;// データは1msecおきに保存する print "Now simulating\n"; // Ode()によってシミュレーションを行う {TC,XC,UC} = Ode(t0,t1,x0,diff_eqs,link_eqs,h,dtsav); // diff_eqs() は微分方程式を記述する関数 // link_eqs() は複数の微分方程式の関係を記述する関数 // TC: 時間の時系列 // XC: 状態x(t)の時系列 // UC: 入出力ベクトルの時系列 //数値解を表示する.横軸 t, 縦軸 x(t) mgplot(1,TC,XC); print TC >> "TC.ode"; print XC >> "XC.ode"; print UC >> "UC.ode"; } |
// diff_eqs() は微分方程式を記述する関数 Func void diff_eqs(DX,t,X,UY) Real t; Matrix X,DX,UY; { Matrix xp,up,dxp; xp = X; // X はx(t)を表している. up = UY; //UYは使用しない dxp = -2 * xp; //微分方程式 DX = [dxp]; //最後に速度をDXに渡す } // link_eqs() は複数の微分方程式の関係を記述する関数 Func void link_eqs(UY,t,X) Real t; Matrix UY,X; { Matrix xp,up; xp = X; // X はx(t)を表している. // 最後にUYに時刻tの値を渡す. // とりあえずx(t)をいれておく. UY = [xp]; } |
Ode()
がシミュレーションを行う
関数です.diff_eqs()
には微分方程式を記述します.
link_eqs()
は後に説明します.
Ode()
の引数の説明については,[1]の索引で
Ode()
を調べてみてください.
さて,グラフは次のようになり,前のx(t) = 5 e-2tと一致します.