Ich würde dringend davon abraten, geschlossene Lösungen zu verwenden, da diese numerisch sehr instabil sind. Sie müssen bei der Bewertung und Reihenfolge Ihrer Bewertungen der Diskriminante und anderer Parameter äußerst vorsichtig sein.
Das klassische Beispiel ist das für die quadratische Gleichung . Wenn Sie die Wurzeln als geraten Sie in Schwierigkeiten mit Polynomen, bei denen seitdem eine Stornierung in der Zähler. Sie müssen .ax2+bx+c=0
x1,2=−b±b2−4ac−−−−−−−√2a
b≫4acx1=−(b+sign(b)b2−4ac−−−−−−−√)2a;x2=ca1x1
Higham verwendet in seinem Meisterwerk "Genauigkeit und Stabilität numerischer Algorithmen" (2. Auflage, SIAM) eine direkte Suchmethode, um Koeffizienten eines kubischen Polynoms zu finden, für die die klassische analytische kubische Lösung sehr ungenaue Ergebnisse liefert. Das Beispiel, das er gibt, ist . Für dieses Polynom sind die Wurzeln gut getrennt und daher ist das Problem nicht schlecht konditioniert. Wenn er jedoch die Wurzeln unter Verwendung des analytischen Ansatzes berechnet und das Polynom in diesen Wurzeln bewertet, erhält er einen Rest von unter Verwendung einer stabilen Standardmethode (der Begleitmatrixmethode). ist der Rest in der Reihenfolge[a,b,c]=[1.732,1,1.2704]O(10−2)O(10−15). Er schlägt eine geringfügige Änderung des Algorithmus vor, aber selbst dann kann er eine Reihe von Koeffizienten finden, die zu Resten von was definitiv nicht gut ist. Siehe S. 480-481 des oben genannten Buches.O(10−11)
In Ihrem Fall würde ich die Methode von Bairstow anwenden . Es verwendet eine iterative Kombination aus Newton-Iteration für quadratische Formen (und dann werden die Wurzeln des Quadrats gelöst) und Deflation. Es ist einfach zu implementieren und es gibt sogar einige Implementierungen im Web.