Entendendo a Utilidade do Root Locus

Aula de 16/04/2026


Iniciando atividades e registrando dados

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:

Note 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).

Iniciando com o Root Locus e suas implicações

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).

Planta 1

Seja a planta/sistema:

G1(s)=1(s+1)(s+2)(s+8)

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:

g1_pzmap.png

Ou seja, apenas 3 pólos reais, 2 mais próximos do eixo jω e outro mais distante (em s=8, teoricamente menos dominante na resposta).

Ingressando os dados do sistema no Matlab:

Podemos comprovar os locais das raízes do denominador fazendo:

Mas também podemos fazer isto, usando a função pole() sobre a função transferência:

Por 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:

Para revisar rapidamente teoria sobre Root Locus, ir para [O que é o Root Locus?].

Com o comando rlocus() anterior, obtemos os seguintes traçados:

rlocus_G1.png

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 K=1,5 (a fim de obter uma resposta criticamente amortecida ou super-amortecida):

Para o valor de ganho escolhido, podemos confirmar onde ficaram localizados os pólos de MF:

Note 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:

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:

Hum... 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:

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 K=1,5:

RL_G1_K1.png

- 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:

Obtemos então:

step_K1.png

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: y()= 0, 0857. Isto ocorreu porque a própria função G1(s) já possui um ganho DC muito baixo, que não aumentou muito mesmo fechando a malha do sistema.

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:

Note que agora temos um par de pólos complexos, então uma resposta com overshoot (e oscilações) pode ser esperada -- resposta subamortecida.

Obtemos agora este RL:

RL_G1_K2.png

E observando a resposta temporal que seria obtida então para este valor de ganho:

step_K2.png

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 ts= tempo de assentamento, tp= tempo do instante de pico do overshoot e tr= tempo de subida. Existem outros parâmetros (de sistemas puros de 2a-ordem em MF) como: ζ= fator amortecimento, %OS= percentual do overshoot e ωn= frequência natural da oscilação. Material disponível em: [Resposta Temporal de Sistemas Lineares].

Vamos nos concentrar apenas na equação:

%OS=exp(ζπ1ζ2)×100%

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 %OS e então o que nos falta é saber o valor de ζ. Este valor pode ser encontrado "" invertendo" a eq. anterior e então obtemos:

ζ=ln(%OS/100)π2+ln2(%OS/100)

Agora devemos nos lembrar que no plano-s, sistemas com mesmo valor de %OS ou ζ, devem ter pólos de MF que cruzem com uma linha reta radial no plano-s, ou seja, uma linha reta que parte da origem do plano-s e segue para e cujo ângulo varia com o 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 ζ ou %OS desejado, para então descobrir que valor de ganho adotar.

E agora com ajuda do mouse e Data Tips do Matlab, podemos encontrar o correspondente valor aproximado do ganho:

RL_G1_45.png

Fechando a malha com este valor, teremos:

E então obtemos a seguinte resposta:

step_K3.png


Planta 2

Seja agora outra planta:

G2(s)=(s+3)(s+1)(s+5)(s+7)

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

g2_pzmap.png

O detalhe é que não estamos controlando o ganho DC da planta, isto é, como no caso de G1(s), o ganho DC final pode ser muito baixo. A fim de evitar um ganho DC muito baixo, vamos recalcular alguns fatores:

G2(s)=(1)(5)(7)(3)(s+3)(s+1)(s+5)(s+7)=353(s+3)(s+1)(s+5)(s+7)=11,6666666667(s+3)(s+1)(s+5)(s+7)

Ingressando no Matlab:

Verificando como ficaria o RL para este sistema/planta com alguns valores diferentes de ganho:

RL_G2.png

Vamos tentar primeiramente uma resposta criticamente amortecida, isto é, com pólos reais iguais no plano-s, o que pode ser obtido com K0,25:

Notamos que já obtivemos pólos com raízes complexas. Signica que devemos baixar o ganho:

Por fim, mantido este valor de ganho para evitar perder mais tempo testando outros valores. Verificando a resposta obtida:

step_K1b_G2.png

E se objetivo agora é aceitar uma resposta sub-amortecida, porém com overshoot 10%?

Buscando no RL o valor do ganho para %OS10%:

RL_G2b.png

step_K2b_G2.png


Trabalho Extra-classe

Traçar o RL, descobrir os ganhos e verificar as respostas encontradas, para resposta criticamente amortecida e sub-amortecida tolerando overshoot 20\% para os seguintes sistemas:

Obs.: Determine o valor de K de forma a obter plantas com ganho DC unitário.

Deadline: próxima aula.


Resultados esperados:

O objetivo desta aula era levantar a aprender a usar os Root Locus para os seguintes sistemas mostrados abaixo:

PlantaPólos/zeros no plano-sRoot Locus & Respostas
G1(s)=K(s+1)(s+2)(s+8)pzmap_G1.jpg?
G2(s)=K(s+3)(s+1)(s+5)(s+7)pzmap_G1.jpg?
G3(s)=K(s+7)(s+1)(s+3)pzmap_G1.jpg?
G4(2)=K(s+5)(s+1)(s+3)(s+7)pzmap_G1.jpg?

Encerrando seção de trabalho no Matlab

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:

👋


Material Extra

O que é o Root Locus?

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 K e realimentação negativa. O que é RL faz é justamente variar este valor de ganho e gerar traços no plano-s mostrando como varia a localização dos pólos de MF conforme o valor do ganho K é modificado:

malha_fechada_resumo

Resumo sobre Tipos de Respostas Temporais

resumo_respostas_temporais]

Ganho DC

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 Y(s)=R(s)FTMF(s), então y(t)=L1{Y(s)}, Mas podemos determinar y(t) para t, ou y(), calculando: limty(t)=limssY(s).

Exemplo1: calculando o ganho DC da planta G1(s) teremos: G1(s)=1(s+1)(s+2)(s+8) Então, quando se aplica uma entrada degrau unitário à este sistema temos: Y(s)=R(s)G1(s) onde R(s)= função transferência da entrada Degrau, que é: L{Degrau}=1/s. teremos como resposta: Y(s)=1s(s+1)(s+2)(s+8) Levando em conta o teorema do valor final da Transformada de Laplace: limty(t)=limssY(s)=lims0s1s(s+1)(s+2)(s+8) E assim, teremos: y()=lims01(s+1)(s+2)(s+8) que resulta: y()=1(1)(2)(8)=116=0,0625. Isto significa que o sistema vai tender ao valor de saída 0,0625 quando o mesmo for exposto a uma entrada degrau de valor unitário, ou: step_G1_MA.png Você pode obter este último gráfico, simplesmente fazendo: step(G1).

Poderíamos ter considerado um ganho DC para a planta G1(s) fazendo: G1(s)=1(s+1)(s+2)(s+8)(1)(2)(8)(1)=16(s+1)(s+2)(s+8) Teste com a função step() para comprovar este fato! E depois usando a funçao dcgain(G1).

 


🎵 Fernando Passold, em 16/04/2026.