next up previous
Next: 状態空間表現モデルのシミュレーション Up: 線形システムのシミュレーション Previous: 常微分方程式

1次微分方程式の数値解

例としてつぎの線形1次常微分方程式を扱います.  
 \begin{displaymath}
\dot{x}(t) = - 2 x(t), \hspace*{1zw} x(0) = 5\end{displaymath} (4)
この方程式の解が次のようになることは良く知られています. (高校の微積分)

 
x(t) = 5 e-2 t (5)

この関数のグラフは次のようになります.
\includegraphics [width=7cm,clip]{1stdiffeqn_plot.ps}

ここでは,(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];

}



``1stdiffeqn.mm'': $\dot x(t) = -2 x(t)$, x(0)=5のシミュレーションプログラム
プログラムリストの中のOde()がシミュレーションを行う 関数です.diff_eqs()には微分方程式を記述します. link_eqs()は後に説明します. Ode()の引数の説明については,[1]の索引で Ode()を調べてみてください.

さて,グラフは次のようになり,前のx(t) = 5 e-2tと一致します.

\includegraphics [width=7cm,clip]{1stdiffeqn_plot.ps}


Kenichiro Nonaka
5/15/1998