【本章のねらい】 ・ 振子を例に,MAXIMAを用いて,非線形運動方程式を計算し,非線形状態方程式を求める。また,平衡状態のまわりで線形化して,線形状態方程式を求め,安定性と可制御性の判定を行う。 ・ 振子の線形状態方程式を用いて,積分動作を加えた状態フィードバックのLQI設計を行い,これを非線形状態方程式に適用して,安定化シミュレーションを行う。 |
* http://ja.wikipedia.org/wiki/Maximaを参照。
7.1 非線形システムのモデリングの例
次の例題を考える。
例題7.1 図7.1の振子を考える。MAXIMAを用いて,非線形運動方程式を計算し,これから非線形状態方程式を求めよ。さらに,平衡状態のまわりで線形化して,線形状態方程式を求めよ。
解答 運動エネルギー (),ポテンシャルエネルギーから,ラグランジュ関数を得て,これをラグランジュ方程式 に代入する。この計算をMAXIMAを用いて行うためには,コマンド |
/*pen*/ dth:’diff(th(t),t); ddth:’diff(th(t),t,2); x:ell*sin(th(t)); y:ell*cos(th(t)); J:(1/3)*m*ell^2; T:(1/2)*m*(diff(x,t)^2+diff(y,t)^2)+(1/2)*J*dth^2; V:m*g*ell*cos(th(t)); L:T-V; LE:diff(diff(L,dth),t)-diff(L,th(t))=0,trigreduce; sol:solve(LE,ddth); f:matrix([dth],[rhs(sol[1])]); |
を与えればよい。すなわち,非線形運動方程式は次式により得られる。
これより,非線形状態方程式 が求められる。平衡状態は () のように求められる。この平衡状態のまわりで,の右辺を1次近似して を得る。この計算をMAXIMAを用いて行うためには,コマンド |
A:matrix([diff(f[1,1],th(t)),diff(f[1,1],dth)], [diff(f[2,1],th(t)),diff(f[2,1],dth)]); |
を与えればよい。すなわち,線形状態方程式は,次式のように求められる。
この線形状態方程式は,平衡状態近傍では, と近似できるので,これを非線形運動方程式に代入し を得て,これから直接求めることもできる。 |
演習7.1 例題7.1において,のとき,つぎの初期値について,Simulinkを用いて,非線形状態方程式と安定な線形状態方程式による時間応答を比較せよ。 (1) (2) |
例題7.2 図7.2の台車によって駆動される振子を考える。MAXIMAを用いて,非線形運動方程式を計算し,これから非線形状態方程式を求めよ。さらに,平衡状態のまわりで線形化して,線形状態方程式を求めよ。
解答 台車の運動エネルギーは,振子の運動エネルギーは に代入する。この計算をMAXIMAを用いて行うためには,コマンド |
/*pend*/ dr:’diff(r(t),t); ddr:’diff(r(t),t,2); dth:’diff(th(t),t); ddth:’diff(th(t),t,2); T0:(1/2)*M*diff(r(t),t)^2; x1:r(t)+ell*sin(th(t)); y1:ell*cos(th(t)); J1:(1/3)*m*ell^2; T1:(1/2)*m*(diff(x1,t)^2+diff(y1,t)^2)+(1/2)*J1*dth^2; V1:m*g*y1; L:T0+T1-V1; LE1:diff(diff(L,dr),t)-diff(L,r(t))=F,trigreduce,ratsimp; LE2:diff(diff(L,dth),t)-diff(L,th(t))=0,trigreduce,ratsimp; sol:solve([LE1,LE2],[ddr,ddth]); |
を与えればよい。この結果から,非線形運動方程式
\\ が得られる。これより,非線形状態方程式 が求められる。平衡状態は,より,,したがって,を満足することから (), のように求められる。この平衡状態近傍で,の右辺を1次近似して
を得る。この計算をMAXIMAを用いて行うためには,コマンド |
f:matrix([dr],[dth],[rhs(sol[1][1])],[rhs(sol[1][2])]); a31:diff(f[3,1],r(t)); a32:diff(f[3,1],th(t)); a33:diff(f[3,1],dr); a34:diff(f[3,1],dth); a41:diff(f[4,1],r(t)); a42:diff(f[4,1],th(t)); a43:diff(f[4,1],dr); a44:diff(f[4,1],dth); b3:diff(f[3,1],F); b4:diff(f[4,1],F); A:matrix([0,0,1,0],[0,0,0,1],[a31,a32,a33,a34], [a41,a42,a43,a44]); B:matrix([0],[0],[b3],[b4]); A1:A,th(t)=0,F=0,trigreduce,ratsimp; B1:B,th(t)=0,F=0,trigreduce,ratsimp; A2:A,th(t)=%pi,F=0,trigreduce,ratsimp; B2:B,th(t)=%pi,F=0,trigreduce,ratsimp; |
を与えればよい。この結果から,のときの線形状態方程式は
となる。また,のときの線形状態方程式は,{\tt th(t)=\%pi} \\
|
演習7.2 例題7.2の振子を軸支した台車を,図7.3のように傾斜角の台上に置いた。MAXIMAを用いて,非線形運動方程式を計算し,これから非線形状態方程式を求めよ。さらに,平衡状態のまわりで線形化して,線形状態方程式を求めよ。
|
例題7.3 例題7.2の台車によって駆動される振子について,そこで求めた状態方程式に基づいて,MAXIMAを用いて,漸近安定性と可制御性について調べよ。
解答 まず,安定性を調べるために,行列の固有値を計算する。これは,MAXIMAに,のコマンドを与えればよい。 |
lambda:eigenvalues(A1); |
その結果,の場合,となり,また,の場合,となる。どちらとも,漸近安定とはいえない。
つぎに,可制御性を,行列の固有値に基づいて調べるためには,各固有値について,行列の階数が次数4に等しいことを確認すればよい。これは,の場合,MAXIMAに |
rank(addcol(A1-lambda[1][1]*ident(4),B1)); rank(addcol(A1-lambda[1][2]*ident(4),B1)); rank(addcol(A1-lambda[2][1]*ident(4),B1)); rank(addcol(A1-lambda[2][2]*ident(4),B1)); |
% For[i = 1, i 4, % W=MapThread[Append,{A-lambda[[i]] IdentityMatrix[4],B}]; % Print[MatrixRank[W]]; i++] のコマンドを与えればよい。その結果,階数はすべて4と計算され,可制御性が成り立つ。の場合も同様である。 |
演習7.3 例題7.3を,のとき,MATLABにより検討せよ。 |
7.2 非線形系に対する線形制御の適用
つぎの例題を考える。
例題7.4 例題7.2の台車によって駆動される倒立振子について,台車の位置と振子の角度が計測できるものとする。このとき,振子を倒立状態に保ちながら,台車を指定位置まで移動させるための,積分動作を加えた状態フィードバックを求めよ。ただし,とする。
解答 まず,出力方程式として を得る。また,台車の位置は のように表される。このとき,正方行列 は正則である。したがって,次式が定まる。 つぎに,偏差系 に対する評価関数を,たとえば のように設定する。ここで,とは,それぞれ閉ループ系における台車位置と角度の時間応答の速さ(どれくらいの時間である値に到達するか)を表している。たとえば,台車を5秒間に50cm移動させるとき,周期の振子は3度以内の振れに抑えることが妥当と考えられるときは,とと与える。つぎに,は駆動系の時間応答の速さを考慮して選ぶ。 制御目的を達成する積分動作を加えた状態フィードバック ただし, は,上の評価関数を最小にするように,状態フィードバック を求め,次式からとを定めればよい。 以上の計算を,MATLABで行うためには |
%pend.m global M m ell g th0 M=1; m=0.1; ell=0.25; g=9.8; th0=3/180*pi; E=[M+m m*ell;m*ell (4/3)*m*ell^2]; A21=-E\[0 0;0 -m*ell*g]; A=[zeros(2) eye(2);A21 zeros(2)] B2=E\[1;0]; B=[zeros(2,1);B2] CM=[1 0 0 0;0 1 0 0]; CS=[1 0]; C=CS*CM; AE=[A B;zeros(1,5)]; BE=[zeros(4,1); 1]; CE=eye(5); Tcart=0.1; Kr=0.5; Tpend=(1/4)*(2*pi*sqrt(4/3*ell/g)); Kth=5/180*pi; Tamp=0.1; Kamp=5; q1=1/Kr; q2=1/Kth; q3=Tcart/Kr; q4=Tpend/Kth; q5=1/Kamp; QE=diag([q1 q2 q3 q4 q5].^2); RE=(Tamp/Kamp)^2; [FE,pAE]=opt(AE,BE,CE,QE,RE) FE=FE/[A B;C 0]; F=FE(:,1:4); FI=FE(:,5); ACL=[A-B*F -B*FI;C 0]; BCL=[zeros(4,1);-0.5]; CCL=[CM zeros(2,1);-F -FI]; DCL=[zeros(2,1);0]; sys=ss(ACL,BCL,CCL,DCL); step(sys) |
を与えればよい。 |
もちろん,これらは重み係数の初期値であり,実際には調整を伴うことはいうまでもない。
演習7.4 演習7.3のように,振子を軸支した台車を傾斜角の台上に置く場合,例題7.4と同様の設計を行え。 |
例題7.5 例題7.4で設計した積分動作を加えた状態フィードバックを,非線形ダイナミクスを表す非線形状態方程式と結合して,閉ループ系の時間応答をシミュレーションせよ。
解答 まず,非線形状態方程式を,つぎのS-functionで記述する。 |
%spend.m function [sys,x0]=spend(t,state,input,flag) global M m ell g th0 if abs(flag)==1 u =input(1); r =state(1); th =state(2); dr =state(3); dth=state(4); Mp=[M+m m*ell*cos(th); m*ell*cos(th) (4/3)*m*ell^2]; Cp=[0 -m*ell*dth*sin(th);0 0]; Gp=[0; -m*ell*g*sin(th)]; sys=[dr;dth;Mp\(-Cp*[dr;dth]-Gp+[u;0])]; elseif flag==3, sys=state(1:2); elseif flag==0 sys=[4;0;2;1;0;0]; x0=[0;th0;0;0]; else sys=[]; end |
つぎに,Simulink上に
のように,このS-functionブロックと例題??で設計した積分動作を加えた状態フィードバックを接続して,シミュレーションを行う。 |
演習7.5 演習7.4で設計した積分動作を加えた状態フィードバックを,非線形ダイナミクスを表す非線形状態方程式と結合して,閉ループ系の時間応答をシミュレーションせよ。 |
演習問題の解答
【演習7.1】Simulinkを用いて,次図のブロック線図を作成する。
上半分が非線形運動方程式を,下半分が平衡状態まわりの線形運動方程式を表している。角度を得る積分器の初期値は,非線形運動方程式の場合はを,線形運動方程式の場合はを与えることに注意する。すなわち,(1)では,非線形運動方程式の場合はを,線形運動方程式の場合はを与える。また,(2)では,非線形運動方程式の場合はを,線形運動方程式の場合はを与える。 |
【演習7.2】非線形運動方程式を求める計算をMAXIMAを用いて行うためには |
/*pend2*/ dr:’diff(r(t),t); ddr:’diff(r(t),t,2); dth:’diff(th(t),t); ddth:’diff(th(t),t,2); x0:r(t)*cos(alpha); y0:r(t)*sin(alpha); T0:(1/2)*M*(diff(x0,t)^2+diff(y0,t)^2); V0:M*g*y0; x1:x0+ell*sin(th(t)); y1:y0+ell*cos(th(t)); J1:(1/3)*m*ell^2; T1:(1/2)*m*(diff(x1,t)^2+diff(y1,t)^2)+(1/2)*J1*dth^2; V1:m*g*y1; L:T0+T1-V0-V1; LE1:diff(diff(L,dr),t)-diff(L,r(t))=F,trigreduce,ratsimp; LE2:diff(diff(L,dth),t)-diff(L,th(t))=0,trigreduce,ratsimp; sol:solve([LE1,LE2],[ddr,ddth]); |
のコマンドを与えればよい。この結果から,非線形運動方程式 が得られる。これより,平衡状態は (), () のように求まる。のときの線形状態方程式は \\ |
【演習7.3】 |
%pend.m M=1; m=0.1; ell=0.25; g=9.8; E=[M+m m*ell;m*ell (4/3)*m*ell^2]; A21=-E\[0 0;0 -m*ell*g]; A=[zeros(2) eye(2);A21 zeros] B2=E\[1;0]; B=[zeros(2,1);B2] r=eig(A) tol=1e-6; for i=1:4, k=rank([B A-r(i)*eye(4)],tol), end |
【演習7.4】次を実行し,あとは例題7.4と同様に行えばよい。 |
%pend2.m M=1; m=0.1; ell=0.25; g=9.8; alpha=5/180*pi; a32=-(3*m*g*cos(alpha))/(7*M+(11-3*cos(2*alpha))/2*m); a42=(3*(M+m)*g)/(7*M+(11-3*cos(2*alpha))/2*m)/ell; b3=7/(7*M+(11-3*cos(2*alpha))/2*m); b4=-3/(7*M+(11-3*cos(2*alpha))/2*m)/ell; A21=[0 a32;0 a42]; A=[zeros(2) eye(2);A21 zeros(2)] B2=[b3;b4]; B=[zeros(2,1);B2] |
【演習7.5】まず,非線形ダイナミクスを,つぎのS-functionで記述する。 |
%spend2.m function [sys,x0]=spend2(t,state,input,flag) M=1; m=0.1; ell=0.25; g=9.8; th0=0; alpha=5/180*pi; if abs(flag)==1 u=input(1); r=state(1); th=state(2); dr=state(3); dth=state(4); Mp=[M+m m*ell*cos(th+alpha); m*ell*cos(th+alpha) (7/3)*m*ell^2]; Cp=[0 -m*ell*dth*sin(th+alpha);0 0]; Gp=[0; -m*ell*g*sin(th)]; sys=[dr;dth;Mp(-Cp*[dr;dth]-Gp+[u-(M+m)*g*sin(alpha);0])]; elseif flag==3 sys=state(1:2); elseif flag==0 sys=[4;0;2;1;0;0]; x0=[0;th0;0;0]; else sys=[]; end |
Simulink上に,このS-functionブロックと,演習7.4で設計した積分動作を加えた状態フィードバックを記述して,シミュレーションを行う。詳細は割愛する。 |