Saboh12617
XLDnaute Nouveau
Bonjour à tous,
Voici ci-joint une nouvelle bibliothèque de fonctions & modules Excel LAMBDA dédiés à l'analyse de polynômes.
Comme d'habitude, l'add-in Excel Labs | Microsoft Garage est fortement recommandé si vous souhaitez étudier les fonctions proposées. Cependant il n'est pas nécessaire pour un usage "simple".
Les polynômes sont représentés comme une liste de coefficients. On y réfèrera traditionnellement par la variable "_coefs" dans les fonctions. La liste [4,2,-1,8] représente donc le polynôme 4*x^3 + 2*x^2 - 1*x + 8.
Le fichier ci-joint propose quelques utilisations des fonctions en question :
N'hésitez surtout pas à me faire des retours sur tout cela, que ce soit bugs, suggestions, questions ou autre !
Ci-après une liste des modules et fonctions proposés (les noms sont en anglais mais à part "racine" qui devient "root" le reste est transparent).
Renvoi le polynôme normalisé/monique. Polynôme unitaire — Wikipédia
Evalue le polynôme au point z (réel ou complexe). Méthode Horner.
Renvoi les coefficients du polynôme dérivé.
Renvoi le degré du polynôme. Degré d'un polynôme — Wikipédia
Renvoi la norme du polynôme. Norme (mathématiques) — Wikipédia
Renvoi les racines (réelles et complexes) du polynôme. Elles sont évaluées de manière itérative (voir module DK). La précision est le seuil de convergence des racines. maxIter est le nombre maximum de récursions autorisées (200 par défaut).
Filtre les racines réelles uniquement.
Développe à partir des racines données l'expression du polynôme. _a0 correspond au coefficient principal (cf. Polynome unitaire/monique). Dans 3*x^2 + 1, _a0 = 3.
Calcule d'une étape de recursion (amelioration des racines).
Récursion générale.
Evaluation du déplacement |z_i(m+1) - z_i(m)|. En lien avec la variable _précision.
Evaluation des résidus |P(r)| de chaque racine. Ils doivent tendre vers zéro.
Barycentre des racines.
Rayon calculé via la méthode de Ehrlich.
Rayon calculé via la méthode des normes.
Rayon calculé via la méthode géométrique.
Rayon calculé via la méthode de Cauchy.
Calcul des valeurs initiales de la récursion du module DK.
Wrapper "user-friendly" de l'initialisation de la récursion. Choix du rayon le plus approprié.
Renvoi vrai/faux si la valeur donnée se trouve sous le seuil lim.
Renvoi vrai/faux si le nombre donné est complexe ou non. Aucune approximation donc 1+1e-30i est complexe ! Attention.
Renvoie vrai/faux si le nombre donné est réel. La précision permet de "shut" les petites parties imaginaires.
Renvoi une approximation (texte) du nombre complexe donnée au format donné.
Renvoi l'expression Σa*x^i du polynôme représenté par les coefficients donnés. On peut donner un nom au polynôme.
Formalise l'expression de la ou les valeurs complexes données.
Renvoi les coordonnées (x,y) = (x, f(x)) des (n = pts) points situés entre xmin et xmax du polynome donné. Par défaut xmin=-50, xmax=-1*xmin, pts=1000.
Renvoi l'expression factorisée Π(x-a_i) du polynôme donné (calcul interne des racines).
Affiche l'évolution de l'approximation des racines pour les (steps) étapes demandées.
Ajoute à SHOW_DK_STEPS l'évaluation du polynôme aux points donnés (on cherche à les faire tendre vers 0).
Reprend les valeurs de SHOW_DK_STEPS dans _dkSteps et ressort pour chaque racine (rootIdx = 1 pour racine 1, rootIdx = {1; 2} pour racines 1 & 2, etc.) les valeurs (x,y) = (Re(z), Im(z)) de la racine ("z") à chaque itération. Permet de tracer un graphique dans le plan complexe de la convergence des racines.
Voici ci-joint une nouvelle bibliothèque de fonctions & modules Excel LAMBDA dédiés à l'analyse de polynômes.
Comme d'habitude, l'add-in Excel Labs | Microsoft Garage est fortement recommandé si vous souhaitez étudier les fonctions proposées. Cependant il n'est pas nécessaire pour un usage "simple".
Les polynômes sont représentés comme une liste de coefficients. On y réfèrera traditionnellement par la variable "_coefs" dans les fonctions. La liste [4,2,-1,8] représente donc le polynôme 4*x^3 + 2*x^2 - 1*x + 8.
Le fichier ci-joint propose quelques utilisations des fonctions en question :
N'hésitez surtout pas à me faire des retours sur tout cela, que ce soit bugs, suggestions, questions ou autre !
Point théorique
Pour approfondir sur l'approche théorique implémentée, je me suis basé sur les articles wikipédia listés plus bas, ainsi que l'excellente vidéo YT , le code C++ proposé ici Fast and Stable Polynomial Root Finders - Part Five - CodeProject, et l'article suivant https://www.arxiv.org/pdf/2511.07728.Ci-après une liste des modules et fonctions proposés (les noms sont en anglais mais à part "racine" qui devient "root" le reste est transparent).
Module POLY :
POLY.NORMALISE(_coefs)Renvoi le polynôme normalisé/monique. Polynôme unitaire — Wikipédia
POLY.EVAL(_z; _coefs)Evalue le polynôme au point z (réel ou complexe). Méthode Horner.
POLY.DERIV(_coefs)Renvoi les coefficients du polynôme dérivé.
POLY.DEGREE(_coefs)Renvoi le degré du polynôme. Degré d'un polynôme — Wikipédia
POLY.NORM(_coefs)Renvoi la norme du polynôme. Norme (mathématiques) — Wikipédia
POLY.ROOTS(_coefs; [_precision]; [_maxIter])Renvoi les racines (réelles et complexes) du polynôme. Elles sont évaluées de manière itérative (voir module DK). La précision est le seuil de convergence des racines. maxIter est le nombre maximum de récursions autorisées (200 par défaut).
POLY.REAL_ROOTS(_coefs; [_precision]; [_maxIter])Filtre les racines réelles uniquement.
POLY.DEVELOP(_roots; _a0)Développe à partir des racines données l'expression du polynôme. _a0 correspond au coefficient principal (cf. Polynome unitaire/monique). Dans 3*x^2 + 1, _a0 = 3.
Module DK (pour
DK.STEP(_coefs; _roots; [_precision])Calcule d'une étape de recursion (amelioration des racines).
DK.REC(_coefs; _rootsP; [_precision]; [_tolPoly]; [_maxIter]; [_currIter])Récursion générale.
DK.MAX_DISP(_roots0; _roots1)Evaluation du déplacement |z_i(m+1) - z_i(m)|. En lien avec la variable _précision.
DK.RESIDUES(_coefs; _roots)Evaluation des résidus |P(r)| de chaque racine. Ils doivent tendre vers zéro.
Module INIT :
INIT.CENTER(_coefs)Barycentre des racines.
INIT.R_EHRLICH(_coefs)Rayon calculé via la méthode de Ehrlich.
INIT.R_NORM(_coefs)Rayon calculé via la méthode des normes.
INIT.R_GEOM(_coefs)Rayon calculé via la méthode géométrique.
INIT.R_CAUCHY(_coefs)Rayon calculé via la méthode de Cauchy.
INIT.START_VALUES(_coefs; _radius; _center)Calcul des valeurs initiales de la récursion du module DK.
INIT.SEEDS(_coefs)Wrapper "user-friendly" de l'initialisation de la récursion. Choix du rayon le plus approprié.
Module MATH :
MATH.PRECISION = 1e-16MATH.ZERO12 = 1e-12MATH.ZERO8 = 1e-8MATH.FORMAT = "0,00"MATH.ISZERO(_val; [_lim])Renvoi vrai/faux si la valeur donnée se trouve sous le seuil lim.
MATH.ISCOMPLEX(_val)Renvoi vrai/faux si le nombre donné est complexe ou non. Aucune approximation donc 1+1e-30i est complexe ! Attention.
MATH.ISREAL(_val; [_precision])Renvoie vrai/faux si le nombre donné est réel. La précision permet de "shut" les petites parties imaginaires.
MATH.APPROX(_val; [_format])Renvoi une approximation (texte) du nombre complexe donnée au format donné.
Module DISPLAY :
DISPLAY.POLY(_coefs; [_polyName])Renvoi l'expression Σa*x^i du polynôme représenté par les coefficients donnés. On peut donner un nom au polynôme.
DISPLAY.IMCLEAN(_zs; [_tol]; [_format])Formalise l'expression de la ou les valeurs complexes données.
DISPLAY.GRAPH_XY(_coefs; [_xmin]; [_xmax]; [_pts])Renvoi les coordonnées (x,y) = (x, f(x)) des (n = pts) points situés entre xmin et xmax du polynome donné. Par défaut xmin=-50, xmax=-1*xmin, pts=1000.
DISPLAY.POLY_FACTORIZED(_coefs; [_polyName])Renvoi l'expression factorisée Π(x-a_i) du polynôme donné (calcul interne des racines).
Module DEBUG :
DEBUG.SHOW_DK_STEPS(_coefs; _steps)Affiche l'évolution de l'approximation des racines pour les (steps) étapes demandées.
DEBUG.SHOW_STEPS_ANALYSIS(_coefs; _steps)Ajoute à SHOW_DK_STEPS l'évaluation du polynôme aux points donnés (on cherche à les faire tendre vers 0).
DEBUG.PLOT_ROOT_EVOL(_dkSteps; _rootIdx)Reprend les valeurs de SHOW_DK_STEPS dans _dkSteps et ressort pour chaque racine (rootIdx = 1 pour racine 1, rootIdx = {1; 2} pour racines 1 & 2, etc.) les valeurs (x,y) = (Re(z), Im(z)) de la racine ("z") à chaque itération. Permet de tracer un graphique dans le plan complexe de la convergence des racines.