Otimização do sistema de controle LQR

1. Introdução


Vários artigos [1,2,3] foram publicados no Habr que direta ou indiretamente se relacionam com este tópico. Nesse sentido, não se pode deixar de observar a publicação [1] com o título “Matemática nos dedos: regulador linear-quadrático”, que popularmente explica o princípio de operação do controlador LQR ideal.

Eu queria continuar esse tópico, tendo examinado a aplicação prática do método de otimização dinâmica, mas já em um exemplo concreto usando Python. Primeiro, algumas palavras sobre a terminologia e o método de otimização dinâmica.

Os métodos de otimização são divididos em estático e dinâmico. O objeto de controle está em um estado de movimento contínuo sob a influência de vários fatores externos e internos. Portanto, a avaliação do resultado do controle é fornecida para o tempo de controle T, e essa é a tarefa da otimização dinâmica.

Usando métodos de otimização dinâmica, são resolvidos os problemas associados à distribuição de recursos limitados por um período de tempo, e a função objetivo é escrita como uma funcionalidade integral.

O aparato matemático para resolver tais problemas são métodos variacionais: cálculo clássico de variações, o princípio do L.S. máximo Pontryagin e programação dinâmica R. Bellman.

A análise e síntese dos sistemas de controle são realizadas nos espaços de tempo, frequência e estado. A análise e síntese de sistemas de controle no espaço de estados é introduzida no currículo, no entanto, as técnicas apresentadas nos materiais de treinamento usando o controlador SQR foram projetadas para o Matlab e não contêm exemplos práticos de análise.

O objetivo desta publicação é considerar os métodos de análise e síntese de sistemas de controle linear no espaço de estados usando o conhecido exemplo de otimização do sistema de controle de um acionamento elétrico e de uma aeronave usando a linguagem de programação Python.

Fundamentação matemática do método de otimização dinâmica


Para otimização, são utilizados os critérios de amplitude (MO), simétrica (CO) e ótimos de compromisso (KO).

Ao resolver problemas de otimização no espaço de estados, um sistema estacionário linear é dado por equações de matriz vetorial:

 pontox= fracdxdt=A cdotx+B cdotu;y=C cdotx, (1)

Os critérios integrais para o consumo mínimo de energia de controle e a velocidade máxima são definidos pelos funcionais:

Jx= int infty0(xTQx+uTRu+2xTNu)dt rightarrowmin, 2)

Ju= int infty0(yTQy+uTRu+2yTNu)dt rightarrowmin. (3)

A lei de controle u está na forma de feedback linear nas variáveis ​​de estado x ou nas variáveis ​​de saída y:

u= pmKx,u= pmKy

Esse controle minimiza os critérios de qualidade quadráticos (2), (3). Nas relações (1) ÷ (3), Q e R são matrizes definidas positivas simétricas de dimensão [n × n] e [m × m], respectivamente; K é uma matriz de coeficientes constantes de dimensão [m × n], cujos valores não são limitados. Se o parâmetro de entrada N for omitido, será considerado zero.

A solução para esse problema, que é chamado de problema de otimização quadrática integral linear (otimização LQR), no espaço de estados é determinada pela expressão:

u=R1BTPx

onde a matriz P deve satisfazer a equação de Ricatti:

ATP+PA+PBR1BTP+Q=0

Os critérios (2), (3) também são contraditórios, pois a implementação do primeiro termo requer uma fonte de potência infinitamente alta e, para o segundo, uma fonte de potência infinitamente baixa. Isso pode ser explicado pela seguinte expressão:

Jx= int infty0xTQxdt ,

qual é a norma Mod(x) vetor x, isto é uma medida de sua oscilação no processo de regulação e, portanto, assume valores menores em transientes rápidos com menos oscilação e a expressão:

Ju= int infty0uTRudt

é uma medida da quantidade de energia usada para controle, é uma penalidade pelos custos de energia do sistema.

As matrizes de ponderação Q, R e N dependem das restrições das coordenadas correspondentes. Se qualquer elemento dessas matrizes for igual a zero, a coordenada correspondente não terá restrições. Na prática, a escolha dos valores das matrizes Q, R, N é realizada pelo método de estimativas de especialistas, tentativa, erro e depende da experiência e do conhecimento do engenheiro de projeto.

Para resolver esses problemas, foram utilizados os seguintes operadores do MATLAB:
 beginbmatrixR,S,E endbmatrix=lqr(A,B,Q,R,N) e  beginbmatrixR,S,E endbmatrix=lqry(Ps,Q,R,N) que minimizam os funcionais (2), (3) pelo vetor de estado x ou pelo vetor de saída y.

Modelo de Objetos de Gerenciamento Ps=ss(A,B,C,D). O resultado do cálculo é a matriz K de feedbacks ótimos em relação às variáveis ​​de estado x, a solução da equação de Ricatti S e os valores próprios E = eiq (A-BK) do sistema de controle em malha fechada.

Componentes funcionais:

Jx=x0TP1x0,Ju=x0TP2x0

onde x0 é o vetor de condições iniciais; P1 e P2 - matrizes desconhecidas que são uma solução das equações da matriz de Lyapunov. Eles são encontrados usando funções; P1=lyap(NN,Q) e P2=lyap(NN,KTRK) , NN=(A+BK)T

Recursos da implementação do método de otimização dinâmica usando Python


Embora a Biblioteca de Sistemas de Controle Python [4] tenha funções: control.lqr, control.lyap, o uso de control.lqr é possível apenas se o módulo slycot estiver instalado, o que é um problema [5]. Ao usar a função lyap no contexto de uma tarefa, a otimização resulta em um control.exception.ControlArgument: Q deve ser um erro de matriz simétrica [6].

Portanto, para implementar as funções lqr () e lyap (), usei o scipy.linalg:

from numpy import* from scipy.linalg import* def lqr(A,B,Q,R): S =matrix(solve_continuous_are(A, B, Q, R)) K = matrix(inv(R)*(BT*S)) E= eig(AB*K)[0] return K, S, E P1=solve_lyapunov(NN,Ct*Q*C) 

A propósito, você não deve abandonar completamente o controle, pois as funções step (), pole (), ss (), tf (), feedback (), acker (), place () e outras funcionam bem.

Um exemplo de otimização de LQR em um inversor elétrico

(um exemplo é retirado da publicação [7])

Considere a síntese de um controlador quadrático-linear que satisfaça o critério (2) para um objeto de controle definido no espaço de estados por matrizes:

A = \ begin {bmatrix} & -100 & 0 & 0 \\ & 143.678 & -16.667 & -195.402 \\ & 0 & 1.046 & 0 \ end {bmatrix}; B = \ begin {bmatrix} 2300 \\ 0 \\ 0 \\ end {bmatrix}; C = \ begin {bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \ end {bmatrix}; D = 0

A = \ begin {bmatrix} & -100 & 0 & 0 \\ & 143.678 & -16.667 & -195.402 \\ & 0 & 1.046 & 0 \ end {bmatrix}; B = \ begin {bmatrix} 2300 \\ 0 \\ 0 \\ end {bmatrix}; C = \ begin {bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \ end {bmatrix}; D = 0



Os seguintes itens são considerados como variáveis ​​de estado: x1 - tensão do conversor, V; x2 - corrente do motor, A; x3 - velocidade angular c1 . Este é o sistema TP - DPT com HB: motor R nom = 30 kW; Unom = 220 V; Inom = 147 A ;;  omegaω 0 = 169 c1 ;  omegaω max = 187 c1 ; momento nominal de resistência Mnom = 150 N * m; multiplicidade da corrente de partida = 2; conversor de tiristores: Unom = 230 V; Uy = 10 B; Inom = 300 A; multiplicidade de sobrecorrente de curto prazo = 1,2.

Ao resolver o problema, aceitamos a matriz Q na diagonal. Como resultado da modelagem, verificou-se que os valores mínimos dos elementos da matriz R = 84 e Q=[[0,01,0,0],[0,0,01,0],[0,0,0,01]]. Nesse caso, é observado um processo de transição monotônica da velocidade angular do motor (fig. 1). Em R = 840 Q=[[0,01,0,0],[0,0,01,0],[0,0,0,01]] processo transitório (Fig. 2) atende ao critério de MO. O cálculo das matrizes P1 e P2 foi realizado em x0 = [220 147 162].

Listando o programa (Fig. 1).
 # -*- coding: utf8 -*- from numpy import* from control.matlab import * from matplotlib import pyplot as plt from scipy.linalg import* def lqr(A,B,Q,R): S =matrix(solve_continuous_are(A, B, Q, R)) K = matrix(inv(R)*(BT*S)) E= eig(AB*K)[0] return K, S, E #   A=matrix([[-100,0,0],[143.678, -16.667,-195.402],[0,1.046,0]]); B=matrix([[2300], [0], [0]]); C=eye(3) D=zeros([3,1]) #    R=[[84]] Q=matrix([[0.01, 0, 0],[0, 0.01, 0],[0, 0, 0.01]]); #  LQR-  [K,S,E]=lqr(A,B,Q,R) #    N=AB*K; NN=NT; w=ss(N,B,C,D) x0=matrix([[220], [147], [162]]); Ct=CT; P1=solve_lyapunov(NN,Ct*Q*C) Kt=KT; x0t=x0.T; Jx=abs((x0t*P1*x0)[0,0]) P2=solve_lyapunov(NN,Kt*R*K); Ju=abs((x0t*P2*x0)[0,0]) fig = plt.figure() plt.suptitle('      R = %s,\n\ $J_{x}$= %s; $J_{u}$ = %s,Q=[[0.01,0,0],[0, 0.01,0],[0,0,0.01]]'%(R[0][0],round(Jx,1),round(Ju,1))) ax1 = fig.add_subplot(311) y,x=step(w[0,0]) ax1.plot(x,y,"b") plt.ylabel('$x_{1}$,B') ax1.grid(True) ax2 = fig.add_subplot(312) y,x=step(w[1,0]) ax2.plot(x,y,"b") plt.ylabel('$x_{2}$,A') ax2.grid(True) ax3 = fig.add_subplot(313) y,x=step(w[2,0]) ax3.plot(x,y,"b") plt.ylabel('$x_{3}$,$C^{-1}$') ax3.grid(True) plt.xlabel(', .') plt.show() 



Fig. 1

Listando o programa (Fig. 2).
 # -*- coding: utf8 -*- from numpy import* from control.matlab import * from matplotlib import pyplot as plt from scipy.linalg import* def lqr(A,B,Q,R): S =matrix(solve_continuous_are(A, B, Q, R)) K = matrix(inv(R)*(BT*S)) E= eig(AB*K)[0] return K, S, E #   A=matrix([[-100,0,0],[143.678, -16.667,-195.402],[0,1.046,0]]); B=matrix([[2300], [0], [0]]); C=eye(3) D=zeros([3,1]) #    R=[[840]] Q=matrix([[0.01, 0, 0],[0, 0.01, 0],[0, 0, 0.01]]); #  LQR-  [K,S,E]=lqr(A,B,Q,R) #    N=AB*K; NN=NT; w=ss(N,B,C,D) x0=matrix([[220], [147], [162]]); Ct=CT; P1=solve_lyapunov(NN,Ct*Q*C) Kt=KT; x0t=x0.T; Jx=abs((x0t*P1*x0)[0,0]) P2=solve_lyapunov(NN,Kt*R*K); Ju=abs((x0t*P2*x0)[0,0]) fig = plt.figure() plt.suptitle('      R = %s,\n\ $J_{x}$= %s; $J_{u}$ = %s,Q=[[0.01,0,0],[0, 0.01,0],[0,0,0.01]]'%(R[0][0],round(Jx,1),round(Ju,1))) ax1 = fig.add_subplot(311) y,x=step(w[0,0]) ax1.plot(x,y,"b") plt.ylabel('$x_{1}$,B') ax1.grid(True) ax2 = fig.add_subplot(312) y,x=step(w[1,0]) ax2.plot(x,y,"b") plt.ylabel('$x_{2}$,A') ax2.grid(True) ax3 = fig.add_subplot(313) y,x=step(w[2,0]) ax3.plot(x,y,"b") plt.ylabel('$x_{3}$,$C^{-1}$') ax3.grid(True) plt.xlabel(', .') plt.show() 



Fig. 2
Pela seleção apropriada das matrizes R e Q, é possível reduzir a corrente de partida do motor para valores aceitáveis ​​iguais a (2–2,5) In (Fig. 3). Por exemplo, com R = 840 e
Q = ([[[0,01,0,0]], [0,0,88,0], [0,0,0,01]], seu valor é 292 A e o tempo de processo de transição sob essas condições é 1,57 s.

Listando o programa (Fig. 3).
 # -*- coding: utf8 -*- from numpy import* from control.matlab import * from matplotlib import pyplot as plt from scipy.linalg import* def lqr(A,B,Q,R): S =matrix(solve_continuous_are(A, B, Q, R)) K = matrix(inv(R)*(BT*S)) E= eig(AB*K)[0] return K, S, E #   A=matrix([[-100,0,0],[143.678, -16.667,-195.402],[0,1.046,0]]); B=matrix([[2300], [0], [0]]); C=eye(3) D=zeros([3,1]) #    R=[[840]] Q=matrix([[0.01,0,0],[0,0.88,0],[0,0,0.01]]); #  LQR-  [K,S,E]=lqr(A,B,Q,R) #    N=AB*K; NN=NT; w=ss(N,B,C,D) x0=matrix([[220], [147], [162]]); Ct=CT; P1=solve_lyapunov(NN,Ct*Q*C) Kt=KT; x0t=x0.T; Jx=abs((x0t*P1*x0)[0,0]) P2=solve_lyapunov(NN,Kt*R*K); Ju=abs((x0t*P2*x0)[0,0]) fig = plt.figure() plt.suptitle('      R = %s,\n\ $J_{x}$= %s; $J_{u}$ = %s,Q=[[0.01,0,0],[0,0.88,0],[0,0,0.01]]'%(R[0][0],round(Jx,1),round(Ju,1))) ax1 = fig.add_subplot(311) y,x=step(w[0,0]) ax1.plot(x,y,"b") plt.ylabel('$x_{1}$,B') ax1.grid(True) ax2 = fig.add_subplot(312) y,x=step(w[1,0]) ax2.plot(x,y,"b") plt.ylabel('$x_{2}$,A') ax2.grid(True) ax3 = fig.add_subplot(313) y,x=step(w[2,0]) ax3.plot(x,y,"b") plt.ylabel('$x_{3}$,$C^{-1}$') ax3.grid(True) plt.xlabel(', .') plt.show() 



Fig.3

Em todos os casos considerados, os feedbacks sobre tensão e corrente são negativos e na velocidade, positivos, o que é indesejável de acordo com os requisitos de estabilidade. Além disso, o sistema sintetizado é astático para a tarefa e estático para a carga. Portanto, consideramos a síntese de um controlador PI no espaço de estados com uma variável de estado adicional x4 - coeficiente de transferência do integrador.

Representamos as informações iniciais na forma de matrizes:

A = \ begin {bmatrix} & -100 & 0 & 0 & 0 \\ & 143.678 & -16.667 & -195.402 & 0 \\ & 0 & 1.046 & 0 & 0 \ 0 & 0 & 0 & 1 & 0 \ end {bmatrix}; B = \ begin {bmatrix} 2300 \\ 0 \\ 0 \\ 0 \\\ end {bmatrix}; C = olho (4)); D = 0

Os transitórios de tarefas correspondentes ao critério MO foram obtidos em R = 100, q11 = q22 = q33 = 0,001 e q44 = 200. A Figura 4 mostra os transitórios das variáveis ​​de estado confirmando o astatismo do sistema por tarefa e por carga.

Listagem de programas (Fig. 4).
 # -*- coding: utf8 -*- from numpy import* from control.matlab import * from matplotlib import pyplot as plt from scipy.linalg import* def lqr(A,B,Q,R): S =matrix(solve_continuous_are(A, B, Q, R)) K = matrix(inv(R)*(BT*S)) E= eig(AB*K)[0] return K, S, E #   A=matrix([[-100,0,0,0],[143.678, -16.667,-195.402,0],[0,1.046,0,0] ,[0,0,1,0]]); B=matrix([[2300], [0], [0],[0]]); C=matrix([[1, 0, 0,0],[0, 1, 0,0],[0, 0, 1,0],[0, 0, 0,1]]); D=matrix([[0],[0],[0],[0]]); #    R=[[100]]; Q=matrix([[0.001, 0, 0,0],[0, 0.001, 0,0],[0, 0, 0.01,0],[0, 0,0,200]]); #  LQR-  (K,S,E)=lqr(A,B,Q,R) #    N=AB*K; NN=NT; w=ss(N,B,C,D) x0=matrix([[220], [147], [162],[0]]); Ct=CT; P1=solve_lyapunov(NN,Ct*Q*C) Kt=KT; x0t=x0.T; Jx=abs((x0t*P1*x0)[0,0]) P2=solve_lyapunov(NN,Kt*R*K); Ju=abs((x0t*P2*x0)[0,0]) fig = plt.figure(num=None, figsize=(9, 7), dpi=120, facecolor='w', edgecolor='k') plt.suptitle('      LQR -',size=14) ax1 = fig.add_subplot(411) y,x=step(w[0,0]) ax1.plot(x,y,"b") plt.ylabel('out(1)') ax1.grid(True) ax2 = fig.add_subplot(412) y,x=step(w[1,0]) ax2.plot(x,y,"b") plt.ylabel('out(2)') ax2.grid(True) ax3 = fig.add_subplot(413) y,x=step(w[2,0]) ax3.plot(x,y,"b") plt.ylabel('out(3)') ax3.grid(True) ax4 = fig.add_subplot(414) y,x=step(w[3,0]) ax4.plot(x,y,"b") plt.ylabel('out(4)') ax4.grid(True) plt.xlabel(', .') plt.show() 



Fig. 4
Para determinar a matriz K, a Biblioteca de Sistemas de Controle Python possui duas funções K = acker (A, B, s) e K = place (A, B, s), onde s é o vetor - a linha dos polos desejados da função de transferência do sistema de controle de circuito fechado. O primeiro comando pode ser usado apenas para sistemas com uma entrada em u para n≤5. O segundo não possui essas restrições, mas a multiplicidade dos polos não deve exceder a classificação da matriz B. Um exemplo do uso do operador acker () é mostrado na listagem e na (Fig. 5).

Listagem de programas (Fig. 5).
 # -*- coding: utf8 -*- from numpy import* from control.matlab import * from matplotlib import pyplot as plt i=(-1)**0.5 A=matrix([[-100,0,0],[143.678, -16.667,-195.402],[0,1.046,0]]); B=matrix([[2300], [0], [0]]); C=eye(3) D=zeros([3,1]) p=[[-9.71+14.97*i -9.71-14.97*i -15.39 -99.72]]; k=acker(A,B,p) H=AB*k; Wss=ss(H,B,C,D); step(Wss) w=tf(Wss) fig = plt.figure() plt.suptitle('   acker()') ax1 = fig.add_subplot(311) y,x=step(w[0,0]) ax1.plot(x,y,"b") ax1.grid(True) ax2 = fig.add_subplot(312) y,x=step(w[1,0]) ax2.plot(x,y,"b") ax2.grid(True) ax3 = fig.add_subplot(313) y,x=step(w[2,0]) ax3.plot(x,y,"b") ax3.grid(True) plt.xlabel(', .') plt.show() 




Fig. 5

Conclusão


A implementação da otimização do drive LQR apresentada na publicação, levando em consideração o uso das novas funções lqr () e lyap (), permitirá abandonar o uso do programa MATLAB licenciado ao estudar a seção correspondente da teoria de controle.

Um exemplo de otimização de LQR em uma aeronave (LA)

(um exemplo é retirado da publicação de Astrom e Mruray, capítulo 5 [8] e finalizado pelo autor do artigo em termos de substituição da função lqr () e redução da terminologia para a geralmente aceita)

A parte teórica, uma breve teoria, a otimização do LQR já foi considerada acima, então vamos para a análise de código com os comentários correspondentes:

Bibliotecas necessárias e função do controlador LQR.

 from scipy.linalg import* # scipy   lqr from numpy import * # numpy    from matplotlib.pyplot import * #     from control.matlab import * #  control..ss()  control..step() #     lqr() m = 4; #    . J = 0.0475; #        ***2 #́-       #  . r = 0.25; #     . g = 9.8; #     /**2 c = 0.05; #   () def lqr(A,B,Q,R): X =matrix(solve_continuous_are(A, B, Q, R)) K = matrix(inv(R)*(BT*X)) E= eig(AB*K)[0] return X, K, E 

Condições iniciais e matrizes básicas modelos A, B, C, D.

 xe = [0, 0, 0, 0, 0, 0];#   x   () ue = [0, m*g]; #   #   A = matrix( [[ 0, 0, 0, 1, 0, 0], [ 0, 0, 0, 0, 1, 0], [ 0, 0, 0, 0, 0, 1], [ 0, 0, (-ue[0]*sin(xe[2]) - ue[1]*cos(xe[2]))/m, -c/m, 0, 0], [ 0, 0, (ue[0]*cos(xe[2]) - ue[1]*sin(xe[2]))/m, 0, -c/m, 0], [ 0, 0, 0, 0, 0, 0 ]]) #   B = matrix( [[0, 0], [0, 0], [0, 0], [cos(xe[2])/m, -sin(xe[2])/m], [sin(xe[2])/m, cos(xe[2])/m], [r/J, 0]]) #   C = matrix([[1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0]]) D = matrix([[0, 0], [0, 0]]) 

Construímos entradas e saídas correspondentes a alterações passo a passo na posição xy. Os vetores xd e yd correspondem ao estado estacionário desejado no sistema. Matrizes Cx e Cy são as saídas correspondentes do modelo. Para descrever a dinâmica do sistema, usamos um sistema de equações da matriz vetorial:

\ left \ {\ begin {matrix} xdot = Ax + Bu => xdot = (A-BK) x + xd \\ u = -K (x-xd) \\ y = Cx \\ \ end {matriz} \ right.



A dinâmica de um loop fechado pode ser modelada usando a função step (), para K \ cdot xd e K \ cdot xd como vetores de entrada, onde:

 xd = matrix([[1], [0], [0], [0], [0], [0]]); yd = matrix([[0], [1], [0], [0], [0], [0]]); 

A biblioteca de controle atual 0.8.1 suporta apenas parte das funções do SISO Matlab para criar controladores de feedback; portanto, para ler dados do controlador, é necessário criar vetores de índice lat (), alt () para a dinâmica lateral -x e vertical -y.

 lat = (0,2,3,5); alt = (1,4); #    Ax = (A[lat, :])[:, lat]; Bx = B[lat, 0]; Cx = C[0, lat]; Dx = D[0, 0]; Ay = (A[alt, :])[:, alt]; By = B[alt, 1]; Cy = C[1, alt]; Dy = D[1, 1]; #      K Qx1 = diag([1, 1, 1, 1, 1, 1]); Qu1a = diag([1, 1]); X,K,E =lqr(A, B, Qx1, Qu1a) K1a = matrix(K); #      x H1ax = ss(Ax - Bx*K1a[0,lat], Bx*K1a[0,lat]*xd[lat,:], Cx, Dx); (Yx, Tx) = step(H1ax, T=linspace(0,10,100)); #     y H1ay = ss(Ay - By*K1a[1,alt], By*K1a[1,alt]*yd[alt,:], Cy, Dy); (Yy, Ty) = step(H1ay, T=linspace(0,10,100)); 

Os gráficos são exibidos sequencialmente, um para cada tarefa.

 figure(); title("   x  y") plot(Tx.T, Yx.T, '-', Ty.T, Yy.T, '--'); plot([0, 10], [1, 1], 'k-'); axis([0, 10, -0.1, 1.4]); ylabel(' '); xlabel(''); legend(('x', 'y'), loc='lower right'); grid() show() 

Gráfico:



A influência da amplitude das ações de entrada
 #     Qu1a = diag([1, 1]); X,K,E =lqr(A, B, Qx1, Qu1a) K1a = matrix(K); H1ax = ss(Ax - Bx*K1a[0,lat], Bx*K1a[0,lat]*xd[lat,:], Cx, Dx); Qu1b = (40**2)*diag([1, 1]); X,K,E =lqr(A, B, Qx1, Qu1b) K1b = matrix(K); H1bx = ss(Ax - Bx*K1b[0,lat], Bx*K1b[0,lat]*xd[lat,:],Cx, Dx); Qu1c = (200**2)*diag([1, 1]); X,K,E =lqr(A, B, Qx1, Qu1c) K1c = matrix(K); H1cx = ss(Ax - Bx*K1c[0,lat], Bx*K1c[0,lat]*xd[lat,:],Cx, Dx); figure(); [Y1, T1] = step(H1ax, T=linspace(0,10,100)); [Y2, T2] = step(H1bx, T=linspace(0,10,100)); [Y3, T3] = step(H1cx, T=linspace(0,10,100)); plot(T1.T, Y1.T, 'r-'); plot(T2.T, Y2.T, 'b-'); plot(T3.T, Y3.T, 'g-'); plot([0 ,10], [1, 1], 'k-'); axis([0, 10, -0.1, 1.4]); title("   ") legend(('1', '$1,6\cdot 10^{3}$','$4\cdot 10^{4}$'), loc='lower right'); text(5.3, 0.4, 'rho'); ylabel(' '); xlabel(''); grid() show() 


Gráfico:



Resposta transitória
 #  Qx    Qx2 = CT * C; Qu2 = 0.1 * diag([1, 1]); X,K,E =lqr(A, B, Qx2, Qu2) K2 = matrix(K); H2x = ss(Ax - Bx*K2[0,lat], Bx*K2[0,lat]*xd[lat,:], Cx, Dx); H2y = ss(Ay - By*K2[1,alt], By*K2[1,alt]*yd[alt,:], Cy, Dy); figure(); [Y2x, T2x] = step(H2x, T=linspace(0,10,100)); [Y2y, T2y] = step(H2y, T=linspace(0,10,100)); plot(T2x.T, Y2x.T, T2y.T, Y2y.T) plot([0, 10], [1, 1], 'k-'); axis([0, 10, -0.1, 1.4]); title(" ") ylabel(' '); xlabel(''); legend(('x', 'y'), loc='lower right'); grid() show() 


Gráfico:



Resposta transitória fisicamente baseada
 #    #       #   1 .     10 . Qx3 = diag([100, 10, 2*pi/5, 0, 0, 0]); Qu3 = 0.1 * diag([1, 10]); X,K,E =lqr(A, B, Qx3, Qu3) K3 = matrix(K); H3x = ss(Ax - Bx*K3[0,lat], Bx*K3[0,lat]*xd[lat,:], Cx, Dx); H3y = ss(Ay - By*K3[1,alt], By*K3[1,alt]*yd[alt,:], Cy, Dy); figure(); [Y3x, T3x] = step(H3x, T=linspace(0,10,100)); [Y3y, T3y] = step(H3y, T=linspace(0,10,100)); plot(T3x.T, Y3x.T, T3y.T, Y3y.T) axis([0, 10, -0.1, 1.4]); title("   ") ylabel(' '); xlabel(''); legend(('x', 'y'), loc='lower right'); grid() show() 


Gráfico:



Conclusão:


A implementação da otimização do LQR na aeronave apresentada na publicação, levando em consideração o uso da nova função lqr (), permite abandonar o uso do programa licenciado MATLAB ao estudar a seção correspondente da teoria de controle.

Referências


1. Matemática nos dedos: controlador linear-quadrático.

2. O espaço de estados nos problemas de projetar sistemas de controle ideais.

3. Usando a Biblioteca de Sistemas de Controle Python para projetar sistemas de controle automático.

4. Biblioteca de sistemas de controle Python.

5. Python - não é possível importar o módulo slycot para o spyder (RuntimeError & ImportError).

6. Biblioteca de sistemas de controle Python.

7. Critérios para controle ideal e otimização do lqr em um inversor elétrico.

Source: https://habr.com/ru/post/pt441582/


All Articles