Aula de 16/04/2026
Entendendo a Utilidade do Root LocusIniciando atividades e registrando dadosIniciando com o Root Locus e suas implicaçõesPlanta 1Planta 2Trabalho Extra-classeResultados esperados:Encerrando seção de trabalho no MatlabMaterial ExtraO que é o Root Locus?Resumo sobre Tipos de Respostas TemporaisGanho DC
Antes de inciar com comandos associados com esta aula, vamos estabelecer uma rotina de registro das atividades realizadas no usando o comando diary e salvando os dados usando o comando save (ao final da seção de trabalho ou final da aula).
A função diary indica ao Matlab que seja criado um "dump file", um arquivo texto, contendo a cópia dos comandos usados e respostas obtidas a partir do instante em que foi emitido. Obviamente devemos indicar o nome do arquivo. Então:
>> diary aula_16042026.txtNote que o Matlab cria um arquivo texto, mas eventualmente usando codificação diferente de UTF-8 que é mais atual e normalmente usada com editores texto compatíveis com notação Markdown e criação de páginas HTML. Então, antes de renomear o arquivo .txt criado no Matlab, recomenda-se mudar sua codificação de caracteres para UTF-8 e então renomear o arquivo para .md e editar o mesmo (depois da aula).
Suponha que queremos analisar alguns sistemas e testar suas respostas para diferentes valores de ganho, especialmente verificar e testar valores de ganho que levem o mesmo para: a) uma resposta rápida mas criticamente amortecido e b) uma resposta rápida mas com algum overshoot aceitável (resposta subamortecida).
Seja a planta/sistema:
Este é um sistema de 3a-ordem (3 pólos, ou denominador da função transferência com 3 raízes). Ou seja, no plano-s rende algo como:

Ou seja, apenas 3 pólos reais, 2 mais próximos do eixo
Ingressando os dados do sistema no Matlab:
>> den=poly([- 8 -2 -1]) % criando um polinômio com dados das suas raízesden = 1 11 26 16>> G1=tf(1,poly([-1 -2 -8]))
G1 = 1 ------------------------ s^3 + 11 s^2 + 26 s + 16 Continuous-time transfer function.Podemos comprovar os locais das raízes do denominador fazendo:
>> roots(den) % raizes do polinômioans = -8 -2 -1Mas também podemos fazer isto, usando a função pole() sobre a função transferência:
>> pole(G1)ans = -8 -2 -1Por curiosidade o gráfico anterior mostrando a distribuição de pólos e zeros de um sistema pode ser feita no Matlab usando o comando:
pzmap(). Neste caso, depois de ingressar a transfer function, bastaria fazer:>> pzmap(G1).
Por fim, para levantar o gráfico do Root Locus para esta planta:
>> rlocus(G1)Para revisar rapidamente teoria sobre Root Locus, ir para [O que é o Root Locus?].
Com o comando rlocus() anterior, obtemos os seguintes traçados:

O que o RL nos motra é como evoluem ("caminham") os pólos de malha-fechada a medida que o ganho aumenta.
Testando a resposta do sistema para
>> K1=1.5;ftmf1=feedback(K1*G1,1) % fechando a malha
ftmf1 = 1.5 -------------------------- s^3 + 11 s^2 + 26 s + 17.5 Continuous-time transfer function.Para o valor de ganho escolhido, podemos confirmar onde ficaram localizados os pólos de MF:
>> pole(ftmf1)ans = -8.0353 -1.6218 -1.3429Note que só temos pólos reais, portanto teremos um tipo de resposta do tipo super-amortecida (caso de pólos reais não repetidos) tendendo à uma resposta criticamente amortecida (neste caso, teríamos um par de pólos reais iguais).
Podemos mostrar (sobrepor) no gráfico do RL anterior, os pólos de MF referentes a este valor de ganho, para ajudar a correlacionar a posição dos pólos de MF x resposta temporal obtida:
>> hold on % para indicar sobreposição de gráficos>> plot(real(pole(ftmf1), imag(ftmf1), '+r'))Undefined function 'imag' for input arguments of type'tf'.} Ops... cometemos algum erro de sintaxe ou de chamada de alguma função. Isto pode ser "consertado" usando comando help <função> para tentar descobrir o problema:
xxxxxxxxxx>> help real real Complex real part. real(X) is the real part of X. See I or J to enter complex numbers. See also help isreal, help imag, help conj, help angle, help abs.
Other functions named realHum... observando o comando anterior, notamos que usamos a função imag (sintaxe correta) mas sobre uma transfer funcion e não sobre uma variável numérica. Este foi o motivo do erro anterior... Ok, consertando o problema:
xxxxxxxxxx>> plot(real(pole(ftmf1)), imag(pole(ftmf1)), '+r') % plota marcadores "+" vermelhos (red)Agora sim, podemos observar o RL anterior com as marcas "+" em vermelho ressaltando onde ficam localizados os pólos de MF deste sistema, para o valor de ganho

- Mas como seria a resposta temporal em malha fechada, deste sistema, com este valor de ganho?
Simples, vamos criar outra janela gráfica, e traçar esta resposta usando a função step() do Matlab:
xxxxxxxxxx>> figure; step(ftmf1)Obtemos então:

Note a resposta quase criticamente amortecida como esperada na teoria vista em [Resposta Temporal de Sistemas Lineares].
Para lembrar de tipos de respostas temporais, ir para: [Resumo sobre Tipos de Respostas Temporais].
Repare também que apesar termos apresentado uma entrada degrau unitário ao sistema de malha-fechada (step(1*ftmf1)), o valor final, de regime permanente atingido pelo sistema, foi bem baixo:
Mais sobre ganho DC ver [Ganho DC].
Bom, vamos ver se entendemos o que ocorre quando variamos o ganho no sistema em malha-fechada. Vamos aumentar o valor do ganho e verificar o que ocorre:
xxxxxxxxxx>> K2=5; % aumentando o ganho para K = 5>> ftmf2=feedback(K2*G1,1); % calculando novamente a nova MF com este valor de ganho>> pole(ftmf2) % mostrando onde ficaram localizados estes pólos de MFans = -8.1149 + 0i -1.4425 + 0.71197i -1.4425 - 0.71197iNote que agora temos um par de pólos complexos, então uma resposta com overshoot (e oscilações) pode ser esperada -- resposta subamortecida.
xxxxxxxxxx>> figure; rlocus(G1)>> hold on;>> plot(real(pole(ftmf2)), imag(pole(ftmf2)), '+r')>> % axis([xmin xman ymin ymax])>> axis([-9 1 -6 6]) % apenas para restringir a região desejada para o gráficoObtemos agora este RL:

E observando a resposta temporal que seria obtida então para este valor de ganho:
xxxxxxxxxx>> figure; step(ftmf2)
Apesar dos pólos de MF complexos, a resposta não apresentou um overshoot visível.
Mas vamos supor que nosso "cliente", para o qual estamos projetando um sistema de controle automático (em malha fechada) usando apenas controle proporcional, admite um certo valor de overshoot. Como podemos descobrir de forma mais rápida o valor de ganho que deveríamos adotar?
Vamos lembrar das equações prevendo parâmetros temporais como
Vamos nos concentrar apenas na equação:
Esta eq. nos mostra que o overshoot depende apenas do parâmetro
Mas no nosso caso, queremos o inverso, eventualmente nos é dado o valor tolerável máximo para o
Agora devemos nos lembrar que no plano-s, sistemas com mesmo valor de
Ocorre que o Matlab traz uma função que traça (ou sobrepõe) esta linha no plano-s, a função: sgrid(). Então podemos traçar um RL e em seguida sobrepor uma linha guia para o
xxxxxxxxxx>> OS=25; % supondo que seja tolerável um %OS de 25%>> zeta=(-log(OS/100))/(sqrt(pi^2+(log(OS/100)^2)))zeta = 0.40371>> figure; rlocus(G1)>> hold on;>> sgrid(zeta,0) % sobrepondo a linha guia para %OS = 25%>> axis([-9 1 -6 6]) % restringido a região mostrada do gráfico do RLE agora com ajuda do mouse e Data Tips do Matlab, podemos encontrar o correspondente valor aproximado do ganho:

Fechando a malha com este valor, teremos:
xxxxxxxxxx>> K3=45.2; % fixando o ganho neste valor>> ftmf3=feedback(K3*G1,1); % fechando a malha>> pole(ftmf3) % apenas conferindo os pólos de MFans = -8.8423 + 0i -1.0788 + 2.3995i -1.0788 - 2.3995i>> plot(real(pole(ftmf3)), imag(pole(ftmf3)), 'sm') % sobrepondo os mesmos no RL>> figure; step(ftmf3) % resposta temporal para entrada degrau unitárioE então obtemos a seguinte resposta:

Seja agora outra planta:
Esta planta possui a seguinte distribuição de pólos-zeros no plano-s:

O detalhe é que não estamos controlando o ganho DC da planta, isto é, como no caso de
Ingressando no Matlab:
xxxxxxxxxx>> G2=tf(1*5*7*[1 3],3*poly([-1 -5 -7]))
G2 =
35 s + 105---------------------------- 3 s^3 + 39 s^2 + 141 s + 105
Continuous-time transfer function.
>> zpk(G2)ans =
11.667 (s+3)----------------- (s+7) (s+5) (s+1)
Continuous-time zero/pole/gain model.Verificando como ficaria o RL para este sistema/planta com alguns valores diferentes de ganho:
xxxxxxxxxx>> close all % limpar janelas gráficas>> rlocus(G2)
Vamos tentar primeiramente uma resposta criticamente amortecida, isto é, com pólos reais iguais no plano-s, o que pode ser obtido com
xxxxxxxxxx>> K1b=0.25;>> ftmfG2K1b=feedback(K1b*G2,1) % fechando a malhaftmfG2K1b =
8.75 s + 26.25-------------------------------- 3 s^3 + 39 s^2 + 149.8 s + 131.2
Continuous-time transfer function.
>> pole(ftmfG2K1b) % listando os pólos de MFans = -5.8814 + 0.87936i -5.8814 - 0.87936i -1.2371 + 0iNotamos que já obtivemos pólos com raízes complexas. Signica que devemos baixar o ganho:
xxxxxxxxxx>> K1b=0.2; % testando outro valor de ganho para aproximar + os 2 pólos reais dominantes>> ftmfG2K1b=feedback(K1b*G2,1); % recalculando a nova FTMF(s)>> pole(ftmfG2K1b)ans = -5.9046 + 0.63778i -5.9046 - 0.63778i -1.1908 + 0i>> K1b=0.16; % ainda pólos complexos, testando outro valor>> ftmfG2K1b=feedback(K1b*G2,1);>> pole(ftmfG2K1b)ans = -5.9234 + 0.3434i -5.9234 - 0.3434i -1.1533 + 0i>> K1b=0.15;>> ftmfG2K1b=feedback(K1b*G2,1);>> pole(ftmfG2K1b)ans = -5.9281 + 0.21519i -5.9281 - 0.21519i -1.1438 + 0iPor fim, mantido este valor de ganho para evitar perder mais tempo testando outros valores. Verificando a resposta obtida:
xxxxxxxxxx>> figure; step(ftmfG2K1b)
E se objetivo agora é aceitar uma resposta sub-amortecida, porém com overshoot
xxxxxxxxxx>> OS=10; % novo valor para OS>> zeta=(-log(OS/100))/(sqrt(pi^2+(log(OS/100)^2))) % recalculando fator amortecimentozeta = 0.59116>> figure(1) % fasendo foco na janela da figura contendo ultimo RL>> hold on>> sgrid(zeta,0)Buscando no RL o valor do ganho para

xxxxxxxxxx>> K2b=4.6; % ganho para OS aprox 10%>> ftmfG2K2b=feedback(K2b*G2,1);>> pole(ftmfG2K2b)ans = -5.1568 + 6.8094i -5.1568 - 6.8094i -2.6864 + 0i>> % verificando a resposta obtida: >> figure; step(ftmfG2K2b)
Traçar o RL, descobrir os ganhos e verificar as respostas encontradas, para resposta criticamente amortecida e sub-amortecida tolerando overshoot
Obs.: Determine o valor de
Deadline: próxima aula.
O objetivo desta aula era levantar a aprender a usar os Root Locus para os seguintes sistemas mostrados abaixo:
| Planta | Pólos/zeros no plano-s | Root Locus & Respostas |
|---|---|---|
![]() | ? | |
![]() | ? | |
![]() | ? | |
![]() | ? |
Vamos terminar a aula lembrando de fechar o arquivo "diary" criado e salvando dados para o caso de querer continuar na próxima aula usando estes dados:
xxxxxxxxxx>> save aula_16042026 % cria arquivo .mat (binário do Matlab, com dados)>> diary off % fecha o arquivo diary criado>> quit % encerra atividades com o Matlab👋
Lembre-se: O RL é o resultado do que ocorre quando tomamos a função transferência repassada para o mesmo e o introduzimos dentro de uma malha fechada tradicional, com simples ganho (ou controlador) proporcional

]
Como se determina o ganho DC de um sistema?
Resposta: usando o Teorema do Valor Final associado com a Transformada de Laplace que estabelece que:
Se
Exemplo
Você pode obter este último gráfico, simplesmente fazendo: step(G1).
Poderíamos ter considerado um ganho DC para a planta step() para comprovar este fato! E depois usando a funçao dcgain(G1).
🎵 Fernando Passold, em 16/04/2026.