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 ソルバとしては,たとえば,以下のものがあります.

開発者

 Jos F. Sturm (現在は Lehigh 大学のグループが開発を継承)

特徴

LMILAB と比べて実行速度が速いという利点があり,得られる数値解の信頼性もそれほど低くはありません.そのため, 数値最適化の分野を専門とする制御理論の研究者の多くが利用しています.ただし,後述の LMI パーサ YALMIP を利用し大規模な問題を解かせるとしばしば「Numerical problems」と表示されてしまいます…(SeDuMi に限りませんが,工夫が必要)

入手先

https://github.com/sqlp/sedumi/archive/refs/heads/master.zip …… ここからダウンロード

https://sedumi.ie.lehigh.edu/

開発者

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/

開発者

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 …… ここからダウンロード

https://sdpa.sourceforge.net/

 商用の SDP ソルバとしては,たとえば,以下のものががあります.

開発者

P. Gahinet,A. Nelnirovski, A. J. Laub,and M. Chilal

特徴

商用の MATLAB ツールボックス Robust Control Toolbox(もともとは LMI Control Toolbox という独立したツールボックス)に含まれる SDP ソルバです.制御理論で取り扱う問題に対して,得られる数値解の信頼性が高いという利点があります.その反面,実行速度が遅いことがあることが欠点です.

なお,後述の LMI パーサ YALMIP でも使用できますが,推奨されていません(サポート外です).

開発者

E. D. Andersen, and K. D. Andersen

取締役会アドバイザ

J. Søndergård (Chairman), O. Borries, and M. Grant

特徴

商用だけあって非常に高速!!MATLAB だけでなく,Python や R などでも利用可能です.また,教育機関の場合,アカデミックライセンスにより無料で利用可能であることもあり,後述の LMI パーサ YALMIP では,MOSEK の使用が推奨されています.

入手先

https://www.mosek.com/

LMI パーサ

 数値計算ソフトウェア上で LMI の記述を補助するインタフェースを LMI パーサといいます.

 MATLAB 用の LMI パーサとしては,SDP ソルバ LMILAB の使用を前提とした商用の Robust Control Toolbox がありますが,その記述は随分と面倒です.

 それに対し,LMI の記述が簡単非商用の LMI パーサがいくつか開発されています.

開発者

Johan Löfberg

対応する非商用の SDP ソルバ

SeDuMi, SDPT3, SDPA-M など

対応する商用の SDP ソルバ

MOSEK など …… MOSEK:アカデミックライセンスは無料

入手先

https://github.com/yalmip/YALMIP/archive/master.zip …… ここからダウンロード

https://yalmip.github.io/

開発者

M. C. Grant, and S. P. Boyd

対応する非商用の SDP ソルバ

SeDuMi, SDPT3(CVX のパッケージに含まれる)

入手先

http://web.cvxr.com/cvx/cvx-1.22.zip …… ここからダウンロード(非商用の SDP ソルバを利用する場合)

http://cvxr.com/cvx/

SeDuMi,SDPT3 および YALMIP のインストール

 SeDuMi, SDPT3 のみをインストールすると,ソルバを特に指定しなければ,YALMIP で使用する標準のソルバは SeDuMi となります.ただし,これに加えて後述の MOSEK をインストールすると,YALMIP で使用する標準のソルバは MOSEK となります.MOSEK のインストール方法については,このページの下方に記述しています.

 さて,適当なフォルダに,zip ファイル

をダウンロードします.ダウンロードされた zip ファイルの名前は

となりますので,これらを解凍します.たとえば,フォルダを C ドライブの hoge で解凍すると,

というフォルダが生成されます.

 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 ファイルの名前は

となりますので,これらを解凍します.たとえば,フォルダを C ドライブの hoge で解凍すると,

というフォルダが生成されます.ちなみに,CVX はダウンロードした zip ファイルのなかに SDP ソルバ 

が含まれます

 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 

をダウンロードして実行し,適当なフォルダにインストールをしてください.ここでは,

にインストールされているものとします.再起動が促されますので,再起動してください.

 MOSEK は本来は商用ですが,アカデミックでの利用は無料です.アカデミックライセンスには

があります.今回は,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

《略》