SeDuMi / YALMIP

SeDuMi とは?

 SeDuMi (Self-Dual-Minimisation Package) は Jos F. Sturm により開発されたフリーウェアSDP ソルバ (LMI ソルバ) であり,MATLAB で利用可能です.本書では

で利用します.ちなみに,せでゅみ発音します.SeDuMi についての詳細は文献

Jos F. Sturm: Using SeDuMi 1.02, a MATLAB Toolbox for Optimization over Symmetric Cones, Optimization Methods and Software, Vol. 11-12, No. 1, pp. 625-653 (1999)

やユーザーズガイド

SeDuMi 1.1 user's guide

SeDuMi 1.05 R5 user's guide

を参照してください.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 を購入する必要がある

その他の SDP ソルバとしては,SDPT3SDPA というのもあります.

YALMIP とは?

 YALMIP (Yet Another LMI Parser) は Johan Lofberg に より開発されたフリーウェアの LMI パーサであり,本書では

で利用します.ちなみに,「やるみっぷ」発音します.パーサ (parser) という言葉は聞き慣れないかもしれませんが,要は,MATLAB での LMI の記述を簡単にしてくれるプログラムのことです.YALMIP を使わないと,MATLAB での LMI の記述がかなり大変な作業となってしまいます!

 YALMIP に関する 情報は開発者 (Johan Lofberg) の Web ページ

https://yalmip.github.io/

もしくは文献

Johan Lofberg: YALMIP: A Toolbox for Modeling and Optimization in MATLAB, IEEE International Symposium on Computer Aided Control Systems Design, pp. 284-289 (2004)

を参照してください.最新バージョンは

https://github.com/yalmip/YALMIP/archive/master.zip

からダウンロードできます.

SeDuMi / YALMIP のインストール

 配布ファイルを使用するための準備にインストール手順が記述されています.

SeDuMi / YALMIP の使用例

 安定性を上述の (b) 式により判別する例は

を参照してください.

 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