SDP ソルバと LMI パーサのインストール
ここでは,Windows 版の MATLAB を利用していることを前提として,線形行列不等式 (LMI; Linear Matrix Inequality) を解くための
SDP ソルバと LMI パーサのインストール
について,説明します.
なお,以下の説明の多くは,ずいぶんと古い解説記事
川田昌克:制御系解析・設計における数値計算/数式ソフトウェアの活用,システム/制御/情報,Vol.55,No.5,pp.159-164 (2011)
での記述の一部を,現在の状況にあわせて書き換えたものです.
LMI を解くための SDP ソルバ
LMI を制約条件として,線形の目的関数を最大化(最小化)する凸最適化問題,すなわち,正定値計画問題 (SDP; SemiDefinite Programming) の解を MATLAB で求めるためには,SDP ソルバをインストールする必要があります.MATLAB で利用可能な非商用の SDP ソルバとしては,たとえば,以下のものがあります.
SeDuMi
開発者
Jos F. Sturm (現在は Lehigh 大学のグループが開発を継承)
特徴
LMILAB と比べて実行速度が速いという利点があり,得られる数値解の信頼性もそれほど低くはありません.そのため, 数値最適化の分野を専門とする制御理論の研究者の多くが利用しています.ただし,後述の LMI パーサ YALMIP を利用して大規模な問題を解かせると,しばしば「Numerical problems」と表示されてしまいます…(SeDuMi に限りませんが,工夫が必要)
入手先
https://github.com/sqlp/sedumi/archive/refs/heads/master.zip …… ここからダウンロード
SDPT3
開発者
K.C. Toh, M.J. Todd, and R.H. Tutuncu
特徴
SeDuMi と同様の特徴を持ちますが,SeDuMi と比べると,実行速度が遅いことが多いです.
入手先
https://github.com/sqlp/sdpt3/archive/refs/heads/master.zip …… ここからダウンロード
https://blog.nus.edu.sg/mattohkc/softwares/sdpt3/
SDPA-M
開発者
K. Fujisawa, Y. Futakata, M. Kojima, S. Matsuyama, S. Nakamura, K. Nakata, and M. Yamashita
特徴
OR の分野では定評のある高速な国産の SDP ソルバ SDPA を,MATLAB で利用可能としたものです.
入手先
https://sourceforge.net/projects/sdpa/files/sdpa/windows/sdpam-7.3.9-windows.zip …… ここからダウンロード
商用の SDP ソルバとしては,たとえば,以下のものががあります.
LMILAB
開発者
P. Gahinet,A. Nelnirovski, A. J. Laub,and M. Chilal
特徴
商用の MATLAB ツールボックス Robust Control Toolbox(もともとは LMI Control Toolbox という独立したツールボックス)に含まれる SDP ソルバです.制御理論で取り扱う問題に対して,得られる数値解の信頼性が高いという利点があります.その反面,実行速度が遅いことがあることが欠点です.
なお,後述の LMI パーサ YALMIP でも使用できますが,推奨されていません(サポート外です).
MOSEK
開発者
E. D. Andersen, and K. D. Andersen
取締役会アドバイザ
J. Søndergård (Chairman), O. Borries, and M. Grant
特徴
商用だけあって非常に高速です!!MATLAB だけでなく,Python や R などでも利用可能です.また,教育機関の場合,アカデミックライセンスにより無料で利用可能であることもあり,後述の LMI パーサ YALMIP では,MOSEK の使用が推奨されています.
入手先
LMI パーサ
数値計算ソフトウェア上で LMI の記述を補助するインタフェースを LMI パーサといいます.
MATLAB 用の LMI パーサとしては,SDP ソルバ LMILAB の使用を前提とした商用の Robust Control Toolbox がありますが,その記述は随分と面倒です.
それに対し,LMI の記述が簡単で非商用の LMI パーサがいくつか開発されています.
YALMIP
開発者
Johan Löfberg
対応する非商用の SDP ソルバ
SeDuMi, SDPT3, SDPA-M など
対応する商用の SDP ソルバ
MOSEK など …… MOSEK:アカデミックライセンスは無料
LMILAB も使用はできますがサポート外です(可解でなかった場合でも 'Successfully solved (LMILAB)' と表示されてしまいます)
入手先
https://github.com/yalmip/YALMIP/archive/master.zip …… ここからダウンロード
CVX
開発者
M. C. Grant, and S. P. Boyd
対応する非商用の SDP ソルバ
SeDuMi, SDPT3(CVX のパッケージに含まれる)
入手先
http://web.cvxr.com/cvx/cvx-1.22.zip …… ここからダウンロード(非商用の SDP ソルバを利用する場合)
SeDuMi,SDPT3 および YALMIP のインストール
SeDuMi, SDPT3 のみをインストールすると,ソルバを特に指定しなければ,YALMIP で使用する標準のソルバは SeDuMi となります.ただし,これに加えて後述の MOSEK をインストールすると,YALMIP で使用する標準のソルバは MOSEK となります.MOSEK のインストール方法については,このページの下方に記述しています.
さて,適当なフォルダに,zip ファイル
SeDuMi …… https://github.com/sqlp/sedumi/archive/refs/heads/master.zip
SDPT3 ...... https://github.com/sqlp/sdpt3/archive/refs/heads/master.zip
YALMIP ...... https://github.com/yalmip/YALMIP/archive/master.zip
をダウンロードします.ダウンロードされた zip ファイルの名前は
sedumi-master.zip
sdpt3-master.zip
YALMIP-master.zip
となりますので,これらを解凍します.たとえば,フォルダを C ドライブの hoge で解凍すると,
C:\hoge\sedumi-master
C:\hoge\sdpt3-master
C:\hoge\YALMIP-master
というフォルダが生成されます.
MATLAB で使用するために,以下のいずれかの方法で,これらのフォルダにパスを通します.
(1) コマンドウィンドウで
>> addpath(genpath('C:\hoge\sedumi-master'))
>> addpath(genpath('C:\hoge\sdpt3-master'))
>> addpath(genpath('C:\hoge\YALMIP-master'))
と入力します.
(2) ユーザが管理者権限を持っているのであれば,MATLAB がインストールされているフォルダ
C:\Program Files\MATLAB\R2023a\toolbox\local …… この例では R2023a
にある M ファイル matlabrc.m の最下部に
addpath(genpath('C:\hoge\sedumi-master'))
addpath(genpath('C:\hoge\sdpt3-master'))
addpath(genpath('C:\hoge\YALMIP-master'))
を加筆して保存します.そして,MATLAB を再起動してください.
(3) コマンドウィンドウで
>> edit(fullfile(userpath,'startup.m'))
と入力し,ユーザのパスが通ったフォルダ
C:\Users\kawata\Documents\MATLAB …… この例ではユーザは kawata
のなかに作成された M ファイル startup.m を起動します.もし,M ファイル startup.m がない場合は「作成しますか?」と聞かれますので,「はい」を選択します.そして,M ファイル startup.m に
addpath(genpath('C:\hoge\sedumi-master'))
addpath(genpath('C:\hoge\sdpt3-master'))
addpath(genpath('C:\hoge\YALMIP-master'))
と記述して保存し,MATLAB を再起動してください.
以上のようにしてパスが通っているかどうかは,コマンドウィンドウで以下のように入力して,確認してください.
>> path
MATLABPATH
C:\hoge\YALMIP-master
C:\hoge\YALMIP-master\demos
C:\hoge\YALMIP-master\extras
C:\hoge\YALMIP-master\modules
C:\hoge\YALMIP-master\modules\bilevel
C:\hoge\YALMIP-master\modules\global
C:\hoge\YALMIP-master\modules\moment
C:\hoge\YALMIP-master\modules\parametric
C:\hoge\YALMIP-master\modules\robust
C:\hoge\YALMIP-master\modules\sos
C:\hoge\YALMIP-master\operators
C:\hoge\YALMIP-master\solvers
C:\hoge\sdpt3-master
C:\hoge\sdpt3-master\Examples
C:\hoge\sdpt3-master\HSDSolver
C:\hoge\sdpt3-master\Solver
C:\hoge\sdpt3-master\Solver\Mexfun
C:\hoge\sdpt3-master\Solver\Mexfun\o_win
C:\hoge\sdpt3-master\dimacs
C:\hoge\sdpt3-master\sdplib
C:\hoge\sedumi-master
C:\hoge\sedumi-master\.github
C:\hoge\sedumi-master\.github\workflows
C:\hoge\sedumi-master\conversion
C:\hoge\sedumi-master\doc
C:\hoge\sedumi-master\examples
《略》
CVX のインストール
適当なフォルダに,zip ファイル
をダウンロードします.ダウンロードされた zip ファイルの名前は
cvx-1.22.zip
となりますので,これらを解凍します.たとえば,フォルダを C ドライブの hoge で解凍すると,
C:\hoge\cvx-1.22
というフォルダが生成されます.ちなみに,CVX はダウンロードした zip ファイルのなかに SDP ソルバ
SeDuMi Ver.1.21
SDPT3
が含まれます.
MATLAB で使用するために,以下のいずれかの方法で,これらのフォルダにパスを通します.
(1) コマンドウィンドウで
>> addpath(genpath('C:\hoge\cvx-1.22'))
と入力します.
(2) ユーザが管理者権限を持っているのであれば,MATLAB がインストールされているフォルダ
C:\Program Files\MATLAB\R2023a\toolbox\local …… この例では R2023a
にある M ファイル matlabrc.m の最下部に
addpath(genpath('C:\hoge\cvx-1.22'))
を加筆して保存します.そして,MATLAB を再起動してください.
(3) コマンドウィンドウで
>> edit(fullfile(userpath,'startup.m'))
と入力し,ユーザのパスが通ったフォルダ
C:\Users\kawata\Documents\MATLAB …… この例ではユーザは kawata
のなかに作成された M ファイル startup.m を起動します.もし,M ファイル startup.m がない場合は「作成しますか?」と聞かれますので,「はい」を選択します.そして,M ファイル startup.m に
addpath(genpath('C:\hoge\cvx-1.22'))
と記述して保存し,MATLAB を再起動してください.
以上のようにしてパスが通っているかどうかは,コマンドウィンドウで以下のように入力して,確認してください.
>> path
MATLABPATH
C:\hoge\cvx-1.22
C:\hoge\cvx-1.22\cvx
C:\hoge\cvx-1.22\cvx\builtins
C:\hoge\cvx-1.22\cvx\commands
C:\hoge\cvx-1.22\cvx\examples
C:\hoge\cvx-1.22\cvx\examples\antenna_array_design
C:\hoge\cvx-1.22\cvx\examples\antenna_array_design\html
C:\hoge\cvx-1.22\cvx\examples\circuit_design
C:\hoge\cvx-1.22\cvx\examples\circuit_design\html
C:\hoge\cvx-1.22\cvx\examples\cvxbook
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch04_cvx_opt_probs
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch04_cvx_opt_probs\html
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch05_duality
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch05_duality\html
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch06_approx_fitting
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch06_approx_fitting\html
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch07_statistical_estim
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch07_statistical_estim\html
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch08_geometric_probs
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch08_geometric_probs\html
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch11_intpt_methods
C:\hoge\cvx-1.22\cvx\examples\cvxbook\Ch11_intpt_methods\html
C:\hoge\cvx-1.22\cvx\examples\filter_design
C:\hoge\cvx-1.22\cvx\examples\filter_design\html
C:\hoge\cvx-1.22\cvx\examples\gp_tutorial
C:\hoge\cvx-1.22\cvx\examples\gp_tutorial\html
C:\hoge\cvx-1.22\cvx\examples\graph_laplacian
C:\hoge\cvx-1.22\cvx\examples\graph_laplacian\html
C:\hoge\cvx-1.22\cvx\examples\html
C:\hoge\cvx-1.22\cvx\examples\log_exp
C:\hoge\cvx-1.22\cvx\examples\log_exp\html
C:\hoge\cvx-1.22\cvx\examples\sparse_heuristics
C:\hoge\cvx-1.22\cvx\examples\sparse_heuristics\html
C:\hoge\cvx-1.22\cvx\examples\time_series_analysis
C:\hoge\cvx-1.22\cvx\examples\time_series_analysis\html
C:\hoge\cvx-1.22\cvx\functions
C:\hoge\cvx-1.22\cvx\lib
C:\hoge\cvx-1.22\cvx\lib\pre7.5
C:\hoge\cvx-1.22\cvx\sdpt3\Examples
C:\hoge\cvx-1.22\cvx\sdpt3\dimacs
C:\hoge\cvx-1.22\cvx\sdpt3\sdplib
C:\hoge\cvx-1.22\cvx\sedumi\conversion
C:\hoge\cvx-1.22\cvx\sedumi\doc
C:\hoge\cvx-1.22\cvx\sedumi\examples
C:\hoge\cvx-1.22\cvx\structures
《略》
MOSEK のインストール(アカデミックライセンス)
MOSEK をインストールすると,YALMIP で使用する標準のソルバは MOSEK となります.
Windows (64bit) の場合,
https://download.mosek.com/stable/10.0.43/moseksetupwin64x86.msi
からインストーラ
moseksetupwin64x86.msi
をダウンロードして実行し,適当なフォルダにインストールをしてください.ここでは,
C:\hoge\Mosek
にインストールされているものとします.再起動が促されますので,再起動してください.
MOSEK は本来は商用ですが,アカデミックでの利用は無料です.アカデミックライセンスには
Personal Academic License(個人のアカデミックライセンスで 1 年間ごとに延長)
Institutional Academic License(フローティングライセンス:グループのアカデミックライセンスで 2 年間有効)
があります.今回は,Personal Academic License としました.アカデミックライセンスを利用したい場合は,
https://www.mosek.com/products/academic-licenses/
からユーザ登録をすると,登録したメールアドレス(所属機関のメールアドレス)にライセンスファイル
mosek.lic
が送付されます.このライセンスファイルを,
C:\Users\YOUR_USER_NAME\mosek\mosek.lic (Windows)
に保存します.なお,YOUR_USER_NAME には Windows のユーザ名を記入します.
最後に,C:\hoge\Mosek にパスを通します.
(1) コマンドウィンドウで
>> addpath(genpath('C:\hoge\Mosek'))
と入力します.
(2) ユーザが管理者権限を持っているのであれば,MATLAB がインストールされているフォルダ
C:\Program Files\MATLAB\R2023a\toolbox\local …… この例では R2023a
にある M ファイル matlabrc.m の最下部に
addpath(genpath('C:\hoge\Mosek'))
を加筆して保存します.そして,MATLAB を再起動してください.
(3) コマンドウィンドウで
>> edit(fullfile(userpath,'startup.m'))
と入力し,ユーザのパスが通ったフォルダ
C:\Users\kawata\Documents\MATLAB …… この例ではユーザは kawata
のなかに作成された M ファイル startup.m を起動します.もし,M ファイル startup.m がない場合は「作成しますか?」と聞かれますので,「はい」を選択します.そして,M ファイル startup.m に
addpath(genpath('C:\hoge\Mosek'))
と記述して保存し,MATLAB を再起動してください.
以上のようにしてパスが通っているかどうかは,コマンドウィンドウで以下のように入力して,確認してください.
>> path
MATLABPATH
C:\hoge\Mosek
C:\hoge\Mosek\10.0
C:\hoge\Mosek\10.0\doc
C:\hoge\Mosek\10.0\doc\xml
C:\hoge\Mosek\10.0\graphics
C:\hoge\Mosek\10.0\toolbox
C:\hoge\Mosek\10.0\toolbox\examples
C:\hoge\Mosek\10.0\toolbox\r2017a
C:\hoge\Mosek\10.0\toolbox\r2017aom
C:\hoge\Mosek\10.0\tools
C:\hoge\Mosek\10.0\tools\examples
C:\hoge\Mosek\10.0\tools\examples\ampl
C:\hoge\Mosek\10.0\tools\examples\c
C:\hoge\Mosek\10.0\tools\examples\data
C:\hoge\Mosek\10.0\tools\examples\dotnet
C:\hoge\Mosek\10.0\tools\examples\fusion
C:\hoge\Mosek\10.0\tools\examples\fusion\cxx
C:\hoge\Mosek\10.0\tools\examples\fusion\dotnet
C:\hoge\Mosek\10.0\tools\examples\fusion\java
C:\hoge\Mosek\10.0\tools\examples\fusion\python
C:\hoge\Mosek\10.0\tools\examples\java
C:\hoge\Mosek\10.0\tools\examples\python
C:\hoge\Mosek\10.0\tools\examples\rmosek
C:\hoge\Mosek\10.0\tools\platform
C:\hoge\Mosek\10.0\tools\platform\win64x86
C:\hoge\Mosek\10.0\tools\platform\win64x86\bin
C:\hoge\Mosek\10.0\tools\platform\win64x86\h
C:\hoge\Mosek\10.0\tools\platform\win64x86\purepython
C:\hoge\Mosek\10.0\tools\platform\win64x86\purepython\3
C:\hoge\Mosek\10.0\tools\platform\win64x86\purepython\3\mosek
C:\hoge\Mosek\10.0\tools\platform\win64x86\purepython\3\mosek\fusion
C:\hoge\Mosek\10.0\tools\platform\win64x86\purepython\3\mosek\fusion\impl
C:\hoge\Mosek\10.0\tools\platform\win64x86\python
C:\hoge\Mosek\10.0\tools\platform\win64x86\python\3
C:\hoge\Mosek\10.0\tools\platform\win64x86\python\3\mosek
C:\hoge\Mosek\10.0\tools\platform\win64x86\python\3\mosek\fusion
C:\hoge\Mosek\10.0\tools\platform\win64x86\python\3\mosek\fusion\impl
C:\hoge\Mosek\10.0\tools\platform\win64x86\rmosek
C:\hoge\Mosek\10.0\tools\platform\win64x86\src
C:\hoge\Mosek\10.0\tools\platform\win64x86\src\fusion_cxx
《略》