Explorar E-books
Categorias
Explorar Audiolivros
Categorias
Explorar Revistas
Categorias
Explorar Documentos
Categorias
𝐹(𝑥) = ∑ 𝑥𝑖 𝐹𝑖 − 𝐹0 ≤ 0 (2)
𝑖=1
sendo 𝑥 ∈ ℝ𝑝 e 𝐹(𝑥) é uma função Afim, em que 𝐹𝑖 ∈ ℝ𝑝×𝑞 , 𝑖 = 0, … , 𝑚 são matrizes simétricas
semi-definidas positivas com restrição convexa em (2). Considere o sistema linear no tempo contínuo
modelado no espaço de estados definida pela seguinte equação
𝑥̇ = 𝐴𝑥 (3)
′
o qual deseja-se encontrar a matriz 𝑃 = 𝑃 > 0 baseada na equação quadrática de Lyapunov
𝑉(𝑥) = 𝑥 ′ 𝑃𝑥 > 0 (4)
O qual garante-se a estabilidade assintótica de (4) na seguinte condição
𝑉̇ (𝑥) ≤ 0 ⇒ 𝑉̇ (𝑥) = 𝑥 ′ (𝐴′ 𝑃 + 𝑃𝐴)𝑥 ≤ 0 (5)
Logo
𝐴′ 𝑃 + 𝑃𝐴 ≤ 0 (6)
O processo de solução da matriz 𝑃 ≥ 0 e (6) se dá por um processo de restrição linear. Para o processo
de obtenção do conjunto solução temos:
− As variáveis de decisão: que são os elementos da matriz 𝑃, que devem ser semi-definidas
positivas;
− As restrições do sistema: que consistem no conjunto de inequações que existem no
procedimento de otimização;
− Função objetivo: que é a condição de minimização aceitável que garante a convergência da
solução.
Com base nas informações dadas anteriormente, tem-se que o processo de função objetivo de (6)
pode ser o traço da matriz 𝑃. Neste caso o processo de otimização é determinado na seguinte
maneira:
min Tr P ,
P = P '0
sujeito (7)
A ' P + PA 0
O script a seguir mostra o exemplo de estabilidade de Lyapunov na busca da solução da matriz P
com base no processo de otimização de (7). O exemplo considera o seguinte modelo:
0 1
x ( t ) = Ax ( t ) A = (8)
0 −10
% Uso do Solver
solvesdp(LMIs,trace(P),ops)
P=value(P); %valor numerico de P
Para projeto de controladores LMIs usando Pyhton, pode-se usar o Google Colab pelo seguinte
comando:
pip install control
pip install cvxpy
Portanto, considerando o exemplo Python usando o Google Colab
#Importando bibliotecas
from numpy import * # Traz todas as funções NumPy
from matplotlib.pyplot import * # Traz todas as funções de plotti
n MATLAB
from control.matlab import * # Funções como se fosse MATLAB
import control
from scipy import linalg
from numpy.linalg import matrix_rank
from numpy.linalg import inv
import numpy as np
import matplotlib.pyplot as plt
import random
import cvxpy as cp # Traz todas as funções de otimiz
ação convexa
# operando as restrições
constraints = [P >> 1e-5*eye(n)] # 1e-
5*eye(n) é tolerância p/convergência
constraints += [A @ P + P @ A.T << 0]
obj = cp.trace(P);
prob = cp.Problem(cp.Minimize(obj), constraints)
prob.solve(solver=cp.SCS, verbose=True);
# Print result.
Ps=P.value
[Es, Vs]=linalg.eig(Ps);
print("The optimal value is", prob.value)
print("Solution P is")
print(Ps)
O qual (16) não requer função objetivo, portanto este será vazio no código. O script a seguir, mostra
o modelo de estabilização com base no exemplo e mostra os autovalores de malha fechada.
close all, clear all, clc
A=[0 1;0 -10]; %matriz A
B=[0 1]'; %matriz B
% Declarando as variáveis semidefinidas positivas (sdp)
[m,n]=size(B); % tamanho da matriz A
Q=sdpvar(m,m); %declarando a matriz simétrica
Y=sdpvar(n,m); %declarando a matriz Y
% Processo de restrição
LMIs=[Q>=0,(A*Q-B*Y)'+(A*Q-B*Y)<=0];
% Condições de otimização
ops=sdpsettings;
ops.solver='sedumi'; %solver sedumi
ops.tol=1e-5; % tolerancia
ops.verbose=0;
% verbose 0 - Oculta as iterações no codigo
% verbose 1 - Mostra as iterações no código
% verbose 2 - Mostra as iterações do codigo com cor
chamativa
% Uso do Solver
solvesdp(LMIs,[],ops)
Q=value(Q); %valor numerico de Q
Y=value(Y); %valor numerico de Y
K=Y*inv(Q);
E=eig(A-B*K),
O qual E = −0,4375 j1,0489 respectivamente.
# operando as restrições
constraints = [Q >= 0]
constraints += [
(A @ Q - B @ Y + Q @ A.T - Y.T @ B.T ) << 0
]
obj = cp.trace(Q);
prob = cp.Problem(cp.Minimize(obj),
constraints)
prob.solve(solver=cp.SCS, verbose=True);
# Print result.
Qs=Q.value; Qs=matrix(Qs);
Ys=Y.value; Ys=matrix(Ys);
K = -Ys*inv(Qs)
[Es,Vs]=linalg.eig(A-B*K)
print("The optimal value is", prob.value)
print("Solution Q is")
print(Qs)
print("Solution Y is")
print(Ys)
print("Gain K is")
print(K)
print("The Eigenvalues are")
print(Es)
Os autovalores associados ao modelo de malha fechada são dados por −1,58266676 ± j13,06890836
Q = Q ' 0, sujeito a
−2h1 + ( AQ − BY ) '+ ( AQ − BY ) 0 (21)
2h − AQ − BY '+ AQ − BY 0
2 (( ) ( ))
Os valores de projeto consideram o modelo da planta do exemplo 2
close all, clear all, clc
A=[0 1;0 -10]; %matriz A
B=[0 1]'; %matriz B
h1=-3;
h2=-8;
% Declarando as variáveis semidefinidas positivas (sdp)
[m,n]=size(B); % tamanho da matriz A
Q=sdpvar(m,m); %declarando a matriz simétrica
Y=sdpvar(n,m); %declarando a matriz Y
% Processo de restrição
LMIs=[Q>=0,-2*h1*Q+(A*Q-B*Y)'+(A*Q-B*Y)<=0, 2*h2*Q-
((A*Q-B*Y)'+(A*Q-B*Y))<=0];
% Condições de otimização
ops=sdpsettings;
ops.solver='sedumi'; %solver sedumi
ops.tol=1e-5; % tolerancia
ops.verbose=0;
% verbose 0 - Oculta as iterações no codigo
% verbose 1 - Mostra as iterações no código
% verbose 2 - Mostra as iterações do codigo com cor
chamativa
% Uso do Solver
solvesdp(LMIs,[],ops)
Q=value(Q); %valor numerico de Q
Y=value(Y); %valor numerico de Y
K=Y*inv(Q);
E=eig(A-B*K),
Sendo E = −3,9213 j3,2096 respectivamente. Usando Python, os script é dado por
#Importando bibliotecas
from numpy import * # Traz todas as funções NumPy
from matplotlib.pyplot import * # Traz todas as funções de plotti
n MATLAB
from control.matlab import * # Funções como se fosse MATLAB
import control
from scipy import linalg
from numpy.linalg import matrix_rank
from numpy.linalg import inv
import numpy as np
import matplotlib.pyplot as plt
import random
import cvxpy as cp # Traz todas as funções de otimiz
ação convexa
# operando as restrições
constraints = [Q >> 1e-6*eye(n)] #Procedimento de convergência
constraints += [ -
2*h1@Q + (A @ Q - B @ Y + Q @ A.T - Y.T @ B.T ) << 0 ]
constraints += [ 2*h2@Q - (A @ Q - B @ Y + Q @ A.T - Y.T @ B.T )
<< 0 ]
obj = cp.trace(Q);
prob = cp.Problem(cp.Minimize(obj), constraints)
prob.solve(solver=cp.SCS, verbose=True); # SCS Solver - Splitting
Conic Sol.
#prob.solve(solver=cp.CVXOPT, verbose=True); # CVXOPT Solver - CV
X Optimization.
#prob.solve(); # Resolução padrão
# Print result.
Qs=Q.value; Qs=matrix(Qs);
Ys=Y.value; Ys=matrix(Ys);
K = Ys*inv(Qs)
[Es,Vs]=linalg.eig(A-B*K)
% Uso do Solver
solvesdp(LMIs,[],ops)
Q=value(Q); %valor numerico de Q
Y=value(Y); %valor numerico de Y
K=Y*inv(Q);
E=eig(A-B*K),
Sendo E = −4,2500 j3,1370 respectivamente e raio absoluto de 5,29, ou seja, dentro das condições
de D-estabilidade. O script a seguir mostra a mesma implementação usando Python.
#Importando bibliotecas
from numpy import * # Traz todas as funções NumPy
from matplotlib.pyplot import * # Traz todas as funções de plotti
n MATLAB
from control.matlab import * # Funções como se fosse MATLAB
import control
from scipy import linalg
from numpy.linalg import matrix_rank
from numpy.linalg import inv
import numpy as np
import matplotlib.pyplot as plt
import random
import cvxpy as cp # Traz todas as funções de otimiz
ação convexa
# Condições de D-Estabilidade
h1=-3; h1=matrix(h1);
q=0; q=matrix(q);
raio=10; raio=matrix(raio);
# operando as restrições
constraints = [Q >> 1e-6*eye(n)]
constraints += [cp.bmat([[-raio@Q, q@Q+(A@Q-B@Y)],
[q@Q+(Q@A.T-Y.T@B.T), -raio@Q]]) << 0]
constraints += [ -2*h1@Q + (A@Q - B@Y + Q@A.T - Y.T@B.T ) <<0 ]
obj = cp.trace(Q);
prob = cp.Problem(cp.Minimize(obj), #função objetivo é minimizar
Q
constraints)
prob.solve(solver=cp.SCS, verbose=True);
#prob.solve(solver=cp.CVXOPT, verbose=True);
# Print result.
Qs=Q.value; Qs=matrix(Qs);
Ys=Y.value; Ys=matrix(Ys);
K = Ys*inv(Qs)
[Es,Vs]=linalg.eig(A-B*K)
Rd = abs(Es)
Usando o SCS como solver −3, 58163442 ± 𝑗3,10832826 e raio 4.74234222 . Já usando o
CVXOPT, os autovalores são −4,90517488 ± 𝑗2,51303464 com raio 5,51145023.
% Condições de otimização
ops=sdpsettings;
ops.solver='sedumi'; %solver sedumi
ops.tol=1e-5; % tolerancia
ops.verbose=1;
% verbose 0 - Oculta as iterações no codigo
% verbose 1 - Mostra as iterações no código
% verbose 2 - Mostra as iterações do codigo com cor
chamativa
% Uso do Solver
solvesdp(LMIs,[],ops)
Q=value(Q); %valor numerico de Q
Y=value(Y); %valor numerico de Y
K=Y*inv(Q);
E=eig(A-B*K),
Sendo E = −4,7406 j0,5157 respectivamente e raio absoluto de 4,76, ou seja, e ângulo de 6,2º,
comprovando a alocação por D-estabilidade. Em Pyhton, a mesma representação é dada pelo seguinte
código:
#Importando bibliotecas
from numpy import * # Traz todas as funções NumPy
from matplotlib.pyplot import * # Traz todas as funções de plotti
n MATLAB
from control.matlab import * # Funções como se fosse MATLAB
import control
from scipy import linalg
from numpy.linalg import matrix_rank
from numpy.linalg import inv
import numpy as np
import matplotlib.pyplot as plt
import random
import cvxpy as cp # Traz todas as funções de otimiz
ação convexa
# Condições de D-Estabilidade
h1=-2; h1=matrix(h1);
teta=pi - (pi/3); teta=matrix(teta); # th= 60º
#Restrições conicas
T1=(A@Q-B@Y).T+(A@Q-B@Y);
T2=(A@Q-B@Y).T-(A@Q-B@Y);
# operando as restrições
constraints = [Q >> 1e-6*eye(n)]
constraints += [cp.bmat([[sin(teta)@T1, -cos(teta)@T2],
[cos(teta)@T2, sin(teta)@T1]]) << 0]
constraints += [-2*h1@Q + ((A@Q - B@Y) + (A@Q - B@Y).T) <<0 ]
obj = cp.trace(Q);
prob = cp.Problem(cp.Minimize(obj), #função objetivo é minimizar
Q
constraints)
#prob.solve(solver=cp.SCS, verbose=True);
prob.solve(solver=cp.CVXOPT, verbose=True);
# Print result.
Qs=Q.value; Qs=matrix(Qs);
Ys=Y.value; Ys=matrix(Ys);
K = Ys*inv(Qs)
[Es,Vs]=linalg.eig(A-B*K)
Rd = abs(Es)
Ang=angle(Es)
O complemento de Schur consiste em uma estratégia algébrica por transformação de congruência que
converte uma expressão matricial quadrática com matrizes inversas em uma matriz linear. Os
principais tipos de conversão por complemento de Schur utilizado nesta prática são:
M M2
M = M1 − M 2 M 3−1M 2 ' = 1 = M \ M3 (26)
M 2 ' M 3
e
M M2
M = M 3 − M 2 M1−1M 2 ' = 1 = M \ M1 (27)
M 2 ' M 3
que consiste na formulação da equação de Riccati na forma de LMIs. Portanto o processo de restrição
para a minimização e obtenção do modelo de solução é dado por
min − Tr Q
Q =Q ',Y
− ( AQ − BY ) '− ( AQ − BY ) Q Y'
(36)
−1
Q Qc 0 0
Y 0 Rc −1
Sendo K = YQ−1 . O script a seguir mostra a aplicação do processo de restrição de (36) no exemplo 2,
considera-se Q c = 100I 2 e Rc = 1
close all, clear all, clc
A=[0 1;0 -10]; %matriz A
B=[0 1]'; %matriz B
% Matrizes de Ponderação
Qc=100*eye(2);
Rc=1;
% Declarando as variáveis semidefinidas positivas (sdp)
[m,n]=size(B); % tamanho da matriz A
Q=sdpvar(m,m); %declarando a matriz simétrica
Y=sdpvar(n,m); %declarando a matriz
% Processo de restrição
LMIs=[Q>=0];
Riccati=[[-(A*Q-B*Y)-(A*Q-B*Y)' Q Y';
Q inv(Qc) zeros(m,n);
Y zeros(n,m) inv(Rc) ] >= 0];
LMIs=[LMIs, Riccati];
% Condições de otimização
ops=sdpsettings;
ops.solver='sedumi'; %solver sedumi
ops.tol=1e-5; % tolerancia
ops.verbose=1;
% verbose 0 - Oculta as iterações no codigo
% verbose 1 - Mostra as iterações no código
% verbose 2 - Mostra as iterações do codigo com cor
chamativa
% Uso do Solver
solvesdp(LMIs,-trace(Q),ops)
Q=value(Q); %valor numerico de P
Y=value(Y); %valor numerico de P
figure(1)
plot(t,y); xlabel('t(s)'), ylabel('\theta (rad)')
grid
A Figura 1 mostra a resposta ao degrau no formato de um servo tipo 1, cuja planta possui um
integrador.
Figura 1. Resposta ao degrau do modelo.
A mesma implementação realizada em Matlab pode ser vista em Python usando o Google Colab.
#Importando bibliotecas
from numpy import * # Traz todas as funções NumPy
from matplotlib.pyplot import * # Traz todas as funções de plotti
n MATLAB
from control.matlab import * # Funções como se fosse MATLAB
import control
from scipy import linalg
from numpy.linalg import matrix_rank
from numpy.linalg import inv
import numpy as np
import matplotlib.pyplot as plt
import random
import cvxpy as cp # Traz todas as funções de otimiz
ação convexa
# Matrizes de Ponderação
Qc=100*eye(2); Qc=matrix(Qc);
Rc=1; Rc=matrix(Rc);
# Print result.
Qs=Q.value; Qs=matrix(Qs);
Ys=Y.value; Ys=matrix(Ys);
K = Ys*inv(Qs)
[Es,Vs]=linalg.eig(A-B*K)
figure(1)
subplot(2,2,1)
plot(t,x[:,0]); grid(True)
axis([0, t[npts-1], 0, 1])
xlabel('t (s)'), ylabel('x1')
% Processo de restrição
LMIs=[Q>=0];
DiscoCentrado1=[[-raio*Q q*Q+(A1*Q-B*Y);q*Q+(A1*Q-B*Y)'
-raio*Q]<=0];
DiscoCentrado2=[[-raio*Q q*Q+(A2*Q-B*Y);q*Q+(A2*Q-B*Y)'
-raio*Q]<=0];
% Condições de otimização
ops=sdpsettings;
ops.solver='sedumi'; %solver sedumi
ops.tol=1e-5; % tolerancia
ops.verbose=1;
% verbose 0 - Oculta as iterações no codigo
% verbose 1 - Mostra as iterações no código
% verbose 2 - Mostra as iterações do codigo com cor
chamativa
% Uso do Solver
solvesdp(LMIs,[],ops)
Q=value(Q); %valor numerico de Q
Y=value(Y); %valor numerico de Y
Kc=Y*inv(Q);
% Modelo de malha fechada aplicada a cada ponto de
operação
Ac1=A1-B*Kc; Ac2=A2-B*Kc; Acn=Anom-B*Kc;
E1=eig(Ac1),
E2=eig(Ac2),
En=eig(Acn),
sysmf1=ss(Ac1,Bc,Cc,Dc);
sysmf2=ss(Ac2,Bc,Cc,Dc);
sysmfn=ss(Acn,Bc,Cc,Dc);
[y1,t,x1]=lsim(sysmf1,ref,t,x0);
[y2,t,x2]=lsim(sysmf2,ref,t,x0);
[yn,t,xn]=lsim(sysmfn,ref,t,x0);
figure(1)
plot(t,y1,t,y2,t,yn); legend('A_1', 'A_2', 'A_{nom}')
axis([0 t(end) 0 1.2*y1(end)])
xlabel('t(s)'), ylabel('\theta (rad)')
grid
A Figura 4 mostra o resultado do script para o modelo politópico proposto.
# Especificação
h1=-3; h1=matrix(h1);
q=0; q=matrix(q);
raio=20; raio=matrix(raio);
# operando as restrições
constraints = [Q >> 1e-6*eye(m)]
#Disco Centrado e Lyapunov para A1
constraints += [cp.bmat([[-raio@Q, q@Q+(A1@Q-B@Y)],
[q@Q+(Q@A1.T-Y.T@B.T), -raio@Q]
]) << 0]
constraints += [ -
2*h1@Q + (A1@Q - B@Y + Q@A1.T - Y.T@ B.T ) << 0 ]
#Disco Centrado e Lyapunov para A2
constraints += [cp.bmat([[-raio@Q, q@Q+(A2@Q-B@Y)],
[q@Q+(Q@A2.T-Y.T@B.T), -raio@Q]
]) << 0]
constraints += [ -
2*h1@Q + (A2@Q - B@Y + Q@A2.T - Y.T@ B.T ) << 0 ]
obj = cp.trace(Q);
prob = cp.Problem(cp.Minimize(obj), #função objetivo é minimizar
Q
constraints)
prob.solve(solver=cp.SCS, verbose=True);
#prob.solve(solver=cp.CVXOPT, verbose=True);
# Print result.
Qs=Q.value; Qs=matrix(Qs);
Ys=Y.value; Ys=matrix(Ys);
K = Ys*inv(Qs)
[Es,Vs]=linalg.eig(An-B*K)
BB=B*K[0,0];
CC=matrix([1, 0]);
DD=0;
# Condição Inicial
x0=transpose([0, 0]);
npts=100; t=linspace(0,3,npts); #tempo de resposta
ref=ones(npts);
#u=0;
sys_mfn=ss(AAn, BB, CC, DD); [yn,t,x] = lsim(sys_mfn,ref,t,x0);
sys_mf1=ss(AA1, BB, CC, DD); [y1,t,x] = lsim(sys_mf1,ref,t,x0);
sys_mf2=ss(AA2, BB, CC, DD); [y2,t,x] = lsim(sys_mf2,ref,t,x0);
figure(1)
subplot(2,2,1)
plot(t,y1,'b', t,y2,'g', t,yn,'r'); grid(True)
axis([0, t[npts-1], 0, 1.2])
xlabel('t (s)'), ylabel('\u03B8')
legend(('A1', 'A2', 'An'), loc='lower right'); #insere legendas n
a figura
show()