Solution de l'équation quartique

10

Existe-t-il une implémentation C ouverte pour la solution des équations quartiques:

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

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.

highsciguy
la source
Avez-vous besoin de toutes les (vraies) solutions simultanément? Comme le dit GertVdE ci-dessous, si vous avez des problèmes de stabilité avec une solution de formulaire fermé, il n'y a pas vraiment de bonne raison de ne pas utiliser un algorithme de recherche de racine.
Godric Seer
3
Je trouve drôle que cela ait été étiqueté algèbre non linéaire, car vous pouvez simplement calculer les valeurs propres de la matrice compagnon, qui est déjà sous la forme de Hessenberg et appliquer des balayages QR serait assez simple.
Victor Liu
2
Jetez un œil aux solveurs cubiques / quartiques publiés dans ACM TOMS (algorithme 954) . Le code qui en fait partie est généralement de très haute qualité. Le papier lui-même est derrière un mur payant mais le code peut être téléchargé à partir de ce lien .
GoHokies
... (éditer plus tard) le code ACM est écrit en FORTRAN 90 mais ma première impression est que l'on pourrait l' appeler depuis C sans y mettre beaucoup d'efforts.
GoHokies
1
@GoHokies Je pense que vous devriez convertir votre commentaire en réponse parce que je pense que c'est une bonne réponse à cette question. D'autant plus que le papier lié parvient à éviter les instabilités numériques habituelles, et ce n'est absolument pas une chose banale à faire.
Kirill

Réponses:

20

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 ± ax2+bx+c=0 b4acx1=-(b+sign(b)

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

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(102)O(1015). 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(1011)

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.

GertVdE
la source
1
Pourriez-vous expliquer ce que vous entendez par "Je déconseille fortement d'utiliser des solutions sous forme fermée car elles ont tendance à être numériquement très instables". Cela s'applique-t-il uniquement aux polynômes du 4e degré ou s'agit-il d'une règle générale?
NoChance
@EmmadKareem J'ai mis à jour ma réponse ci-dessus.
GertVdE
3

Voir ces:

lhf
la source
2
En utilisant ce code sur le polynôme avec des coefficients donnés dans ma réponse, je trouve ce qui suit: , qui a une erreur relative de par rapport à la racine réelle (calculé à l'aide de la commande racines d'Octave qui utilise la méthode de la matrice associée). Elle a un résidu de tandis que la racine de la méthode de matrice associée a un résidu de . À vous de voir si cela est suffisant (pour les graphiques par ordinateur, cela pourrait l'être, pour d'autres applications, ce ne sera pas le cas)O ( 10 - 8 ) O ( 10 - 7 ) O ( 10 - 15 )x1=1.602644912244132e+00O(108)O(107)O(1015)
GertVdE
1

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.

Nemocopperfield
la source
Je viens d'obtenir la racine de l'exemple cubique cité en 2e-16 (un peu sur la précision de mes flotteurs) en utilisant les recettes numériques dans les formules cubiques c (press et al). Il y a donc lieu d'espérer.
Nemocopperfield