Gibt es eine offene C-Implementierung für die Lösung von Quartalsgleichungen:
Ich denke an eine Implementierung der Ferrari-Lösung. Auf Wikipedia habe ich gelesen, dass die Lösung nur für einige der möglichen Vorzeichenkombinationen der Koeffizienten rechenstabil ist. Aber vielleicht habe ich Glück ... Ich habe eine pragmatische Lösung erhalten, indem ich mithilfe eines Computeralgebrasystems analytisch gelöst und nach C exportiert habe. Wenn es jedoch eine getestete Implementierung gibt, würde ich diese vorziehen. Ich suche eine schnelle Methode und bevorzuge es, keinen allgemeinen Wurzelfinder zu verwenden.
Ich brauche nur echte Lösungen.
polynomials
nonlinear-equations
roots
Highsciguy
quelle
quelle
Antworten:
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
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.
quelle
Siehe diese:
Lösen Quartics und Cubics für Grafiken , die ursprünglich in der veröffentlichten Graphics Gems V . Der Originalcode ist hier . Siehe auch dies und das .
Eine universelle Methode zum Lösen von Quarzgleichungen .
quelle
Numerische Rezepte in c liefern einen Ausdruck in geschlossener Form für echte quadratische und kubische Wurzeln, die vermutlich eine anständige Präzision aufweisen. Da die algebraische Lösung des Quarzes das Lösen einer Kubik und dann das Lösen von zwei Quadraten beinhaltet, kommt eine geschlossene Quarz mit guter Präzision möglicherweise nicht in Frage.
quelle