next up previous
Next: バネマスダンパ系のシミュレーション Up: 線形システムのシミュレーション Previous: 1次微分方程式の数値解

状態空間表現モデルのシミュレーション

前節では,次式のシミュレーションを行いました.

\begin{displaymath}
\dot x(t) = -2 x(t),\hspace*{1cm}x(0)=5\end{displaymath}

MaTXでは,この1次の常微分方程式の形なら 数値シミュレーションを行うことができます. それでは,次の$3\times 1$のベクトル${\bf x}(t)$の1次の常微分方程式の シミュレーションを行ってみましょう.  
 \begin{displaymath}
\dot {\bf x}(t) = A {\bf x}(t)\end{displaymath} (6)

\begin{displaymath}
A :=
\left[
\begin{array}
{rrr}
0 & 1 & 0\\ 0 & 0 & 1\\ -2 &...
 ...}(0) :=
\left[
\begin{array}
{r}
1\\ 0\\ 0\\ \end{array}\right]\end{displaymath}

まずは,シミュレーション結果から. グラフが3本ありますが,``data-1'',``data-2'',``data-3''が それぞれ${\bf x}(t)$の第1,2,3成分です.
\includegraphics [width=7cm,clip]{vec3diffeqn_plot.ps}
プログラムのリストを下記に示します. 変更する部分は2個所です.



//   "vec3diffeqn.mm"
//   Simulation of the following system:
//   \dot x = A x
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 にする

//変更(1)
//初期状態を x(0)=[1.0,0.0,0.0]' にする
	x0 = [1.0,0.0,0.0]';

	h = 1.0e-3; // シミュレーションの刻を1msecにする
	dtsav = 1.0e-2;// データは10msecおきに保存する

	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;
//変更(2)
	Matrix A;

	A = [[0,1,0][0,0,1][-2,-3,-2]];

	xp = X; // X はx(t)を表している.

	up = UY; //UYは使用しない

	dxp = A * 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];

}



``vec3diffeqn.mm'': 3次システムのシミュレーション


Kenichiro Nonaka
5/15/1998