Forma Canonica E Fatorada
O que acontece quando você tenta colocar um sistema na sua forma canônica e fatorada na prática
Você pega uma função de transferência qualquer, quer transformar em espaço de estados, e aí começa a dúvida: qual forma canônica usar? A canônica controle? A observabilidade? A forma fatorada? A resposta não é tão óbvia assim quando você vai montar o código de verdade. A forma canônica controle é aquela onde a matriz A fica naquela estrutura de companion com os coeficientes do denominador empilhados na última linha. Ela é fácil de construir de cabeça, mas tem um problema numérico séria que pouca gente menciona. Para sistemas de ordem maior que 4, 5, os autovalores da matriz companheira são sensíveis demais — pequenas variações nos coeficientes geram erros gigantes nos polos. Já vi gente perder horas debugando porque o simulador simplesmente não convergia, quando o problema era a representação escolhida. Eu me lembre de uma ocasião específica há uns anos. Tinha um sistema de ordem 6 para um projeto de controle ativo de vibração. O denominador tinha coeficientes muito diferentes em magnitude, tipo 1e-8 e 2000. Montei tudo na forma canônica controle, rodei a simulação, e a resposta transiente simplesmente explodiu. Números de condição da matriz de transformação passavam de 1e12. A solução? Reduzir para subsequências de segunda ordem (formas canônicas em cascata), cada bloco com seus próprios estados, e só depois montar o controlador. Cada bloco tinha matriz bem condicionada, e o simulador finalmente convergiu.
Como montar a forma canonica e fatorada passo a passo
Pegar a função de transferência G(s) = N(s)/D(s). Primeiro você normaliza o denominador para que o coeficiente líder seja 1. Depois define as variáveis de estado de acordo com a estrutura que escolheu. Para a forma canônica controle, em um sistema de ordem n com denominador s^n + a_{n-1}s^{n-1} + ... + a_1 s + a_0, a matriz A é uma companion com todos os uns na subdiagonal e os negativos dos coeficientes na última linha. A matriz B é simplesmente [0 0 ... 0 1]^T. A matriz C depende dos coeficientes do numerador: se N(s) = b_{n-1}s^{n-1} + ... + b_1 s + b_0, então C = [b_0 b_1 ... b_{n-1}]. Isso vale pra forma propriamente estrita. Se o numerador tiver grau igual ao denominador, você tem um termo D não nulo. Já a forma fatorada entra quando você decompõe a função de transferência em fatores de primeira ou segunda ordem. Isso é especialmente útil quando os polos são reais distintos ou conjugados complexos. Cada fator gera um bloco na sua realização. A vantagem principal aqui é controle numérico — você consegue dimensionar ganhos e escalas por bloco separado, sem que erros se propaguem por todo o sistema de uma vez.
O problema é que a fatoração exata dos polos muitas vezes exige ferramentas numéricas (roots, numpy.linalg.eigvals). E aí você entra no território dos erros de arredondamento. Para polinômios de ordem alta, o cálculo dos raízes pode ser instável. O truque que eu uso é fatorar pelo método de Durand-Kerner ou simplesmente usar bibliotecas especializadas como a do control library do Python, que já trata scaling interno. Outra coisa que poucos mencionam: a forma canônica fatorada não preserva necessariamente a estrutura esparsa do sistema original. Se você está lidando com um modelo estruturado de múltiplas entradas e múltiplas saídas (MIMO), forçar uma forma canônica pode transformar uma matriz esparsa em uma matriz densa. Isso impacta diretamente o tempo de simulação em modelos grandes. Em projetos reais, prefira formas semi-canônicas ou realizações baseadas na topologia do circuito/gráfico, não na forma algébrica pura. Agora sobre a forma canonica e fatorada aplicada diretamente: você basicamente faz uma decomposição em frações parciais quando os polos são distintos. G(s) = r_1/(s-p_1) + r_2/(s-p_2) + ... Cada termo gera um polo e um residuo. Você monta um estado por polo, e a dinâmica fica diagonal. A matriz A é diagonal com os polos na diagonal. A matriz B tem uns. A matriz C tem os residuos. Simples. Mas funciona apenas para polos distintos — se houver polos repetidos, você precisa incluir os termos de ordem superior na expansão e a estrutura muda para blocos de Jordan.

Uma limitação honesta: nenhuma dessas formas é universalmente melhor. A forma canônica controle é direta mas numericamente frágil. A forma fatorada é estável mas perde informação estrutural e pode ser numericamente instável na fatoração em si. A forma diagonal é bonita mas só funciona com polos distintos e sem zeros. Na prática, a maioria dos engenheiros que eu conheço acaba usando combinações: blocos de segunda ordem para polos complexos, realizações em cascata para evitar acoplamento numérico, e apenas formas canônicas completas para sistemas de ordem baixa (até 3 ou 4). Se você está começando agora e quer implementar isso, comece com bibliotecas consolidadas. O Python com scipy.signal ou o MATLAB permitem converter diretamente entre formas: tf2ss, canon, mode, etc. Teste sempre o número de condição das matrizes envolvidas. Se o condicional passar de 1e8, mude de representação. Nada substitui verificar na prática se a resposta do sistema em espaço de estados batendo com a resposta da função de transferência original — uma diferença de 1e-6 já é sinal de problema.
Galeria
-
Forma canônica e forma fatorada de um função quadrática - YouTube -
Função de 2º Grau: Formas Canônica e Fatorada | PDF | Análise complexa ... -
FUNÇÃO QUADRÁTICA - EXERCÍCIOS FORMAS CANÔNICA E FATORADA - YouTube -
FUNCION CUADRATICA (forma canónica, estándar, factorizada ejercicios ...