Sistemas de Controle Linear: Análise de Estabilidade do Sistema
- #C
- #Arquitetura de Sistemas
Fala galera! Por esses dias comecei a estudar umas aplicações e decidi fazer uma postagem um pouco diferente hoje: Sobre o "Critério de estabilidade de Routh-Hurwitz". É um algoritmo matemático eficiente feito por John Routh e Adolf Hurwitz para testar se um sistema de controle linear e invariante no tempo é instável, estável ou marginalmente estável.
Sobre o Algoritmo de Routh-Hurwitz
O algoritmo serve pra testar se as raízes de um polinômio apresentam partes negativas, e se sim, logo o sistema com tal polinômio possui instabilidade. Esta aplicação é muito visto na área da engenharia elétrica/eletrônica. Se temos um sistema linear que é invariante no tempo, logo ele seguindo esta linha de tempo, ele não pode apresentar variações oscilatórias exponenciais na amplitude do sinal, Quando o sistema recebe uma Entrada de dados que seria H(s), esta entrada pode ser passado para um controlador, onde tal controlador seria um numerador de um denominador, o denominador é o polinômio, se os cálculos deste polinômio se mostrar instável, isto significa que a saída dos dados, que vamos chamar de S(s), terão dados exponenciais e a amplitude do sinal subiu e variou de forma desequilibrada (não de forma linear), prejudicando assim o curso do sistema e a vida de outras pessoas que utilizam tal sistema.
Se nós temos um sistema que nunca será estável, logo estamos falando de um Problema NP, ou seja, NÃO-polinomial, onde ele não pode ser resolvido com nenhum sequer polinômio, sendo assim um sistema por natureza lento, com oscilações exponenciais, inseguro e ainda que exige um grande poder de processamento. Mas e se há uma forma de alterar os coeficientes do sistema, no qual uma entrada específica pode torná-lo um sistema estável? Ou até melhor: Se com os coeficientes certos, toda entrada possa considerar o sistema estável? Pois é, uma forma de testar isso, é usando o critério de estabilidade de Routh-Hurwitz.

Aplicação em C para Análise de Estabilidade
Eu fiz uma função em C chamada RouthHurwitz() que recebe 3 argumentos: A entrada do controlador Kc, O coeficiente x e o coeficiente y. Kc será um numerador do denominador s(sx)(sy), este denominador é uma simplificação/redução (Uma equação característica) do denominador real que será formado na própria função, o algoritmo da função é capaz de decodificar o s(sx)(sy) com as entradas necessárias, e formar os coeficientes organizados para depois preencher uma Tabela, chamada de Tabela de Routh-Hurwitz. Ao mesmo tempo que esta Tabela é formada no algoritmo através de uma Matriz, cálculos são feitos pra determinar os valores da Sub-matriz, estes valores serão as raízes, se estas raízes apresentar mudanças de sinais (de positivo para negativo) o sistema do denominador real gerado, será considerado "instável".. se as últimas raízes forem 0 e não houver mudanças de sinais no polinômio par acima deles, é um sistema "marginalmente estável", agora se não houver nenhuma mudança de sinal nas raízes e for diferente de 0, logo o sistema é "estável".


Testando os coeficientes usando critério de Routh-Hurwitz
Nas imagens abaixo eu faço um testes com algumas entradas, determinando também os coeficientes, exemplo da 1ª imagem: Para formar o denominador "1s^3 + 5s^2 + 1s^1 + 7", os coeficientes x e y devem ser x = -1 e y = 6, que seria o denominador simplificado "s(s-1)(s+6)", com a entrada do controlador "Kc" como um numerador (Enviado por uma função de transferência E(s)), na Tabela de Hurwitz gerada na 1ª imagem, as linhas de s2 a s0 apresenta 2 mudanças de sinal (de positivo para negativo), sendo s1 com uma raiz negativa -0.40, o algoritmo diz que é instável (Porque houve a mudança de sinal), mas ele também diz que para o sistema ser considerado estável usando o mesmo denominador simplificado (com uma entrada diferente o denominador real é alterado), a entrada do controlador Kc deve ser maior ou igual a 7,5.

Então eu testo na 2ª imagem com a entrada IGUAL a 7.5, o denominador real muda e o sistema é apresentado como "marginalmente estável", pois as raízes da sub-matriz é igual a 0 e não houve nenhuma mudança de sinal acima:

Porém agora, eu testo na 3ª imagem uma entrada MAIOR que 7.5, ou seja, 7,6... e o sistema é "apenas" estável, pois não houve uma mudança de sinal:

Logo no sistema da 1ª imagem a amplitude do sinal oscilaria subindo exponencialmente, no sistema da 2ª imagem a amplitude oscilaria de forma permanente (sem subir ou descer) e no sistema da 3ª imagem a amplitude decairia até chegar num patamar equilibrado, isto é, linear e invariante no tempo. Então o algoritmo preveu qual é a entrada necessária do controlador para o sistema ser estável, e nas outras imagens outros coeficientes são testados com entradas diferentes, gerando denominadores distintos entre eles.
Testando agora com coeficientes diferentes, como x = -2 e y = 7:

A imagem anterior foi "instável", então adaptar corretamente a entrada do controlador sem alterar os coeficientes:

Analisando um controlador acima do exigido para estabilidade com os coeficientes x = 3 e y = 0:

Sem alterar os coeficientes, mas adaptar o controlador para igual ao exigido, tornando-o marginalmente estável:

No início eu pensei em fazer este algoritmo em Assembly na Arquitetura RISC para PIC16F ou PIC12F, pois aí poderíamos ver o comportamento das oscilações dos sinais analógicos, utilizando ondas senoidais (Eu ainda farei isso), porém como a arquitetura RISC não nos prover bons recursos de cálculos e números reais, eu teria uma grande dor de cabeça pra projetar um algoritmo que seria ainda mais simples do que este feito em C, então pra começar, em Assembly o algoritmo deve ser mais simples, não formando a tabela mas fazendo cálculos diretos com números inteiros (Já que com 8 bits se torna inviável representar valores reais), sem muitos rodeios, apenas enviando o sinal pra o osciloscópio. Mas eu vou deixar isto pra outra hora. O intuito desta postagem é compreender como o algoritmo matemático é eficiente pra determinar a estabilidade de um sistema e que pode ser utilizado em diversos firmwares de um sistema de controle linear, fazendo as alterações necessárias e garantindo assim a segurança de todos que utilizam o sistema.
Links Úteis
Abaixo eu posto o link do GitHub do algoritmo que fiz em C pra vocês estudarem e alguns links de referência:
Repositório do algoritmo de Routh-Hurwitz:
https://github.com/FrancisBFTC/RouthHurwitz_C_Algoritm
Links de referência 1:
https://eletricacomscilab.blogspot.com/2018/04/criterio-de-estabilidade-de-routh.html
Link de referência 2:
Outros artigos:
Projeto de Botões com LEDs - Eng. com Assembly & Circuitos:
Circuito de uma ULA - Somador Completo de 1 bit [FullAdder]
Circuito Simulatório de uma Unidade Lógico-Aritmética de 4 & 8 bits para soma & subtração
Reator Industrial via Equações Booleanas em Assembly
Portas lógicas com transístores N e P - ULA na vida real - Verilog & Scheme
#cprogramming #assembly #matematica #algoritmos #engineering




OF
Muito bom essa sua explanação nesse código.
Obrigado Addson! Este é um conteúdo bem denso mesmo na engenharia mas que se torna útil para certas aplicações que dependem deste algoritmo.
Muito bom! Parabéns
parece bem complexo, porém, gostei bastante do que eu li neste seu artigo. grato!