SeDuMi / YALMIP
SeDuMi とは?
SeDuMi (Self-Dual-Minimisation Package) は Jos F. Sturm により開発されたフリーウェアの SDP ソルバ (LMI ソルバ) であり,MATLAB で利用可能です.本書では
第 II 部 (発展編) / 第 1 章 LMI と制御
第 II 部 (発展編) / 第 2 章 ディジタル制御 / 2.3 節 量子化入力制御
で利用します.ちなみに,「せでゅみ」と発音します.SeDuMi についての詳細は文献
やユーザーズガイド
を参照してください.2023/04/28 時点の最新バージョン (SeDuMi Ver. 1.3.2) は
https://github.com/sqlp/sedumi/archive/master.zip
からダウンロードできます.
本書では SeDuMi を利用していますが,MATLAB 標準の SDP ソルバである LMILAB を使用することも可能です.LMILAB は Robust Control Toolbox に含まれています.両者の比較は以下のとおりです.
● SeDuMi
利点
実行速度が速い
無償である (Robust Control Toolbox は不要 …… 購入しなくて良い)
欠点
信頼性がやや低い
● LMILAB
利点
信頼性が高い
欠点
実行速度がやや遅い
Robust Control Toolbox を購入する必要がある
YALMIP とは?
YALMIP (Yet Another LMI Parser) は Johan Lofberg に より開発されたフリーウェアの LMI パーサであり,本書では
第 II 部 (発展編) / 第 1 章 LMI と制御
で利用します.ちなみに,「やるみっぷ」と発音します.パーサ (parser) という言葉は聞き慣れないかもしれませんが,要は,MATLAB での LMI の記述を簡単にしてくれるプログラムのことです.YALMIP を使わないと,MATLAB での LMI の記述がかなり大変な作業となってしまいます!
YALMIP に関する 情報は開発者 (Johan Lofberg) の Web ページ
もしくは文献
を参照してください.最新バージョンは
https://github.com/yalmip/YALMIP/archive/master.zip
からダウンロードできます.
SeDuMi / YALMIP のインストール
配布ファイルを使用するための準備にインストール手順が記述されています.
SeDuMi / YALMIP の使用例
YALMIP を利用した LMI 求解の詳細は
川田:制御系解析・設計における数値計算/数式処理ソフトウェアの活用,システム/制御/情報, Vol. 55, No. 5, pp. 159-164 (2011)
川田,蛯原:LMI に基づく制御系解析・設計,システム/制御/情報, Vol. 55, No. 5, pp. 165-173 (2011)
市原:二乗和に基づく制御系解析・設計,システム/制御/情報, Vol. 55, No. 5, pp. 174-180 (2011)
およびそのサポートページ
https://www.maizuru-ct.ac.jp/control/kawata/iscie/kawata.html
https://www.maizuru-ct.ac.jp/control/kawata/iscie/kawata_ebihara.html
https://www.maizuru-ct.ac.jp/control/kawata/iscie/ichihara.html
が参考になります.
大雑把に説明すると,YALMIP を利用した LMI 求解のステップは以下のようになります.
安定性を上述の (b) 式により判別する例は
sample1_yalmip.m …… 安定
sample2_yalmip.m …… 不安定
を参照してください.
sample1_yalmip.m の実行結果
>> sample1_yalmip
A =
0 1
-10 -2
SeDuMi 1.3.5 by AdvOL, 2005-2008 and Jos F. Sturm, 1998-2003.
Alg = 2: xz-corrector, theta = 0.250, beta = 0.500
eqs m = 3, order n = 5, dim = 9, blocks = 3
nnz(A) = 9 + 0, nnz(ADA) = 9, nnz(L) = 6
it : b*y gap delta rate t/tP* t/tD* feas cg cg prec
0 : 1.52E+02 0.000
1 : 0.00E+00 3.58E+01 0.000 0.2354 0.9000 0.9000 0.16 1 1 2.0E+01
2 : 0.00E+00 8.34E+00 0.000 0.2329 0.9000 0.9000 0.02 1 1 7.2E+00
3 : 0.00E+00 3.92E-02 0.000 0.0047 0.9990 0.9990 0.79 1 1 3.7E-02
4 : 0.00E+00 2.36E-03 0.000 0.0602 0.9900 0.9900 1.00 1 1 2.2E-03
5 : 0.00E+00 1.41E-04 0.000 0.0600 0.9900 0.9900 1.00 1 1 1.3E-04
6 : 0.00E+00 8.46E-06 0.000 0.0598 0.9900 0.9900 1.00 1 1 8.0E-06
7 : 0.00E+00 5.05E-07 0.000 0.0596 0.9900 0.9900 1.00 1 1 4.8E-07
8 : 0.00E+00 3.00E-08 0.000 0.0594 0.9900 0.9900 1.00 1 1 2.8E-08
9 : 0.00E+00 1.78E-09 0.000 0.0592 0.9900 0.9900 1.00 1 1 1.7E-09
10 : 0.00E+00 1.05E-10 0.000 0.0591 0.9900 0.9900 1.00 1 1 1.0E-10
iter seconds digits c*x b*y
10 0.0 Inf -6.9680378335e-12 0.0000000000e+00
|Ax-b| = 4.8e-11, [Ay-c]_+ = 0.0E+00, |x|= 6.0e-12, |y|= 2.0e+01
Detailed timing (sec)
Pre IPM Post
6.400E-02 1.500E-02 1.100E-02
Max-norms: ||b||=0, ||c|| = 1.000001e+00,
Cholesky |add|=0, |skip| = 0, ||L.L|| = 7.75404.
sol =
フィールドをもつ struct:
yalmipversion: '20210331'
matlabversion: '9.14.0.2206163 (R2023a)'
yalmiptime: 0.5112
solvertime: 0.0948
info: 'Successfully solved (SeDuMi-1.3)'
problem: 0
eigen_A =
-1.0000 + 3.0000i
-1.0000 - 3.0000i
P_feas =
19.6857 0.3742
0.3742 2.1125
-----------------------------------------------
M1 の固有値:M1 > 0 なら M1 の固有値はすべて正
-----------------------------------------------
ans =
1.1045
18.6937
-----------------------------------------------
-M2 の固有値:M2 < 0 なら -M2 の固有値はすべて正
-----------------------------------------------
ans =
5.4027
9.783
sample2_yalmip.m の実行結果
>> sample2_yalmip
A =
0 1
10 -2
SeDuMi 1.3.5 by AdvOL, 2005-2008 and Jos F. Sturm, 1998-2003.
Alg = 2: xz-corrector, theta = 0.250, beta = 0.500
eqs m = 3, order n = 5, dim = 9, blocks = 3
nnz(A) = 9 + 0, nnz(ADA) = 9, nnz(L) = 6
it : b*y gap delta rate t/tP* t/tD* feas cg cg prec
0 : 4.42E+02 0.000
1 : 0.00E+00 8.05E+01 0.000 0.1822 0.9000 0.9000 1.00 1 1 8.4E+00
2 : 0.00E+00 1.73E+01 0.000 0.2143 0.9000 0.9000 1.00 1 1 1.8E+00
3 : 0.00E+00 6.57E-01 0.000 0.0381 0.9900 0.9900 1.00 1 1 6.8E-02
4 : 0.00E+00 3.54E-02 0.181 0.0539 0.9900 0.9900 1.00 1 1 3.7E-03
5 : 0.00E+00 8.83E-03 0.322 0.2490 0.9000 0.9000 0.96 1 1 9.5E-04
6 : 0.00E+00 2.25E-03 0.000 0.2544 0.9000 0.9000 0.84 1 1 2.7E-04
7 : 0.00E+00 5.06E-04 0.000 0.2252 0.9000 0.9000 0.41 1 1 1.1E-04
8 : 0.00E+00 3.85E-05 0.000 0.0761 0.9900 0.9900 -0.53 1 2 8.8E-05
9 : 0.00E+00 2.22E-06 0.000 0.0576 0.9900 0.9900 -0.99 3 3 9.7E-05
10 : 0.00E+00 5.42E-07 0.000 0.2443 0.9000 0.9000 -1.13 4 4 1.1E-04
11 : 0.00E+00 1.44E-07 0.000 0.2653 0.9000 0.9000 -1.17 5 4 1.2E-04
12 : 0.00E+00 3.82E-08 0.000 0.2657 0.9000 0.9000 -1.16 5 5 1.3E-04
13 : 0.00E+00 9.48E-09 0.000 0.2481 0.9000 0.9000 -1.13 5 5 1.4E-04
14 : 0.00E+00 2.13E-09 0.000 0.2247 0.9000 0.9000 -1.10 5 5 1.5E-04
Run into numerical problems.
iter seconds digits c*x b*y
14 0.1 Inf -2.5643445269e+00 0.0000000000e+00
|Ax-b| = 7.6e-05, [Ay-c]_+ = 2.0E-06, |x|= 2.2e+06, |y|= 7.0e+04
Detailed timing (sec)
Pre IPM Post
2.997E-03 1.500E-01 2.002E-03
Max-norms: ||b||=0, ||c|| = 1.000000e-06,
Cholesky |add|=0, |skip| = 1, ||L.L|| = 5.36675.
sol =
フィールドをもつ struct:
yalmipversion: '20210331'
matlabversion: '9.14.0.2206163 (R2023a)'
yalmiptime: 0.0990
solvertime: 0.1560
info: 'Infeasible problem (SeDuMi-1.3)'
problem: 1
eigen_A =
2.3166
-4.3166