# !pip install slycot # biblioteca opcional
!pip install control --quiet
import os
import numpy as np
import matplotlib.pyplot as plt
from math import pi
import control as ct
from control.matlab import *
# Insira a definição das funções implementadas em práticas anteriores que serão utilizadas nesta prática:
# Implementar função que recebe a função de transferência contínua e retorna o tempo de subida da resposta ao degrau unitário
def tempo_subida(Gs):
A=1 # Amplitude do degrau
y, t = step(Gs)
u = A*np.ones(np.shape(y))
c_final = y[-1]
t_01 = 0
t_09 = 0
Tr = 0
for i in range(len(u)):
if (y[i] > (0.1*c_final)):
t_01 = t[i]
break
for i in range(len(u)):
if (y[i] > (0.9*c_final)):
t_09 = t[i-1]
break
Tr = t_09-t_01
return Tr
# Implementar função que recebe a função de transferência contínua e retorna o valor final da resposta ao degrau unitário
def valor_final(Gs):
y, t = step(Gs)
c_final = y[-1]
# Implemente seu codigo
return c_final
# Implementar função que recebe a função de transferência contínua e retorna o valor máximo da resposta ao degrau unitário
def valor_maximo(Gs):
y, t = step(Gs)
c_max = np.max(y)
# Implemente seu codigo
return c_max
# Implementar função que recebe a função de transferência contínua e retorna o tempo de subida da resposta ao degrau unitário
def tempo_subida(Gs):
A=1 # Amplitude do degrau
y, t = step(Gs)
u = A*np.ones(np.shape(y))
c_final = y[-1]
t_01 = 0
t_09 = 0
Tr = 0
for i in range(len(u)):
if (y[i] > (0.1*c_final)):
t_01 = t[i]
break
for i in range(len(u)):
if (y[i] > (0.9*c_final)):
t_09 = t[i-1]
break
Tr = t_09-t_01
return Tr, t_09, t_01
def tempo_pico_sobressinal(Gs):
A=1 # Amplitude do degrau
y, t = step(Gs)
u = A*np.ones(np.shape(y))
c_max = np.max(y)
Tp = 0
Mp = 0
# Implemente seu codigo
for i in range(len(u)):
if (y[i] == c_max):
Tp = t[i]
break
Mp = (c_max-y[-1])/y[-1]
return Tp, Mp, y, t
# Implementar função que recebe a função de transferência contínua e retorna o tempo de acomodação da resposta ao degrau unitário
def tempo_acomodacao(Gs):
y, t = step(Gs)
c_final = y[-1]
Ts = 0
for i in range(len(y) - 2,0,-1):
if (y[i] < (0.98*c_final) or y[i] > (1.02*c_final)):
Ts = t[i+1]
break
return Ts
def resposta_degrau(Gs):
# Resposta ao degrau unitário (continuo):
y, t = step(Gs)
plt.step(t, y, color = 'blue', label = 'Saída', where = 'post')
y_max = np.max(y)
plt.ylabel('y(t)')
plt.xlabel('t[s]')
plt.title("Resposta do sistema para uma entrada degrau")
plt.legend()
plt.grid(True)
print('y_max: ')
print(y_max)
# print(y_max[-2])
plt.axis([0,10,0,y_max + 0.05])
plt.show(block=False)
def ft_saida_referencia(ft_planta,ft_controlador):
# Insira o seu código aqui
ft_r2y = feedback(ft_planta * ft_controlador, sign = -1)
return ft_r2y
def ft_saida_referencia_z(ft_planta_z,ft_controlador_z):
ft_r2y_z = feedback(ft_planta_z * ft_controlador_z, sign = -1)
# ft_r2y_z = (ft_controlador_z*ft_planta_z)/(1+(ft_controlador_z*ft_planta_z))
return ft_r2y_z
def ft_controle_referencia(ft_planta,ft_controlador):
#(C_s)/(1+C_sG_p)
ft_r2u = ft_controlador/(1+(ft_controlador*ft_planta))
return ft_r2u
def ft_controle_referencia_z(ft_planta_z,ft_controlador_z):
ft_r2u_z = ft_controlador_z/(1+(ft_controlador_z*ft_planta_z))
return ft_r2u_z
s = tf('s')
z = tf('z')
#Parâmetros do sistema
K = 4
zeta = 0.8
wn = 46
# K = 5
# zeta = 0.4
# wn = 93
#Função de transferência
Gp = (K*wn*wn)/(s*s + 2*zeta*wn*s + wn*wn) # utilizando a definição da variável s que foi feita
# Insira código para fazer a discretização da planta e mostrar a função de transferência discreta:
wb = 87.02550434274998
T0 = (2*pi)/(35*wb)
#T0 = 0.0011075803576209345
H0Gp = Gp.sample(T0,'zoh')
print('T0', T0)
print('H0Gp', H0Gp)
# Valores do exemplo 1 e 2
# a1 = -1.7063
# a2 = 0.9580
# a3 = -1.1767
# b1 = 0.0186
# b2 = 0.0486
# b3 = 0.0078
b = H0Gp.num[0][0].tolist()
b.insert(0,0)
a = H0Gp.den[0][0].tolist()
bSum = b[1] + b[2]
q0 = 1/((1 - a[1])*(bSum))
q1 = q0 * (a[1] - 1) + 1/bSum
q2 = q0 * (a[2] - a[1]) + a[1]/bSum
q3 = a[2]*((1/bSum)-q0)
p1 = q0*b[1]
p2 = q0*(b[2] - b[1]) + b[1]/bSum
p3 = b[2]*((1/bSum)-q0)
alphaInv = 1 - 1/(q0 * bSum)
print('q0:',q0)
print('q1:',q1)
print('q2:',q2)
print('q3:',q3)
print('\np1:',p1)
print('p2:',p2)
print('p3:',p3)
print('\nalphaInv:',alphaInv)
print('bSum',bSum)
z = tf('z')
z1 = 1/z
z2 = 1/(z*z)
Gdb = (q0*z*z + q1*z + q2)/(z*z - p1*z - p2)
Gdb = (q0*z*z*z + q1*z*z + q2*z + q3)/(z*z*z - p1*z*z - p2*z - p3)
print('Gdb:',Gdb)
#Gmf = ft_saida_referencia(H0Gp,Gdb)
bigB = b[1]*z + b[2]
Gmf = q0*bigB*(1/z)*(1-(alphaInv/z))
print('Gmf:',Gmf)
print(Gmf.pole())
resposta_degrau(Gmf)
y, t = step(Gmf)
y = 1-y
plt.step(t, y, color = 'blue', label = 'Erro', where = 'post')
pct_erro = y[-1]*100
print("Erro final:",pct_erro)
y_max = np.max(y)
plt.ylabel('y(t)')
plt.xlabel('t[s]')
plt.title("Resposta do sistema para uma entrada degrau")
plt.legend()
plt.grid(True)
plt.axis([0,10,-0.1,y_max + 0.1])
plt.show(block=False)
U_s = (q0 + (q1/z) + (q2/(z*z)) + (q3/(z*z*z)))
y_U, t_U = step(U_s)
y_u_max = np.max(y_U)
y_u_min = np.min(y_U)
plt.step(t_U, y_U, color = 'blue', label = 'Controle', where='post')
plt.title("Sinal de Controle para uma entrada degrau")
plt.legend(['$Controle$'])
plt.grid(True)
plt.axis([0,10,y_u_min - 0.5,y_u_max + 0.5])
plt.show(block=False)
cmax = valor_maximo(Gmf)
cfinal = valor_final(Gmf)
Tr, t_09, t_01 = tempo_subida(Gmf)
Tp, Mp, y, t = tempo_pico_sobressinal(Gmf)
Ts = tempo_acomodacao(Gmf)
sMp = "{:.4f}".format(Mp)
sTs = "{:.4f}".format(Ts)
sTr = "{:.4f}".format(Tr)
print( "\n|Mp:", str(sMp) + "|Ts:", str(sTs) + "|Tr:", str(sTr) + "|")
y_U, t_U = step(U_s)
print("Dead-Beat u(0) ->", y_U[0])
# Vals0 = [8.896,]
# Vals1 = [-15.897,]
# Vals2 = [7.088,]
C = (8.896*z**2 - 15.897*z + 7.088)/(z**2 - z)
U_PID = ft_controle_referencia(H0Gp, C)
y_U, t_U = step(U_PID)
print("PID u(0) ->", y_U[0])
y_U, t_U = step(U_s)
print("u(0) ->", y_U[0])
print("u(1) ->", y_U[1])
print("u(2) ->", y_U[2])
tmp_q0 = 0
#tmpT0 = 0.00206283872252085
tmpT0 = 0.0022228387225208504
while(abs(tmp_q0-8.896) > 0.0001):
tmpT0 += 0.0000001
tmpH0Gp = Gp.sample(tmpT0,'zoh')
tmp_b = tmpH0Gp.num[0][0].tolist()
tmp_b.insert(0,0)
tmp_a = tmpH0Gp.den[0][0].tolist()
tmp_bSum = tmp_b[1] + tmp_b[2]
tmp_q0 = 1/((1 - tmp_a[1])*(tmp_bSum))
print(tmpT0,tmp_q0)
tmp_q0 = 1/((1 - tmp_a[1])*(tmp_bSum))
tmp_q1 = tmp_q0 * (tmp_a[1] - 1) + 1/tmp_bSum
tmp_q2 = tmp_q0 * (tmp_a[2] - tmp_a[1]) + tmp_a[1]/tmp_bSum
tmp_q3 = tmp_a[2]*((1/tmp_bSum)-tmp_q0)
tmp_U = (tmp_q0 + (tmp_q1/z) + (tmp_q2/(z*z)) + (tmp_q3/(z*z*z)))
y,t = step(tmp_U)
print("u(0) ->", y[0])
print("u(1) ->", y[1])
print("u(2) ->", y[2])