next up previous
Next: バネマスダンパ系のフィードバック制御:PD制御 Up: 線形システムのシミュレーション Previous: 状態空間表現モデルのシミュレーション

バネマスダンパ系のシミュレーション

それでは具体例として,(7)のバネマスダンパ系の シミュレーションを考えます.  
 \begin{displaymath}
M \ddot{x}(t) + C \dot{x}(t) + K x(t) = u(t) + d(t)
,\hspace*{1zw} x(0)=x_{01}, \dot x(0)= x_{02}\end{displaymath} (7)
ここでu(t)は制御入力,d(t)は外乱とします.
\includegraphics [width=10cm,clip]{mck2.ps}
(7)が次の状態空間表現によって記述できることは 簡単に確かめられます.  
 \begin{displaymath}
\dot {\bf x}(t) = A {\bf x}(t) + B \left[ u(t) + d(t) \right]\end{displaymath} (8)

\begin{displaymath}
A :=
\left[
\begin{array}
{rr}
0 & 1 \\ - K/M & - C/M \\ \en...
 ...zw}
B :=
\left[
\begin{array}
{r}
0 \\ 1/M\\ \end{array}\right]\end{displaymath}

ここでパラメータを次のようにしたときの シミュレーション結果は次のようになります.

\begin{displaymath}
K=1.0
,\hspace*{1zw}
C=0.1
,\hspace*{1zw}
M=1.0
,\hspace*{1z...
 ...bf x}(0) :=
\left[
\begin{array}
{rr}
1 & 0\end{array}\right]^T\end{displaymath}

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

x(t)は徐々に収束しているのですが,ダンピング係数Cが小さいために なかなか収束しません.さらに外乱として, d(t) = 0.5を加えたグラフは次のようになります.

\includegraphics [width=7cm,clip]{mck_plot_nofbd.ps}
外乱の影響でx(t)がではなく0.5に収束してしまっているのが 分ります.

これらのプログラムは次のようになります.




/*
   "mcknofb.mm"
   Simulation of the following system:
   M x^(2) + C x^(1) + K x = u + d
   u = 0, d = 0 or d = 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 = 20.0;  //シミュレーションの終了時刻を t=20 にする

	x0 = [1.0,0.0]';  //初期状態を x(0)=[1.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(1,*));
//  XC(1,*)はXCの1行目を表す

//  ファイルに保存
	print TC >> "TC.mat";
	print XC >> "XC.mat";
	print UC >> "UC.mat";
}



 

// diff_eqs() は微分方程式を記述する関数
Func void diff_eqs(DX,t,X,UY)
Real t;
Matrix X,DX,UY;
{
	Real K,C,M;
	Matrix xp,up,dxp;
	Matrix A,B;
	Matrix d;

//  物理パラメータの設定
	K = 1.0; C = 0.4; M = 1.0;

//  A,Bの設定
	A = [[0,1][-K/M,-C/M]];
	B = [0,1/M]';

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

//  link_eqs()で計算したUYを代入する.
//  ここではUY=[0]
	up = UY;

//  外乱dの設定
	d = [0.0];
//	d = [0.5];

//  微分方程式
	dxp = A * xp + B * (up + d);

//  最後に速度をDXに渡す
	DX = [dxp];
}

// link_eqs() は複数の微分方程式の関係を記述する関数
Func void link_eqs(UY,t,X)
Real t;
Matrix UY,X;
{
	Matrix xp,up;

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

//  最後にUYにupの時刻tの値を渡す.
//  ここでは0を渡す
	UY = [0];
}



``mcknofb.mm'': バネマスダンパ系のシミュレーション(フィードバック無)


Kenichiro Nonaka
5/15/1998