粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

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

Downloads | SeDuMi

単にダウンロード MATLAB直下に解凍。

SDP3

SDPT3 Ver3-4をダウンロード。 MATLAB直下に解凍。

その後,解凍したディレクトリに移動して以下のコマンドを実行します。

Installmex(1)

YALMIP

実はYALMIP単体でもそれなりにソルバはありますが,SDP(半正定値計画問題)を解くには上記のソルバが必要です。

yalmip.github.io

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によるシステム制御 - ロバスト制御系設計のための体系的アプローチ

LMIによるシステム制御 - ロバスト制御系設計のための体系的アプローチ

プログラム

-パラメータ設定(状態方程式

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とかだと解けたりするんでしょうか? イマイチわかりきっていないところがあります。