Home Work 7.2
[P] よく多変数制御というけど、制御対象の運動の複数の自由度を同時に操ることを意味しているのであれば、本当にできるのかなと思ってしまう。
[C] 制御対象の可制御性と可観測性を前提とし、2次形式評価関数を最小化する状態FBを求めるLQ制御は、多変数制御のための強力なツールとなっているらしいよ。
[M] その導出は、基本的には1入力系の場合と同じアプローチでできて、最終的にはリッカチ方程式という行列の2次方程式を解くことになるんだ。
Flipped Classroom 7.2
[1] 仮にとしても、閉ループ2次系の減衰係数はとなっており、十分減衰がかかっていることを意味しています。
[2] 著者は、プログラムopt.mを用いて、多くの制御問題を解いてきました。世界一重要なツールと言っても過言ではないと思っています。
Home Work 7.1 [P] 平衡状態から外れたとき、これを戻すためには、いろいろな「軌道(時系列)」があると思うけど、何かリーズナブルな決め方はあるのかな? [C] 状態変数の振る舞い(2乗面積)と操作変数の振る舞い(2乗面積)のトレードオフを計ることがよく行われているよ。 [M] トレードオフの意味だけど、高校で、次の関数の最小値を求める問題があったね。 右辺第1項は増加関数、第2項は減少関数だから、グラフを描いてみると、最小値が生まれているよね。 Flipped Classroom 7.1 評価関数はスカラ値を取るので、定数倍してもOKだから、で割ると、 これからは操作のためのコストとみなせます。すなわちコストがより小さくなると、操作はより大きな振る舞いが許されます。のときはcheap controlと呼ばれます。 を解くと の場合の固有ベクトルは すなわち の場合(と規格化する場合)は したがって
n次系の周波数応答 次の漸近安定な1入力1出力次系の状態空間表現を考えます。 このとき、正弦波入力 に対する零状態応答を計算します。そのために を、零状態応答の式 に代入して ここでとすると これから正弦波入力(3)に対する零状態応答は、のとき次式で与えられます。 これは、入力が正弦波のときは、時間が十分立てば、出力も正弦波となることを示しています。その振幅と位相はそれぞれの絶対値と偏角となっています。
Home Work 6.3 [P] 物理の言葉ではないと思うけど、無定位系とよばれる制御対象があるよ。モータやビークルのように、復原項がない場合は、位置が定まらないという意味らしい。無定位系では、位置についてステップ応答の実験ができないよね。 [C] 単位フィードバックを行えば、ステップ応答の実験ができるのだけど、フィードバックの知識がないと気が付かないかな。 [M] 位置と速度を状態変数にもつ無定位系 に対して、単位フィードバック によって復原項を入れると、次のような2次系になるからだね。 Flipped Classroom 6.3 [2] のとき、インパルス応答を積分して、ステップ応答は次のように計算されます。 のとき、インパルス応答を積分して、ステップ応答は次のように計算されます。 のとき、インパルス応答を積分して、公式 を用いて、ステップ応答は次のように計算されます。 [3] ヒントより、だから [4] [5]
Home Work 6.2 [P] 一般にインパルス応答を実験で求めようとすると大変そうだね。構造試験ではインパルス・ハンマーという道具が使用されるらしいけど、やはりインパルス応答が調べられているんだね。 [M] インパルス応答の定義式(6.24)をよく見てみると、 となっていて、これはの場合の零入力応答を並べたものと言えるね。そうすると、数学的には、インパルス応答は初期値をの各列ベクトルに設定したときの応答ということになるね。 [C] この考え方は、非線形シミュレータで適当な初期値を与えたいときに役に立ちそうだね。 Flipped Classroom 6.2 を解くと これは次のように場合分けされます。 のとき、 のとき、 のとき、 [2] のとき となることから、インパルス応答は次のように計算されます。 のとき、とおいて となることから、インパルス応答は次のように計算されます。 のとき、とおいて となることから、インパルス応答は次のように計算されます。
Home Work 6.1 [P] 1次系の実用例としては、心臓のペースメーカがあるね。これはRC電気回路で、コンデンサへの充放電を繰り返しているよ。 [M] コンデンサの放電はいわゆる零入力応答(初期値応答)だけど、一般の外部入力があるときは非斉次微分方程式となって、数学的には面倒だね。でもテキストの説明は比較的わかりやすいかな。 [C] 1次系と言えば時定数、その説明には2通り(初期値応答またはステップ応答を用いて)あるかな。船舶分野では、1次系を「野本モデル」とよび、世界的に通用するらしいよ。その時定数は船が真っすぐ進むかどうか(進路安定性)の判断に使われ、なんと時定数が負の場合もあるというから驚きだね。 Flipped Classroom 6.1 ちなみに、(6.8)を用いた場合 [2] における接線の式は、傾きが、切片がだから これがの値をとる時刻はとなります。また、だから [3] 図6.2の〇で示す点をクリックすればよいと言えます。
まず穴埋め問題の解答を示します。太字がキーワードなので、確認してください。 [1] 制御対象の状態空間表現が与えられているとする。これは「状態方程式」と観測方程式からなる。ここで、はそれぞれ次数をもつベクトル、はそれぞれサイズをもつ行列である。また、初期状態「」は、平衡状態を表すように選ばれているものとする。 [2] いま、何らかの外乱により平衡状態が乱され、となったとする。このとき、次第に平衡状態に戻るとき、すなわちとなるとき、制御対象は「漸近安定」であるという。そのための条件は、行列が安定行列、すなわち行列の「すべての固有値の実部が負」であることである。 [3] いま、制御対象が安定ではないとき、これを「状態フィードバック」により安定化したい。すなわち、閉ループ系の行列「」を安定行列としたい。それが可能かどうか調べるためには、「可制御」性の条件「」が成立するかどうかをチェックすればよい。 [4] 状態フィードバックを実施するためには、全ての状態変数を、「センサ」を用いて計測する必要がある。しかし、これはいつも可能とは限らないので、状態変数の値を漸近的に推定する「状態オブザーバ」が用いられる。これは、となるように、オフザーバゲインを選択することにより達成される。それが可能かどうか調べるためには、「可観測」性の条件「」が成立するかどうかをチェックすればよい。 [5] 状態フィードバックを状態オブザーバを用いて、のように実施するとき、状態空間表現、を「オブザーバベース」コントローラと呼ぶ。これによる閉ループ系の固有値の集合は、行列「」の固有値の集合と行列「」の固有値の集合の和集合となることが知られている。したがって、状態フィードバックと状態オブザーバの設計は独立に行うことができる。ただ、制御動作より状態推定が速く行われなければならないので、複素平面上で、行列「」の固有値は行列「」の固有値のより左寄りとすることが考えられる。 【選択肢】 (a) 発展方程式、(b) 状態方程式、(c)、(d)、(e)安定、(f)漸近安定、(g)不安定、(h)すべての固有値の実部が負、(i)ある固有値の実部が負、(j)すべての固有値の実部が正、(k)ある固有値の実部が正、(l)状態フィードバック、(m)状態オブザーバ、(n)、(o)、(p)、(q)可制御、(r)可観測、(s)可安定、(t)可検出、(u)、(v)、(w)アクチュエータ、(x)センサ、(y)PID、(z)オブザーバベース 次に、可検出性と可観測性の証明は、とりあえず次を参照してください。
Home Work [M] 数学的には、 において、行列とが対角ブロックに位置し、上三角ブロック行列になるので、2つの行列の固有値がそのまま分離することを言っているのかな。 [C] 上式は、状態オブザーバの推定誤差の振舞いは、状態フィードバックによる制御動作に影響を及ぼさないことを意味しているよ。でも状態推定がもたもたしていると、望ましい状態フィードバックができなくなるので、行列との固有値の相対的位置関係に注意が必要となるのかな。Flipped Classroomで考えるようだね。 [P] 制御と観測の話が分離してしまうというのは、なんだか理論がよくできていると思うけど、偶然なのかな、それとも必然なのかな? Flipped Classroom に対するオブザーバベース・コントローラ による閉ループ系の状態方程式は すなわち [2] 次式が成り立ちます。 ここで、2通りの対応付けが考えられます。 一方、の関係より、、だから、上の対応付けでは、次が成り立ちます。 ここで、は、状態推定の速さ()が制御動作()より遅いこと意味し、望ましくありません。しかし、は、状態推定の速さ()が制御動作()より速いこと意味し、こちらの方が望ましいと言えます。 [3] n次系 に対する状態オブザーバ の出力を用いて、制御則 を実施するとします。このときの閉ループ系の状態方程式は すなわち ここで、座標変換 を行うと したがって
Home Work [P] もし状態変数の一部が観測変数そのものであれば、状態オブザーバは既知の観測変数も推定しており、無駄なことをしているというのが、低次元化の動機かな? [M] 出力方程式の他に、別の補完的かつ仮想的な観測方程式を考えて、これを推定する仕組みを導入したわけだよね。 [C] 状態フィードバックの実施のために、状態オブザーバの出力を用いるのであれば、一気にそのものを推定することも考えられているよ。 Flipped Classroom 5.2 [2] (5.23)と(5.24)はそのままで、(5.26)が次式となります。
Home Work 5.1 [C] 状態オブザーバは、当時学生だったルーエンバーガーが企業研修相当の機会で発明したものだと聞いたことがあるよ。実際、wikipediaには、次の記述があるね。 In his dissertation Luenberger introduced new methods for construction of state observers. The celebrated Luenberger observer is named after him. [P] えー、すごいね。どうやって、見つけたのだろうか?やはり、推定誤差をネガティブ・フィードバックすれば、その誤差は小さくなるはずだと思ったのだろうね? [M] 状態フィードバックによる安定化問題は、行列とを用いて、可安定性や可制御性として論じられるけど、状態オブザーバの構成問題は、行列とを用いて、可検出性や可観測性として論じられているね。何せセンサの不足を補えるのだから、とてつもなく便利だよね。 Flipped Classroom 5.1 だから これが右辺 に等しいので [2] の値によって状態推定の様子がどう違うを観察し、どちらの値が望ましいかをどう判定すればよいかを考えてみてください。 (図5.3左図は縦軸の単位はradですが、Program 51ではdegに変換しています。配布するプログラムは、図5.3をそのまま出力します。)
CT71 1次系のLQ制御
[1]
[2] CT64 補遺6
CT63 2次系のステップ応答
[1] CT62 2次系のインパルス応答
[1] CT61 1次系の応答
[1] (6.9)を用いた場合CT54 補遺5
CT53 分離定理
[1] 1次系CT52 低次元化
[1] 図5.4の左図は観測変数がそのままでており、右図は観測できない状態変数を推定する様子を示しています。ここで、低次元化されたオブザーバは観測出力からの直達項の影響を受けていることに注意してください。
訂正 図5.4を出力するProgram 52は、最新のものではありませんでした。最新のp52a.m、p52a.sceを入手してください。図5.4はOKです。
MATLAB
%MATLAB: p52a.m (2024/5/1修正)
Tm=0.01; KE=0.05;
x0=[1;10];
t=0:0.001:0.05;
[t1,x1]=ode45(@(t,x) [0 1; 0 -1/Tm]*x+[0;1/Tm/KE],t,x0);
%-----Part 1
alpha=1.2
L=-(1-alpha)/Tm;
%[t2,x2]=ode45(@(t,x) (-1/Tm-L)*x,t,-x0);
[t2,x2]=ode45(@(t,x) (-1/Tm-L)*x,t,-[-L 1]*x0);
%-----Part 2
alpha=1.8
L=-(1-alpha)/Tm;
%[t3,x3]=ode45(@(t,x) (-1/Tm-L)*x,t,-x0);
[t3,x3]=ode45(@(t,x) (-1/Tm-L)*x,t,-[-L 1]*x0);
%-----
subplot(121), plot(t,x1(:,1)), hold on
subplot(121), plot(t,x1(:,1),'-.')
subplot(121), plot(t,x1(:,1),'--')
grid, axis([0 0.05 0 2])
legend('theta','alpha=1.2','alpha=1.8');
xlabel('t'), ylabel('theta(t)')
subplot(122), plot(t,x1(:,2)), hold on
%subplot(122), plot(t,x1(:,2)+x2(:,2),'-.')
%subplot(122), plot(t,x1(:,2)+x3(:,2),'--')
subplot(122), plot(t,x1(:,2)+x2,'-.')
subplot(122), plot(t,x1(:,2)+x3,'--')
%grid, axis([0 0.05 0 30])
grid, axis([0 0.05 0 80])
legend('omega','alpha=1.2','alpha=1.8');
xlabel('t'), ylabel('omega(t)')
SCILAB
//SCILAB: p52a.sce (2024/5/1修正)
Tm=0.01; KE=0.05;
function dx=f1(t,x),dx=[0 1; 0 -1/Tm]*x+[0;1/Tm/KE], endfunction
x0=[1;10];
t0=0; t=0:0.001:0.05;
x1=ode(x0,t0,t,f1);
//-----Part 1
alpha=1.2
L=-(1-alpha)/Tm;
function dx=f2(t,x),dx=(-1/Tm-L)*x, endfunction
//x2=ode(-x0,t0,t,f2);
x2=ode(-[-L 1]*x0,t0,t,f2);
//-----Part 2
alpha=1.8
L=-(1-alpha)/Tm;
//x3=ode(-x0,t0,t,f2);
x3=ode(-[-L 1]*x0,t0,t,f2);
//-----
subplot(121),plot(t,x1(1,:))
subplot(121),plot(t,x1(1,:),'-.')
subplot(121),plot(t,x1(1,:),'--')
mtlb_grid, mtlb_axis([0 0.05 0 2])
legend(['theta';'alpha=1.2';'alpha=1.8']);
xlabel('t'), ylabel('theta(t)')
subplot(122),plot(t,x1(2,:))
//subplot(122),plot(t,x1(2,:)+x2(2,:),'-.')
//subplot(122),plot(t,x1(2,:)+x3(2,:),'--')
subplot(122),plot(t,x1(2,:)+x2,'-.')
subplot(122),plot(t,x1(2,:)+x3,'--')
//mtlb_grid, mtlb_axis([0 0.05 0 30])
mtlb_grid, mtlb_axis([0 0.05 0 80])
xlabel('t'), ylabel('omega(t)')
legend(['omega';'alpha=1.2';'alpha=1.8']);
CT51 状態オブザーバ
[1] (5.18)の左辺を計算すると