📄 simstabex.m
字号:
yalmip('clear');
echo on
clc
%*********************************************************
%
% Simultaneuous stabilization using non-convex
% semidefinite programming.
%
%*********************************************************
%
% This example solves a simultaneuous stabilization problem
%
% The example is taken from
% "A path-following method for solving BMI problems in control"
% A. Hassibi, J. How, and S. Boyd.
% Proceedings of American Control Conference, 2:1385-1389, June 1999.
%
%
% The goal is to find a state-feedback, stabilizing a set
% of systems, under constraints on the feedback matrix.
%
% The performance measure is to maximize the smallest
% decay-rate for the closed-loop systems.
%
% The optimization problem can be stated as:
%
% max t
% subject to (A1+B*K)'*P1+P1*(A1+B*K) < -2*t*P1
% (A2+B*K)'*P2+P2*(A2+B*K) < -2*t*P2
% (A3+B*K)'*P3+P3*(A3+B*K) < -2*t*P3
% -50 < K
% K < 50
% P1,P2,P3 > 0
%
% Clearly, this is a BMI due to the products between Pi
% and K, and the products t*Pi
pause
clc
% Generate system data
A1 = [1 -1 0;1 1 0;0 0 -0.5];
A2 = [1.5 -7 0;7 1.5 0;0 0 1];
A3 = [-0.5 -3 0;3 -0.5 0;0 0 2];
B = [0.2477 -0.1645;0.4070 0.8115;0.6481 0.4083];
pause
% An initial guess is often important when solving BMIs
%
% The following set of LMIs gives us a stabilizing controller and
% a reasonable initial guess
% (let P1=P2=P3=P, multply BMIs with Q=P^-1, let L=KP^-1, t=0 and
% neglect amplitude constraints)
L = sdpvar(2,3);
Q = sdpvar(3,3);
F = set(Q>0) + set(trace(Q)==1); % Normalize
F = F + set(Q*A1'+(B*L)'+(A1*Q+B*L) < 0);
F = F + set(Q*A2'+(B*L)'+(A2*Q+B*L) < 0);
F = F + set(Q*A3'+(B*L)'+(A3*Q+B*L) < 0);
pause
% Find a feasible solution using penbmi as convex SDP solver
solvesdp(F,-trace(Q),sdpsettings('solver','penbmi'));
% The solution Q and L can be used later to define initial guesses for P and K
P0 = inv(double(Q));
K0 = double(L)*P0;
pause
clc
% Define variables in actual BMI-problem
t = sdpvar(1,1);
K = sdpvar(2,3);
P1 = sdpvar(3,3);
P2 = sdpvar(3,3);
P3 = sdpvar(3,3);
% BMI problem (P>0 changed to P>I for numerical reasons)
F = set(P1>eye(3)) + set(P2>eye(3))+set(P3>eye(3));
F = F + set(-50 < K < 50);
F = F + set((A1+B*K)'*P1+P1*(A1+B*K) < -2*t*P1);
F = F + set((A2+B*K)'*P2+P2*(A2+B*K) < -2*t*P2);
F = F + set((A3+B*K)'*P3+P3*(A3+B*K) < -2*t*P3);
pause
% Solve with the calculated initial guesses (and t = 0 initially)
setsdpvar(P1,P0);
setsdpvar(P2,P0);
setsdpvar(P3,P0);
setsdpvar(K,K0);
setsdpvar(t,0);
solvesdp(F,-t,sdpsettings('usex0',1));
% Decay-rate obtained
double(t)
% Feedback matrix
double(K)
pause
echo off
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -