Solução da equação quártica

10

Existe uma implementação C aberta para a solução de equações quárticas:

ax+bx³+cx²+dx+e=0

Estou pensando em uma implementação da solução da Ferrari. Na Wikipedia, li que a solução é estável em termos computacionais apenas para algumas das combinações possíveis de sinais dos coeficientes. Mas talvez eu tenha sorte ... Consegui uma solução pragmática resolvendo analiticamente usando um sistema de álgebra computacional e exportando para C. Mas se houver uma implementação testada, prefiro usá-la. Eu procuro um método rápido e prefiro não usar um localizador de raiz geral.

Eu preciso apenas de soluções reais.

highsciguy
fonte
Você precisa de todas as soluções (reais) simultaneamente? Como o GertVdE diz abaixo, se você tiver problemas de estabilidade com uma solução de formulário fechado, não há realmente um bom motivo para não usar algum algoritmo de busca de raiz.
Godric Seer
3
Acho engraçado que isso tenha sido marcado com álgebra não-linear, pois você pode simplesmente calcular os autovalores da matriz complementar, que já está no formato de Hessenberg, e aplicar varreduras QR seria bem simples.
Victor Liu
2
Veja os solucionadores cúbicos / quárticos publicados no ACM TOMS (Algorithm 954) . O código que entra nesse diário geralmente é de qualidade muito alta. O documento em si está protegido por uma parede de pagamento, mas o código pode ser baixado nesse link .
GoHokies 28/01
... (editar mais tarde) o código ACM está escrito em FORTRAN 90, mas minha primeira impressão é que alguém poderia chamá-lo de C sem fazer muito esforço.
GoHokies
11
@GoHokies Acho que você deve converter seu comentário em resposta, porque acho que é uma boa resposta para essa pergunta. Especialmente porque o artigo vinculado consegue evitar as instabilidades numéricas usuais, e isso não é absolutamente uma coisa trivial a se fazer.
Kirill

Respostas:

20

Eu desaconselho fortemente o uso de soluções de formulário fechado, pois elas tendem a ser numericamente muito instáveis. Você precisa tomar muito cuidado na maneira e na ordem de suas avaliações dos parâmetros discriminantes e outros.

O exemplo clássico é o da equação quadrática . Calcular as raízes como causará problemas para os polinômios em que desde então você recebe o cancelamento no numerador. Você precisa calcular .ax2+bx+c=0

x1,2=b±b24ac2a
b4ac
x1=(b+sign(b)b24ac)2a;x2=ca1x1

Higham, em sua obra-prima "Precisão e estabilidade de algoritmos numéricos" (2ª ed., SIAM), usa um método de pesquisa direta para encontrar coeficientes de um polinômio cúbico para o qual a solução cúbica analítica clássica fornece resultados muito imprecisos. O exemplo que ele fornece é . Para este polinômio, as raízes estão bem separadas e, portanto, o problema não está mal condicionado. Entretanto, se ele calcula as raízes usando a abordagem analítica e avalia o polinômio nessas raízes, ele obtém um resíduo de enquanto usa um método padrão estável (o método da matriz companheira) , o resíduo é da ordem[a,b,c]=[1.732,1,1.2704]O(102)O(1015). Ele propõe uma ligeira modificação no algoritmo, mas, mesmo assim, ele pode encontrar um conjunto de coeficientes que levam a resíduos de que definitivamente não é bom. Veja p480-481 do livro mencionado acima.O(1011)

No seu caso, eu aplicaria o método de Bairstow . Ele usa uma combinação iterativa de iteração de Newton em formas quadráticas (e as raízes do quadrático são resolvidas) e deflação. É facilmente implementável e existem até algumas implementações disponíveis na web.

GertVdE
fonte
11
Você poderia, por favor, explicar o que você quer dizer com "Eu desaconselharia fortemente o uso de soluções de formulário fechado, pois elas tendem a ser numericamente muito instáveis". Isso se aplica apenas aos polinômios de 4º grau ou é uma regra geral?
NoChance
@EmmadKareem Atualizei minha resposta acima.
GertVdE 5/09/12
3

Veja estes:

lhf
fonte
2
Usando esse código no polinômio com coeficientes dados na minha resposta, encontro o seguinte: , que possui um erro relativo de comparado à raiz real (calculado usando o comando de raízes do Octave, que usa o método da matriz complementar). Ele possui um resíduo de enquanto a raiz do método da matriz complementar possui um resíduo de . Até você se isso é bom o suficiente (para gráficos de computador que poderia ser, para algumas outras aplicações, não vai ser)x1=1.602644912244132e+00O(108)O(107)O(1015)
GertVdE
1

As receitas numéricas em c fornecem expressão de forma fechada para raízes reais de quadrática e cúbica que, presumivelmente, possuem precisão decente. Como a solução algébrica do quártico envolve a solução de um cubico e, em seguida, a solução de dois quadráticos, talvez um quártico de forma fechada com boa precisão não esteja fora de questão.

Nemocopperfield
fonte
Acabei de obter a raiz do exemplo cúbico citado em 2e-16 (um pouco acima da precisão dos meus carros alegóricos) usando as receitas numéricas nas fórmulas cúbicas c (press et al). Portanto, há razões para ter esperança.
Nemocopperfield 28/01