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±b2−4ac−−−−−−−√2a
b≫4acx1=−(b+sign(b)b2−4ac−−−−−−−√)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(10−2)O(10−15). 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(10−11)
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.