MATLAB&YALMIPでLMIを解けるようになるまでの手順
Software Installation
ソルバはYALMIP以外にCVXgen等もありますが,どっちがいいんですかね?議論ありますが有識者の意見を聞きたいです。
Yalmipまわりのインストールは以下のスライドが比較的参考になります。2018年9月の時点ですでに情報は古いですがURL等は参考になるでしょう。 http://www.maizuru-ct.ac.jp/control/kawata/iscie/doc/install_yalmip_new.pdf
SeDuMi
単にダウンロード MATLAB直下に解凍。
SDP3
SDPT3 Ver3-4をダウンロード。 MATLAB直下に解凍。
その後,解凍したディレクトリに移動して以下のコマンドを実行します。
Installmex(1)
YALMIP
実はYALMIP単体でもそれなりにソルバはありますが,SDP(半正定値計画問題)を解くには上記のソルバが必要です。
addpath(genpath('C:\Users\<ユーザ名>\Documents\MATLAB\SeDuMi_1_3')) addpath(genpath('C:\Users\<ユーザ名>\Documents\MATLAB\SDpt3-4.0')) addpath(genpath('C:\Users\<ユーザ名>\Documents\MATLAB\YALMIP-master')) yalmiptest
実行結果は以下のとおりです。とりあえずSDPは解けているようなのでOKです。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | Test| Solution| Solver message| +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ | Core functionalities| N/A| Successfully solved (YALMIP)| | LP| Correct| Successfully solved (LINPROG)| | LP| Correct| Successfully solved (LINPROG)| | QP| Correct| Successfully solved (QUADPROG)| | QP| Correct| Successfully solved (QUADPROG)| | SOCP| Correct| Successfully solved (SeDuMi-1.3)| | SOCP| Correct| Successfully solved (SeDuMi-1.3)| | SOCP| Correct| Successfully solved (SeDuMi-1.3)| | SDP| Correct| Successfully solved (SeDuMi-1.3)| | SDP| Correct| Successfully solved (SeDuMi-1.3)| | SDP| Correct| Successfully solved (SeDuMi-1.3)| | SDP| Correct| Successfully solved (SeDuMi-1.3)| | MAXDET| Correct| Successfully solved (SeDuMi-1.3)| | MAXDET| Correct| Successfully solved (SeDuMi-1.3)| | Infeasible LP| N/A| Infeasible problem (LINPROG)| | Infeasible QP| N/A| Infeasible problem (QUADPROG)| | Infeasible SDP| N/A| Infeasible problem (SeDuMi-1.3)| | Moment relaxation| Correct| Successfully solved (SeDuMi-1.3)| | Sum-of-squares| Correct| Successfully solved (SeDuMi-1.3)| | Bilinear SDP| N/A| No suitable solver| +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LMIの試験プログラム
状態FBでのレギュレーター設計問題を考えます。 LMIでは極配置では出来ない入出力制約等も考えられます。(解があるとは言っていない)
今回はただ単に極が-αより小さいという条件を設定します。
式の解説
ちょっと書くのが面倒なのでしばらくは(省略)。 2次形式のリアプノフ関数の安定化のための条件を解きます。
以下の教科書4章p80~を参照のこと。
LMIによるシステム制御 - ロバスト制御系設計のための体系的アプローチ
- 作者: 蛯原義雄
- 出版社/メーカー: 森北出版
- 発売日: 2012/03/08
- メディア: 単行本(ソフトカバー)
- クリック: 1回
- この商品を含むブログを見る
プログラム
-パラメータ設定(状態方程式)
k = 0.2; f = 0.01; A = [ 0 0 1 0; 0 0 0 1; -k k -f f; k -k f -f]; B = [ 0; 0; 1; 0];
- LMI 立式
αは0.1とします。あんまり大きくすると解けなくなるっぽい。極をある一定以上早くなるよう設定した上でγでフィードバックゲインKをなるべく小さくなるように縛ります。
X = sdpvar(4,4,'symmetric'); Y = sdpvar(1,4,'full'); gamma = sdpvar(1); LMI = [X>eye(4), A*X+B*Y+(A*X+B*Y).'+ 2*alpha*X<0,[gamma,Y;Y.', eye(4)]>0]; sol = solvesdp(LMI,gamma) X = double(X); Y = double(Y); gamma = double(gamma); K = Y/X; % LMI2 result pole = eig(A+B*K); display('Solved LMI pole') display(pole);
配置結果
ゲインを上げずにという制約があるので極の制約のギリギリを攻めるのは予想が付きます。 はいこんな感じ。
pole = -0.1000 + 0.6672i -0.1000 - 0.6672i -0.1000 + 0.0979i -0.1000 - 0.0979i
X>eyeとしているのは安全のためなのでこれを本来のX>0としてしまえばもう少しゆるい条件で解けそうと思っているのですがどうでしょう?。
やってみた所感
とりあえず動作を確認したまでで,LMIの利点を活かした設計などはまだ触れられていません。 ここまでのプログラムで一応ロバスト安定化制御器などは導けますが。
例えばalphaを3とかにするだけでInfeasibleになります。
あと,Successfully Solved
と出ても解けてなかったりして意外といろいろ気を配ります。
そもそもソルバに全部投げているのでCVXgenとかだと解けたりするんでしょうか? イマイチわかりきっていないところがあります。