Existe-t-il une implémentation C ouverte pour la solution des équations quartiques:
Je pense à une implémentation de la solution Ferrari. Sur Wikipédia, j'ai lu que la solution n'est stable sur le plan du calcul que pour certaines des combinaisons de signes possibles des coefficients. Mais peut-être que j'ai de la chance ... J'ai obtenu une solution pragmatique en résolvant analytiquement en utilisant un système d'algèbre informatique et en exportant vers C. Mais s'il y a une implémentation testée, je préférerais l'utiliser. Je recherche une méthode rapide et préfère ne pas utiliser un finder racine général.
Je n'ai besoin que de vraies solutions.
polynomials
nonlinear-equations
roots
highsciguy
la source
la source
Réponses:
Je déconseille fortement d'utiliser des solutions sous forme fermée car elles ont tendance à être numériquement très instables. Vous devez être extrêmement prudent dans la manière et l'ordre de vos évaluations des paramètres discriminants et autres.
L'exemple classique est celui de l'équation quadratique . Le calcul des racines comme posera des problèmes pour les polynômes où depuis lors, vous obtenez l'annulation dans le numérateur. Vous devez calculer .x 1 , 2 = - b ± √un x2+ b x + c = 0 b≫4acx1=-(b+sign(b) √
Higham dans son chef-d'œuvre "Accuracy and Stability of Numerical Algorithms" (2e éd., SIAM) utilise une méthode de recherche directe pour trouver les coefficients d'un polynôme cubique pour lesquels la solution cubique analytique classique donne des résultats très imprécis. L'exemple qu'il donne est . Pour ce polynôme, les racines sont bien séparées et le problème n'est donc pas mal conditionné. Cependant, s'il calcule les racines en utilisant l'approche analytique et évalue le polynôme dans ces racines, il obtient un résidu de tout en utilisant une méthode standard stable (la méthode de la matrice compagnon) , le résidu est d'ordreO ( 10 - 2 ) O ( 10 - 15 ) O ( 10 - 11 )[a,b,c]=[1.732,1,1.2704] O(10−2) O(10−15) . Il propose une légère modification à l'algorithme, mais même alors, il peut trouver un ensemble de coefficients conduisant à des résidus de qui n'est certainement pas bon. Voir p480-481 du livre mentionné ci-dessus.O(10−11)
Dans votre cas, j'appliquerais la méthode de Bairstow . Il utilise une combinaison itérative d'itération de Newton sur les formes quadratiques (puis les racines du quadratique sont résolues) et de déflation. Il est facilement implémenté et il existe même des implémentations disponibles sur le Web.
la source
Voir ces:
Résolution quartiques et Cubiques Graphics , publié dans Graphics Gems V . Le code d'origine est ici . Voir aussi ceci et cela .
Une méthode universelle pour résoudre les équations quartiques .
la source
Les recettes numériques en c fournissent une expression sous forme fermée pour de vraies racines quadratiques et cubiques qui ont vraisemblablement une précision décente. Étant donné que la solution algébrique de la quartique implique la résolution d'un cube puis la résolution de deux quadratiques, une quartique de forme fermée avec une bonne précision n'est pas hors de question.
la source