Voici une source assez sympa qui permet de trouver les racines réelles d'un polynôme de degrès n ( cad de n'importe quel degrès :D ) Donc en gros ce petit algo ( à peine 30 lignes de code pour la fonction ResolvePoly() ) permet très simplement de résoudre ce genre d'équation ::
Polynôme de degrès 15 ::
7X^15-8X^14-6X^13+4X^12-4X^11-6X^10+2X^9+X^8+7X^7+2X^6-2X^5-2X^4-9X^3+9X^2+5X-2 = 0
5 racines dans l'intervalle [ -2,2 ]
Racine N°1 :: -0,978867466913167
Racine N°2 :: -0,603002164541593
Racine N°3 :: 0,293669976482321
Racine N°4 :: 0,968125129970291
Racine N°5 :: 1,63964850956609
La convergence est assez rapide et la précision dépend de la variable Epsilon qui est modifiable, par défaut Epsilon = 10 ^ -10
La méthode est simple, on décompose la courbe en segments de droite, puis on verifi pour chaque segment si il y'a intersection avec la droite Y=0, si oui, on coupe en 2 le segment de droite et on réitère l'opération, jusqu'a ce que la longueur en abscisse du segment soit <=Epsilon.
La source est commentée
Dans le zip se trouve également une feuille permettant de paramétrer très facilement le polynôme, de tracer la courbe, et d'afficher les racines sur le graphe
=> voir la capture d'écran
Ci dessous le code de la procédure ResolvePoly()
Source / Exemple :
'* -------------------------------------------------------------
'| La procédure magique :D
'|
'|Cette procédure permet de résoudre le polynôme
'|F = 0 de n'importe quel degrès tel que ::
'| i
'| F = S[ Coef(i) * X ^ i ] = 0
'| 0
'|i = nombre de coefficents , S[] représente la somme
'|
'|Coef() est le tableau regroupant tous les coefficient du
'|polynôme, Coef(0) est la constante
'|mini est la borne inférieur de l'intervalle de la recherche
'|maxi est la borne supérieur de l'intervalle de la recherche
'|Resultat() est le tableau regroupant toutes les racines
'|
'| [ X(0),Y(0) ] - [ X(1),Y(1) ] représente un bout de segment (D)
'|de la courbe (C)
'|Pas est la taille de l'intervalle de recherche divisé par 1000
'|dPas est un intervalle de recherche de plus en plus petit
'|Epsilon est la longueur minimale de l'intervalle de recherche, c'est donc la précision de l'approximation
Dim X(1), Y(1), Pas, dPas, Epsilon, I, min, max As Double
Dim K, J As Byte
ReDim Resultat(0)
min = mini
max = maxi
'|On définit Epsilon, la précision est donc de 0.00000000001
Epsilon = 10 ^ -10
'|On calcule le Pas de la recherche
Pas = (max - min) / 1000
Debut:
'|On place le point gauche du segment D sur la borne minimale de recherche
'|(Attention min<>mini, sauf au début)
X(1) = min
'|On définit Y(1) = F(X(1))
For J = 0 To UBound(Coef): Y(1) = Y(1) + Coef(J) * X(1) ^ J: Next
'|On scan la courbe sur l'intervalle
For I = min To max Step Pas
'|On définit dPas comme la moitié de Pas, on a ainsi 2 segment
dPas = Pas / 2
For K = 1 To 2
'|On positionne les points du segment D
X(0) = X(1)
X(1) = X(0) + K * dPas
Y(0) = Y(1): Y(1) = 0
'|On calcule la position Y du polynôme au point X(1)
For J = 0 To UBound(Coef): Y(1) = Y(1) + Coef(J) * X(1) ^ J: Next
'|On calcule l'interserction entre la droite passant par le
'|segment D et la droite Y=0
Resultat(n) = IIf((Y(1) / Y(0) - 1) <> 0, X(0) - (X(1) - X(0)) / (Y(1) / Y(0) - 1), mini - 1)
'|Si l'intersection se situe dans la zone de recherche dPas
'|( en effet X(1)-X(0) = dPas )
If Resultat(n) >= X(0) And Resultat(n) <= X(1) Then
'|Si dPas a atteint la valeur minimale de l'intervalle, cad
'| si la valeur de Résultat(n) est proche à Epsilon près
If dPas <= Epsilon Then
'|Le nouveau minimum de recherche se situe à
'|la nouvelle racine trouvée
min = Resultat(n)
'|On agrandit le tableau de recherche de racine
n = n + 1
ReDim Preserve Resultat(n)
'|On retourne au début et on refait un scan
'|mais dans l'intervalle [ Resultat(n),max ]
GoTo Debut
Else
'|dPas n'est pas assez précis, donc on le divise par 2 et
'|on recommence car on sait qu'il y'a une racine dans le coin
dPas = dPas / 2
X(1) = X(0): Y(1) = Y(0)
K = 1
End If
End If
Next
Next
End Sub
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.