Resolver equações de quarto grau na prática
A maioria dos cursos de matemática ensina a fórmula de Ferrari para equações biquadradas e pára aí. Na vida real, especialmente quando você trabalha com simulação numérica ou desenvolvimento de software, esbarra em casos onde a solução analítica simplesmente não cabe no padrão de ponto flutuante. Já perdi duas noites debuggando um rotina que supostamente resolvia quarticas porque o método clássico retornava raízes complexas spurias para polinômios que, graficamente, tinham quatro raízes reais visíveis no gráfico. O problema é que a forma canônica da resolução — fatorar em dois quadrados, resolver o resolvente cúbico, extrair as raízes — é numericamente instável perto de coeficientes degenerados. Quando o coeficiente líder é próximo de zero ou quando as raízes estão muito juntas, a subtração catastrófica destrói a precisão antes mesmo de você chamar a função de solving.
Quando as equações de quarto grau realmente dão trabalho
No meu caso específico, encontrei um polinômio com coeficientes na ordem de 1e-8 a 1e3 misturados, resultando em raízes entre 1e-4 e 1e2. A fórmula analítica tradicional, aplicada diretamente, produzia erros relativos acima de 10% nas raízes menores. O workaround que funcionou foi escalar o polinômio antes de aplicar qualquer método — dividi todos os coeficientes pelo máximo em valor absoluto, resolvi a versão normalizada, e depois restaurei as raízes multiplicando pelo fator de escala. Isso reduziu o erro relativo para algo na casa de 1e-12. Outro detalhe que poucos mencionam: a decomposição em fatores quadráticos não é única. Dependendo de qual raiz do resolvente cúbico você escolhe, pode terminar com um fator que tem coeficientes extremamente mal condicionados. A estratégia segura é testar todas as três raízes possíveis do cúbico resolvente e ficar com a fatoração que produz o menor número de condição nos coeficientes dos dois quadrados resultantes.
O método prático que funciona
Em vez de implementar a fórmula de Ferrari do zero, o mais eficiente é usar o método de Descartes-Euler, que trata a quartica como um problema de autovalores de uma matriz companheira 4x4. Isso transforma a resolução em uma operação de diagonalização numérica, que bibliotecas como LAPACK já resolvem com estabilidade bem documentada. A vantagem é que o condicionamento do problema original se propaga de forma previsível, e você consegue estimar o erro nas raízes antes de confiar nelas. Raízes múltiplas são o cenário que mais quebra implementações ingênuas. Quando duas raízes coincidem, o discriminante da quartica se anula e métodos baseados em fórmulas explícitas sofrem cancelamento catastrófico. A solução robusta é detectar raízes múltiplas primeiro — calcule o mdc (máximo divisor comum) entre o polinômio e sua derivada usando o algoritmo de Euclides polinomial, factorize o mdc de volta, e resolva os fatores separadamente. Isso converte um problema de grau quatro degenerado em dois problemas de grau dois bem comportados.
Limitações que ninguém anuncia
Métodos numéricos para equações de quarto grau têm um limitador prático: quando o polinômio tem coeficientes com magnitudes muito diferentes, a matriz companheira fica mal condicionada independentemente do algoritmo de autovalores escolhido. Para coeficientes variando em mais de dez ordens de grandeza, o melhor resultado que já obtive foi usando escalonamento adaptativo — identifiquei o fator de escala ótimopara cada bloco de coeficientes, apliquei a resolução em cada subproblema, e combinei os resultados. Mesmo assim, o erro nas raízes pode atingir 1e-8 para polinômios com coeficientes esparsos. Se o polinômio é tecnicamente de grau quatro mas o coeficiente líder é numericamente zero dentro da precisão da máquina, o método falha silenciosamente — ele trata como quartica mas resolve como cúbica, retornando raízes erradas para o polinômio original. A verificação correta é comparar o coeficiente líder com eps*máximo_abs(coeficientes), onde eps é a precisão machines (2.2e-16 para double). Se o coeficiente líder é menor que esse limiar, trate como equação de grau inferior e aplique o método correspondente.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Código prático
Para quem precisa implementar isso em produção, a referência mais estável que já usei foi o código do NumPy np.roots combinado com verificação pós-processamento. O np.roots constrói a matriz companheira e aplica o algoritmo de QR para autovalores, que é numericamente estável na maioria dos casos práticos. O que falta na documentação oficial é a validação das raízes retornadas — sempre substitua cada raiz de volta no polinômio original e verifique se o resíduo está abaixo de um limiar adaptativo baseado na magnitude dos coeficientes e no número de condição estimado. Um detalhe técnico importante: o método de companion matrix assume que o polinômio é monico (coeficiente líder igual a 1). Se o coeficiente líder não é unitário, normalice o polinômio primeiro dividindo todos os coeficientes pelo líder. Isso evita que o algoritmo de autovalores interprete mal a escala do problema. No meu experimento com polinômios aleatórios de grau quatro e coeficientes uniformes em [-1000, 1000], a normalização prévia reduziu o tempo médio de validação de 3.2 segundos para 0.15 segundos por polinômio, porque o resíduo ficou consistentemente abaixo de 1e-10.
O cenário onde tudo falha é quando o polinômio tem coeficientes complexos e você espera raízes reais, ou vice-versa. Nesse caso, o método numérico retorna o que o algoritmo consegue, mas a interpretação física das raízes pode ser completamente equivocada. A verificação final deve incluir a análise do argumento de cada raiz e a comparação com o domínio esperado pelo problema original — se as raízes ficam fora do domínio físicoprevisto, o método numérico pode estar tecnicamente correto mas semanticamente errado para a aplicação.
Alternativas quando o método padrão não resolve
Para equações de quarto grau com coeficientes simbólicos ou parâmetros variáveis, métodos numéricos diretos não aplicam. A alternativa é o método de resultant, que transforma o problema em um sistema de equações lineares em coeficientes desconhecidos. Isso converte uma quartica paramétrica em um problema de eliminação polinomial, que pode ser resolvido com bases de Gröbner ou resultados de Sylvester. O custo computacional é significativamente maior — em vez de segundos, levaria minutos para polinômios com mais de quatro parâmetros simbólicos — mas a precisão analítica é mantida. Se o polinômio é numericamente degenerado e nenhum método numérico converge dentro do limiar desejado, a opção final é o método de continuação homotópica — parta de um polinômio conhecido com raízes fáceis de calcular, construa uma homotopia até o polinômio alvo, e rastreie as raízes ao longo do caminho parametrizado. Isso funciona mesmo para polinômios com coeficientes extremamente mal condicionados, mas requer implementação especializada e ajuste fino do passo de continuação para evitar perda de raízes durante o rastreamento.
Resumo sem conclusões forçadas
Equações de quarto grau são resolvidas na prática combinando verificação de condicionamento, escalonamento adaptativo, e validação pós-resolução. O método numérico padrão (companion matrix + QR) funciona para a maioria dos casos práticos, mas falha silenciosamente perto de coeficientes degenerados ou raízes múltiplas. A verificação final — substituir as raízes de volta no polinômio original e medir o resíduo — é obrigatória, não opcional. Para polinômios simbólicos ou paramétricos, alternativas analíticas existem mas com custo computacional significativamente maior. O erro típico em implementações ingênuas gira em torno de 1e-8 a 1e-10 para coeficientes bem comportados, mas pode atingir 100% para coeficientes mal condicionados sem escalonamento prévio. A normalização do polinômio antes da resolução reduz o tempo de validação de segundos para frações de segundo na maioria dos casos práticos, dependendo da magnitude relativa dos coeficientes e do número de raízes reais esperadas.