Aula de 19/05/2025.
Terminando projeto da aula de 12/05/2025:
x>> diary aula_19052025.txt % inciando novo regsitro>> load dados % carregando dados antigos (das aulas passadas)>> zpk(BoG) % lembrando da tf da planta 0.00012224 (z+2.747) (z+0.1903) -------------------------------- (z-0.9048) (z-0.8187) (z-0.3679) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> polos_BoG % Os pólos de BoG(z) já haviam sido "isolados" na aula passadapolos_BoG = 0.90484 0.81873 0.36788>> zeros_BoG % Os zeros de BoG(z) já haviam sido "isolados" na aula passadazeros_BoG = -2.7471 -0.19031Montando eq. d controlador, lembrando que não posemor incluir pólos ou zeros fora do círculo unitário:
xxxxxxxxxx>> C_dead1=tf(poly(polos_BoG), poly([zeros_BoG(2) 1]), T); % montando C(z)>> zpk(C_dead1) (z-0.9048) (z-0.8187) (z-0.3679) -------------------------------- (z-1) (z+0.1903) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.Esta função transferência possui grau do numerador maior que o grau do denominador, implicando num sistema antecipativo ﹣ impraticável (seria exigido conhecer o valor de ).
Falta então acrescentar um pólo à eq. anterior. Arbitramos este pólo "extra" em porque queremos o ponto de partida do RL deste sistema tenha ponto de partida próxiumo da origem do plano-z. Queremos que acontece algo do tipo:

Lembrar que pólos de MF reais rendem respostas super-amortecidas (sem overshoot) e que se queremos uma resposta a mais rápida possível, então eles devem estar localizados próximos da origem do plano-z (ver [gráficos aqui]).
xxxxxxxxxx>> C_dead2=tf(poly(polos_BoG), poly([zeros_BoG(2) 1 -0.5]), T); % montando C(z)>> zpk(C_dead2) (z-0.9048) (z-0.8187) (z-0.3679) -------------------------------- (z-1) (z+0.5) (z+0.1903) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> C_dead2=tf(poly(polos_BoG), poly([zeros_BoG(2) 1 -0.5]), T);>> ftma_dead2=C_dead2*BoG;>> zpk(ftma_dead2) 0.00012224 (z+2.747) (z-0.9048) (z-0.8187) (z-0.3679) (z+0.1903) ---------------------------------------------------------------- (z-1) (z-0.9048) (z-0.8187) (z-0.3679) (z+0.5) (z+0.1903) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> zpk(minreal(ftma_dead2)) % com termos comuns simplificados 0.00012224 (z+2.747) -------------------- (z-1) (z+0.5) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> figure; rlocus(ftma_dead2)Notamos um RL próximo do desejado:

Modificando uma terceita vez a eq. do controlador, deslocando o pólo "extra" ainda mais a esquerda, mas desta vez com o auxílio do App Control System Designer:

Resultado obtido (depois de exportar controlador C como Cdead3):
xxxxxxxxxx>> zpk(Cdead3) 2188 (z-0.9048) (z-0.8187) (z-0.3679) ------------------------------------- (z-1) (z+0.735) (z+0.1903) Name: CSample time: 0.1 secondsDiscrete-time zero/pole/gain model.Projeto salvo como: ControlSystemDesigner_Cdead3.mat.
Fechando a mallha, levantando o RL, verificando a resposta ao defrau e estas coisas...😑
xxxxxxxxxx>> ftma_dead3=Cdead3*BoG;>> ftmf_dead3=feedback(Cdead3*BoG,1);>> pole(ftmf_dead3) % pólos finais em MF:ans = -0.19031 0.90484 0.81873 -0.017698 0.015242 0.36788>> % Algo "sobrecarregado", dicícil perceber os pólos de MF que interessam...>> zpk(ftma_dead3) % função complenta 0.26746 (z-0.9048) (z-0.8187) (z-0.3679) (z+0.1903) (z+2.747) ------------------------------------------------------------- (z-1) (z-0.9048) (z-0.8187) (z-0.3679) (z+0.735) (z+0.1903) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> minreal(ftma_dead3) % função com simplificações 0.26746 (z+2.747) ----------------- (z-1) (z+0.735) Sample time: 0.1 secondsDiscrete-time zero/pole/gain model.>> ftma_dead3r=minreal(ftma_dead3); % criando uma variável "r"eduzida (com as simplificações)>> ftmf_dead3r=feedback(ftma_dead3r,1);>> pole(ftmf_dead3r) % mostrando os pólos de MF que realmente interessamans = -0.017698 0.015242>> % Notamos 2 pólos reais quase concentrados na origem do plano-z>> % Poderiamos ter aumentado um pouco mais o ganho (sutilmente)>> figure; step(ftmf_dead3r) % observando resposta ao degrau em MF>> grid
Nota-se um quase imperceptível overshoot.
Mas com certeza com expressivas amplitudes para ação de controle:
xxxxxxxxxx>> % Deduzindo tf auxiliar para mostrar gráfico de u[kT]:>> % aux(z) = C(z)/(1+C(z)*BoG(z))>> % u[kT]=step(aux(z))>> aux=Cdead3/(1+ftma_dead3);>> figure; step(aux)
Note ações de controle iniciais entre e convergindo depois de 0,7 segundos para .
Ou seja, este tipo de controlador "cobra seu preço" para fazer o sistema convergir tão rápido ao valor desejado de regime permanente: gera sinais de controle iniciais mais de 140 vezes maior que o valor à ser adotado em regime permanente. Algo provavelmente improvável de ser realizado na prática.
Terminando esta seção de trabalho...
xxxxxxxxxx>> save dados>> diary off>> quit()
Fernando Passold, em 19/05/2025