0.8
0.6
Cd2 = [0 0 1] (18)
0.4
0.2
0.0
2.2 Especificações de Projeto
0 5 10 15 20 25
0.175
0.150
A tabela 2 mostra as especificações dos parâmetros de
0.125
0.100
desempenho desejados para o processo.
0.075
0.050
0.025
Tabela 2. Especificações para o Caso 2
0.000
0 5 10 15 20 25
Tempo(s)
Parêmetro ts tr OS% tp
Especificação 10s sem restrição 10% -
Figura 1. Saı́da do sistema em resposta a um degrau
unitário 2.3 Cálculo dos Parâmetros
Observa-se que nessa topologia, o sistema alcançou %OS = Substituindo o valor do tempo de acomodação desejado
0%, atendendo à especificaçõe de overshoot. Porém o mostrado na tabela 2 em (19), é possı́vel estabelecer a
tempo de acomodação Ts = 20s não é exatamente o relação entre ζ e ωn , como mostrado em (20):
esperado. A seguinte Figura apresenta o comportamento
dos estados durante a simulação.
4
ζωn = (19)
ts
40
35 4
ζωn = =4 (20)
30 1
25
−ln(%Os )/100
0
ζ=q = 0.7156 (21)
0 5 10 15 20 25
π 2 + ln( %O s 2
100 )
Figura 2. Estados do sistema em resposta a um degrau Então, com o valor de ζ definido como 0.5, é possivel
unitário determinar o valor de ωn , como pode ser observado na
equação (22).
2. CASO 2
4
ωn = = 0.5589 (22)
Para o caso 2, o processo em estudo é represantado pela 0.5
equação (32)
Assim, substituindo os valores de ζ e ωn nas equações
(41) e (40), foram encontrados θ e r.
s+2
G2p (s) = (14)
s2 + 0.2s + 0.65 p
θ = ωn T 1 − ζ 2 = 0.3904 (23)
2.1 Discretização
O sistema G2 (s) = ZOH ∗ G2p (s) foi convertido para r = eζωn T = 0.6703 (24)
espaço de estados e discretizado, com a amostragem T=
1 (1 décimo do tempo de acomodação desejado para o Foram obtidos, assim, os pólos dominantes:
sistema), e sua equação é dada por: z1,2 = re±jθ = 0.5729 ± 0.3479 ∗ 1j (25)
x(k+1) = Ad2 x(k) + Bd2 u(k) 2.4 Projeto do controlador
(15)
y(k) = Cd2 x(k)
Primeiramente, foi calculada a controlabilidade de (15),
Na qual atravéz da ferramenta ctrb da biblioteca de controle do
python, para a matriz [Ad Ad Bd ]. Concluiu-se que o sis- Observa-se que nessa topologia, o sistema alcançou Ts =
tema é controlável. 10s e %OS = 10%, atendendo às especificações. A seguinte
Figuta mostra o comportamento dos estados durante a
O controle desse caso inclui a ação integral sobre o erro simulação.
de regulação.
Foi definido que o sistema controlado deveria possuir os
pólos calculados(apresentados em (25)), alocando-os numa 1.0
matriz P:
0.8
0.6
1.0
A tabela 3 mostra as especificações dos parâmetros de
0.8
0.6
desempenho desejados para o processo escolhidas pelos
0.4 autores.
0.2
0.0
0 5 10 15 20 25
Tabela 3. Especificações para o Caso 3
1.4
0.8
Especificação <15s sem restrições <20% -
0.6
0.4
0.2
0.0
0 5 10 15 20 25
3.3 Cálculo dos Parâmetros
Tempo(s)
0.6
0.4
0.2
ζωn T
r=e = 0.3296 (41) 0.0
0 5 10 15 20 25
0.175
0.125
0.075
0.025
0.000
0 5 10 15 20 25
Tempo(s)
Primeiramente, foi calculada a controlabilidade de (15), Figura 5. Saı́da do sistema em resposta a um degrau
atravéz da ferramenta ctrb da biblioteca de controle do unitário
python, para a matriz [Ad Ad Bd ]. Concluiu-se que o sis-
tema é controlável. Observa-se que o tempo de acomodação e o overshoot
O controle desse caso inclui a ação integral sobre o erro atenderam aos parâmetros estabelecidos.
de regulação. A seguinte Figura apresenta o comportamento dos estados
Foi definido que o sistema controlado deveria possuir os durante a simulação.
pólos calculados(apresentados em (42)), alocando-os numa
matriz P:
50
0 5 10 15 20 25
em que:
import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
plt.close(’all’)
#----------SISTEMA CONTÍNUO
def Simul_Sist_Cont(sys,Ti,T,dtT,Ue,IC):
io_sys = ctrl.LinearIOSystem(sysss)
temp = np.linspace(Ti, Ti+T, dtT)
Temp, yout, xout = ctrl.input_output_response(io_sys, temp, Ue, IC, return_x=True)
return Temp, yout[yout.shape[0]-1], xout.T[xout.shape[1]-1]
#----------PROJETO DO CONTROLADOR
A = [-0.1]
B = [1]
C = [1]
D = [0]
sysss = ctrl.ss(A,B,C,D)
T = 0.39
sysssd = ctrl.c2d(sysss,T,method=’zoh’)
Adaum1 = np.concatenate((sysssd.A, np.zeros((1,1))), axis=1)
Adaum2 = np.concatenate((-sysssd.C*sysssd.A, np.eye(1)), axis=1)
Adaum = np.concatenate((Adaum1, Adaum2), axis=0)
Bdaum = np.concatenate((sysssd.B, -sysssd.C*sysssd.B), axis=0)
Ctr=ctrl.ctrb(Adaum, Bdaum)
Post = np.linalg.matrix_rank(Ctr)
#----------CONTROLADOR
P = [0.7385, 0]
K = ctrl.place(Adaum,Bdaum,P)
Kp = K[0,0:1]
Ka = K[0,1]
Acl = Adaum-Bdaum*K
ConfAutVal = np.linalg.eig(Acl)
#----------IMPLEMENTAÇ~
AO
x1ci = 0
xaci = 0
IC = [[x1ci]]
Ti = 0
u0 = 0
y0 = 0
nAmost = 100
dtT = 1000
r = np.concatenate((np.zeros(1), np.ones(nAmost-1)))
y = np.zeros(nAmost+1)
x1 = np.concatenate((x1ci*np.ones(1), np.zeros(nAmost)))
xa = np.concatenate((xaci*np.ones(1), np.zeros(nAmost)))
u = np.zeros(nAmost)
Amostras = np.zeros(nAmost)
cont = 0
xa1 = xaci
while (Ti<=(nAmost-1)*T):
Amostras[cont] = cont
xk = IC
xa = xa1+r[cont]-y[cont]
u1 = -Kp*xk+(-Ka)*xa
u[cont] = u1[0, 0]
Ue = u1[0, 0]*np.ones_like(dtT)
Temp, yout, xout = Simul_Sist_Cont(sysss,Ti,T,dtT,Ue,IC)
cont = cont+1
y[cont] = yout
x1[cont] = xout[0]
IC = [[xout[0]]]
xa1 = xa
Ti = Ti + T
#----------GRÁFICOS
plt.figure(0)
plt.subplot(2,1,1)
plt.step(Amostras[0:nAmost-1]*T, y[0:nAmost-1], r[0:nAmost-1],’--’,where = ’post’,color=’cornflowerblue’)
plt.xlim([0, 25])
plt.grid()
plt.subplot(2,1,2)
plt.step(Amostras[0:nAmost-1]*T, u[0:nAmost-1],where = ’post’)
plt.xlabel(’Tempo(s)’)
plt.xlim([0,25])
plt.grid()
plt.figure(1)
plt.step(Amostras[0:nAmost-1]*T, x1[0:nAmost-1],Amostras[0:nAmost-1]*T,where = ’post’)
plt.xlim([0,25])
plt.grid()
Apêndice B. CÓDIGO EM PYTHON UTILIZADO PARA O CASO 2
import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
plt.close(’all’)
def Simul_Sist_Cont(sys,Ti,T,dtT,Ue,IC): #----------SISTEMA CONTÍNUO
io_sys = ctrl.LinearIOSystem(sysss)
temp = np.linspace(Ti, Ti+T, dtT)
Temp, yout, xout = ctrl.input_output_response(io_sys, temp, Ue, IC, return_x=True)
return Temp, yout[yout.shape[0]-1], xout.T[xout.shape[1]-1]
A = [[-2.2, -1.05, -1.30], [1, 0, 0], [0, 1, 0]] #----------PROJETO DO CONTROLADOR
B = [[1], [0], [0]]
C = [0, 0, 1]
D = [0]
sysss = ctrl.ss(A,B,C,D)
T = 1
sysssd = ctrl.c2d(sysss,T,method=’zoh’)
Adaum1 = np.concatenate((sysssd.A, np.zeros((3,1))), axis=1)
Adaum2 = np.concatenate((-sysssd.C*sysssd.A, np.eye(1)), axis=1)
Adaum = np.concatenate((Adaum1, Adaum2), axis=0)
Bdaum = np.concatenate((sysssd.B, -sysssd.C*sysssd.B), axis=0)
Ctr=ctrl.ctrb(Adaum, Bdaum)
Post = np.linalg.matrix_rank(Ctr)
P = [0.5729 + 0.3479*1j, 0.5729 - 0.3479*1j, 0.001, 0.002] #----------CONTROLADOR
K = ctrl.place(Adaum,Bdaum,P)
Kp = K[0,0:3]
Ka = K[0,3]
Acl = Adaum-Bdaum*K
ConfAutVal = np.linalg.eig(Acl)
Obs = ctrl.obsv(sysssd.A, sysssd.C) #----------OBSERVADOR
Poste = np.linalg.matrix_rank(Obs)
Pe = [0.33, 0.32, 0.31]
Ke = ctrl.place(sysssd.A.T, sysssd.C.T,Pe)
x1ci = 0 #----------IMPLEMENTAÇ~
AO
x2ci = 0
x3ci = 0
xaci = 0
xe1ci = 0
xe2ci = 0
xe3ci = 0
IC = [[x1ci], [x2ci], [x3ci]]
Ti = 0
u0 = 0
y0 = 0
nAmost = 100
dtT = 1000
r = np.concatenate((np.zeros(1), np.ones(nAmost-1)))
y = np.zeros(nAmost+1)
x1 = np.concatenate((x1ci*np.ones(1), np.zeros(nAmost)))
x2 = np.concatenate((x2ci*np.ones(1), np.zeros(nAmost)))
x3 = np.concatenate((x3ci*np.ones(1), np.zeros(nAmost)))
xa = np.concatenate((xaci*np.ones(1), np.zeros(nAmost)))
xe1 = np.concatenate((xe1ci*np.ones(1), np.zeros(nAmost)))
xe2 = np.concatenate((xe2ci*np.ones(1), np.zeros(nAmost)))
xe3 = np.concatenate((xe3ci*np.ones(1), np.zeros(nAmost)))
u = np.zeros(nAmost)
Amostras = np.zeros(nAmost)
cont = 0
xa1 = xaci
xe1 =[[xe1ci], [xe2ci], [xe3ci]]
while (Ti<=(nAmost-1)*T):
Amostras[cont] = cont
xe = xe1
xa = xa1+r[cont]-y[cont]
u1 = -Kp*xe+(-Ka)*xa
xe1 = sysssd.A*xe+sysssd.B*u1+Ke.T*(y[cont]-sysssd.C*xe) #estado observado
u[cont] = u1[0, 0]
Ue = u1[0, 0]*np.ones_like(dtT) #ZOH
Temp, yout, xout = Simul_Sist_Cont(sysss,Ti,T,dtT,Ue,IC)
cont = cont+1
y[cont] = yout
x1[cont] = xout[0]
x2[cont] = xout[1]
x3[cont] = xout[2]
IC = [[xout[0]], [xout[1]], [xout[2]]]
xa1 = xa
Ti = Ti + T
plt.figure(0) #----------GRÁFICOS
plt.subplot(2,1,1)
plt.step(Amostras[0:nAmost-1]*T, y[0:nAmost-1], r[0:nAmost-1],’--’,where = ’post’)
plt.xlim([0, 25])
plt.grid()
plt.subplot(2,1,2)
plt.step(Amostras[0:nAmost-1]*T, u[0:nAmost-1],where = ’post’)
plt.xlabel(’Tempo(s)’)
plt.xlim([0,25])
plt.grid()
plt.figure(1)
plt.step(Amostras[0:nAmost-1]*T,x1[0:nAmost-1],Amostras[0:nAmost-1]*T,
’continuaç~
ao da linha superior:’x2[0:nAmost-1],Amostras[0:nAmost-1]*T,x3[0:nAmost-1],where=’post’)
plt.xlim([0,25])
plt.grid()
Apêndice C. CÓDIGO EM PYTHON UTILIZADO PARA O CASO 3
import numpy as np
import matplotlib.pyplot as plt
import control as ctrl
plt.close(’all’)
def Simul_Sist_Cont(sys,Ti,T,dtT,Ue,IC): #----------SISTEMA CONTÍNUO
io_sys = ctrl.LinearIOSystem(sysss)
temp = np.linspace(Ti, Ti+T, dtT)
Temp, yout, xout = ctrl.input_output_response(io_sys, temp, Ue, IC, return_x=True)
return Temp, yout[yout.shape[0]-1], xout.T[xout.shape[1]-1]
A = [[0, 2], [2, 0]] #----------PROJETO DO CONTROLADOR
B = [[4], [0]]
C = [1.25, -3.125]
D = [0]
sysss = ctrl.ss(A,B,C,D)
T = 0.5
sysssd = ctrl.c2d(sysss,T,method=’zoh’)
Adaum1 = np.concatenate((sysssd.A, np.zeros((2,1))), axis=1)
Adaum2 = np.concatenate((-sysssd.C*sysssd.A, np.eye(1)), axis=1)
Adaum = np.concatenate((Adaum1, Adaum2), axis=0)
Bdaum = np.concatenate((sysssd.B, -sysssd.C*sysssd.B), axis=0)
Ctr=ctrl.ctrb(Adaum, Bdaum)
Post = np.linalg.matrix_rank(Ctr)
P = [0.8607+0.1583*1j, 0.8607-0.1583*1j, 0.01,] #----------CONTROLADOR
K = ctrl.place(Adaum,Bdaum,P)
Kp = K[0,0:2]
Ka = K[0,2]
Acl = Adaum-Bdaum*K
ConfAutVal = np.linalg.eig(Acl)
Obs = ctrl.obsv(sysssd.A, sysssd.C) #----------OBSERVADOR
Poste = np.linalg.matrix_rank(Obs)
Pe = [0.01, 0.02]
Ke = ctrl.place(sysssd.A.T, sysssd.C.T,Pe)
x1ci = 0 #----------IMPLEMENTAÇ~
AO
x2ci = 0
#x3ci = 0
xaci = 0
xe1ci = 0
xe2ci = 0
IC = [[x1ci], [x2ci]]
Ti = 0
u0 = 0
y0 = 0
nAmost = 100
dtT = 1000
r = np.concatenate((np.zeros(1), np.ones(nAmost-1)))
y = np.zeros(nAmost+1)
x1 = np.concatenate((x1ci*np.ones(1), np.zeros(nAmost)))
x2 = np.concatenate((x2ci*np.ones(1), np.zeros(nAmost)))
xa = np.concatenate((xaci*np.ones(1), np.zeros(nAmost)))
xe1 = np.concatenate((xe1ci*np.ones(1), np.zeros(nAmost)))
xe2 = np.concatenate((xe2ci*np.ones(1), np.zeros(nAmost)))
u = np.zeros(nAmost)
Amostras = np.zeros(nAmost)
cont = 0
xa1 = xaci
xe1 =[[xe1ci], [xe2ci]]
while (Ti<=(nAmost-1)*T):
Amostras[cont] = cont
xe = xe1
xa = xa1+r[cont]-y[cont]
u1 = -Kp*xe+(-Ka)*xa
xe1 = sysssd.A*xe+sysssd.B*u1+Ke.T*(y[cont]-sysssd.C*xe)
u[cont] = u1[0, 0]
Ue = u1[0, 0]*np.ones_like(dtT)
Temp, yout, xout = Simul_Sist_Cont(sysss,Ti,T,dtT,Ue,IC)
cont = cont+1
y[cont] = yout
x1[cont] = xout[0]
x2[cont] = xout[1]
IC = [[xout[0]], [xout[1]]]
xa1 = xa
Ti = Ti + T
plt.figure(0) #----------GRÁFICOS
plt.subplot(2,1,1)
plt.step(Amostras[0:nAmost-1]*T, y[0:nAmost-1], r[0:nAmost-1],’K’,where = ’post’)
plt.xlim([0, 25])
plt.grid()
plt.subplot(2,1,2)
plt.step(Amostras[0:nAmost-1]*T, u[0:nAmost-1],where = ’post’)
plt.xlabel(’Tempo(s)’)
plt.xlim([0,25])
plt.grid()
plt.figure(1)
plt.step(Amostras[0:nAmost-1]*T, x1[0:nAmost-1],Amostras[0:nAmost-1]*T,
’continuaç~
ao da linha superior:’x2[0:nAmost-1],Amostras[0:nAmost-1]*T,where = ’post’)
plt.xlim([0,25])
plt.grid()