begin process at 2012 02 13 03:27:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > RESOLUTION DE POLYNÔME DE DEGRÈS N (CAD DE N'IMPORTE QUEL DEGRÈS)

RESOLUTION DE POLYNÔME DE DEGRÈS N (CAD DE N'IMPORTE QUEL DEGRÈS)


 Information sur la source

Note :
7,33 / 10 - par 3 personnes
7,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths Niveau :Initié Date de création :14/01/2004 Date de mise à jour :14/01/2004 04:40:37 Vu / téléchargé :18 644 / 793

Auteur : Geff

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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+7 X^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

  • '* -------------------------------------------------------------
  • '| 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
'* -------------------------------------------------------------
'| 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


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture LISSAGE D'UN OBJET 3D :: SUBDIVISION
Source avec Zip Source avec une capture LISSAGE D'UNE COURBE DÉFINIT PAR DES POINTS (SUBDIVISION)
Source avec Zip Source avec une capture METABALLS 3D OU BLOBS & MARCHING CUBES
Source avec Zip Source avec une capture METABALLS 2D EFFET GRAPHIQUE SYMPA
Source avec Zip Source avec une capture PAYSAGE 3D

 Sources de la même categorie

Source avec Zip Source avec une capture CONVERTISSEUR HEXAVIGÉSIMAL par shaeks
Source avec Zip Source avec une capture Source .NET (Dotnet) CRYPTOGRAPHIE AFFINE par Tigrou66
Source avec Zip Source avec une capture SCANNER FLEX par lajouad
Source avec Zip EQUATIONSECONDDEGRÉ,MATH,DEGRÉ par shadkitenge
Source avec Zip Source .NET (Dotnet) SOMME DE CHIFFRES CONTENUE DANS UN NOMBRE par alpha5

Commentaires et avis

Commentaire de Cyberdevil le 15/01/2004 17:18:07

sympa mais la méthode de Newton est surement beaucoup plus rapide ! Il suffit justre de dévlopper un alog pour faire les dérivée après ça converge encore plus vite que ta fonction !
8/10

Commentaire de Geff le 18/01/2004 18:14:12

Tout a fait, Newton converge bien plus vite en théorie (il faut quand meme effectuer un scan de la fonction dans l'intervalle de recherche) D'ailleurs je vais poster d'ici quelques temps la Fonction ResolvePolyNewton() :D
Je pense que cette facon de trouver les racines vaut le coup d'etre vu, si j'ai le temps je ferais un benchmark entre les 2 fonctions!

Commentaire de Cyberdevil le 18/01/2004 18:19:04

J'attend de voir ça ;)

A+

Commentaire de elmeiche le 29/05/2004 11:22:43

salut

c'est un grand travail , mais si tu ésaye de calculer les racinnes avec la méthode de NewtonRavsonne c'est encore mieux.

faite une aperçu à mon source "RÉSOLUTION D'ÉQUATION DE 3 ÉME DEGRÉ AVEC LA MÉTHODE DE NEWTON"

c'est un trés bon travail

elmeiche.noury@caramail.com

je vous remercier monsieur.

Commentaire de Geff le 29/05/2004 13:49:54

Merci elmeiche, comme je l'ai dis la fonction Resolvepoly est prête masi je ne l'ai pas encore commentée/postée par manque de temps mais ca ne tardera pas, en plus Resolvepoly est beaucoup plus courte et plus rapide!

Commentaire de elmeiche le 01/06/2004 19:46:15

je te félicite comme mème, c'est grand travail.

merci.

elmeiche.noury@caramail.com

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,217 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales