-
Notifications
You must be signed in to change notification settings - Fork 0
/
sample_yalmip_mosek.m
35 lines (34 loc) · 2.02 KB
/
sample_yalmip_mosek.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
% sample_yalmip_mosek.m
% last modified: 2024/04/28 by Masakatsu KAWATA
plant % アクロボットに対してシステム行列などを定義した M ファイルの実行
% -------------------------------------------
gamma = sdpvar(1,1); % 決定変数 gamma(ガンマ):スカラ
X = sdpvar(n,n,'sy'); % 決定変数 X:n×n の対称行列
Z = sdpvar(n,m,'f'); % 決定変数 Z:n×m の長方行列
% -------------------------------------------
ep = 1e-6; % 十分小さな正数 <=== 加筆
% -------------------------------------------
LMI = []; % LMI の記述の初期化
% -------------------------------------------
AX = A*X + B2*Z';
CX = C1*X + D12*Z';
% -------------------------------------------
M1 = [ r*X AX-c*X
AX'-c*X r*X ];
LMI = [LMI, M1 >= ep*eye(length(M1))]; % M1 ≧ ep*I (> 0)
% -------------------------------------------
M2 = [ AX+AX' B1 CX'
B1' -gamma*eye(q) D11'
CX D11 -gamma*eye(p) ];
LMI = [LMI, M2 <= -ep*eye(length(M2))]; % M2 ≦ -ep*I (< 0)
% -------------------------------------------
opt = sdpsettings; opt.solver = 'mosek'; % ソルバとして MOSEK を利用
optimize(LMI,gamma,opt) % 目的関数を E = gamma とした凸最適化問題を解く
%%% もしくは上 2 行の代わりに
%%% optimize(LMI,gamma,sdpsettings('solver','mosek'))
% -------------------------------------------
gamma_opt = value(gamma) % 得られた gamma の最適解 gamma_opt
X_opt = value(X) % 得られた X の最適解 X_opt
Z_opt = value(Z) % 得られた Z の最適解 Z_opt
% -------------------------------------------
K_opt = Z_opt'*inv(X_opt) % コントローラゲイン K_opt