Résolution équation par référence circulaire

Résolu/Fermé
Peyo - Modifié par Peyo le 20/06/2011 à 16:11
 Peyo - 23 juin 2011 à 08:40
Bonjour à toutes et à tous,

Je travaille sous Excel (2007) et je cherche à résoudre simplement l'équation du premier degré non polynomiale suivante :


x = 1 / [ log10 (a + b/ racine(x) ] ²

où a et b sont des valeurs (réelles) calculées dans des cellules de ma feuille.

Pour la résolution, j'ai pensé à itérer en créant une référence circulaire, ce qui donne :

dans la case A1 :
= 1/( LOG10(a + b/RACINE(A2) ) ) ^2

dans la case A2 :
= 1/( LOG10(a + b/RACINE(A1) ) ) ^2

(Vous l'aurez compris, le "a" et le "b" font bien appel aux cellules concernées dans les formules de ma feuille, j'utilise simplement ici cette notation pour simplifier, mais pas d'erreur de ce-côté là !)


En faisant cela, je me dis que A1 pioche la valeur de x comprise dans A2 en guise d'itération "i", que A2 pioche la valeur de x comprise dans A1 en guise d'itération "i+1" et ainsi de suite, ce qui permet la résolution. Cela vous semble-t-il d'ores-et déjà correct ou pensez-vous qu'il y ait une déjà une erreur de raisonnement ?

Le fait est que, lorsque j'active le calcul itératif et lance des itérations, je trouve une valeur numérique (la même, à un arrondi minuscule près, dans A1 et A2) qui est juste (je le sais), donc à priori, pas de problème me direz-vous ?

Jusque là, effectivement non ! MAIS, lorsque je calcule séparément la formule en A2 (en cliquant gauche dessus pour l'éditer puis en pressant "Entrée"), l'erreur "#DIV/0 !" apparaît ! J'ai vérifié, je ne trouve pas d'erreur dans mes formules. Et quand je relance les itérations (après avoir réinitialisé A1 et A2), je ré-obtiens les valeurs numériques, et en ré-éditant, l'erreur réapparaît ...

Bref, je suis un peu à cours, je ne sais pas si l'erreur provient de mon raisonnement même quant à la résolution, d'un problème d'erreur dans les formules ou autre ?

Si quelqu'un est susceptible de m'éclairer ... merci beaucoup d'avance (et désolé pour la longueur du message, j'ai essayé d'être complet ^^) !!!

Peyo

2 réponses

eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
Modifié par eriiic le 20/06/2011 à 19:51
Bonjour,

C'est pas simple et dangereux les calculs itératifs.
Mais tu as l'air de savoir ce que tu fais et où tu mets les pieds donc j'arrete là les mises en gardes... ;-)

Personnellement voilà comment je traiterais.
Déjà dans les options pour la mise au point : calcul sur ordre et itération sur 1 pour tester en faisant F9 pour chaque itération (ensuite mettre la valeur appropriée).

Sur ton raisonnement je suis d'accord, mais puisque tu es parti sur une référence circulaire inutile d'utiliser 2 cellules, ça cache la misère mais la référence circulaire est toujours là.

Donc avec a en B1, b en B2 je mettrais en A1 :
= 1/( LOG10(B1 + B2/RACINE(A1) ) ) ^2
et ça fait comme toi : #DIV/0!, ce qui est logique puisqu'on a rien en A1 avant la 1ère itération

Il faudrait donc une semence pour démarrer.
Avec un SI() on va forcer à 1 :
= 1/( LOG10(B1 + B2/RACINE(SI(A1=0;1;A1)) ) ) ^2
ou bien
= 1/( LOG10(B1 + B2/RACINE(SI(ESTERREUR(A1);1;A1)) ) ) ^2

Et là ça tourne...
J'ai mis 1 pour initialiser mais il y a peut-être mieux. Parfois une valeur bien choisie ou un résultat de fonction fait converger beaucoup plus vite. Là c'est toi qui sait.

Dis moi ce que tu en penses et le résultat de tes tests voir si je ne suis pas trop à coté de la plaque...

Pour info ce problème devrait pouvoir être traité en vba (?) par une fonction personnalisée, ce qui éviterait d'activer l'itération dans excel

eric
0
Merci de ta réponse !!!

Alors effectivement, j'avais tout de suite essayé avec un seuil d'itération à 1, et dès la deuxième itération je trouve ma valeur finale (à l'arrondi que je considère acceptable et en ayant adopté une valeur d'initialisation optimisant la rapidité de convergence au vu du résultat escompté).

Pour ce qui est de l'initialisation, j'utilisais jusqu'à présent un compteur d'itération (cellule définie dans ma feuille) qui me servait de valeur test pour l'initialisation et la ré-initialisation. Néanmoins, je ne testais que la nullité de la valeur et pas l'erreur comme tu le suggères, ce que je viens donc de modifier.

Sinon, pourquoi utiliser 2 cellules pour la référence circulaire ? Et bien simplement parce que je n'ai absolument pas pensé à n'en utiliser qu'une seule , donc voilà chose faite, merci bien, cela paraissait tellement évident que ça ne m'a jamais effleuré l'esprit ... Hum hum ... ^^

Par contre, un phénomène que je ne comprends à priori pas subsiste : une ré-initialisation se produit à chaque fois que j'édite (manuellement) la cellule, alors que je ne teste que la nullité de la valeur (pour l'initialisation, comme dans ta première proposition). Et là j'avoue qu'une fois de plus, de prime abord, je ne vois pas ce qui se produit ... Cela me dérange dans la mesure où j'aimerais être certain de la validité de mes résultats, or ce mécanisme laisse pour l'instant planer un doute.

Quelqu'un a-t-il une idée à ce sujet ?


Merci d'avance et bonne journée !

P.S. : en ce qui concerne visual basic, je suis un parfait ignare !
0
eriiic Messages postés 24570 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 23 avril 2024 7 213
21 juin 2011 à 10:43
Bonjour,

Peut-être serait-il interessant que tu déposes un exemple sur cijoint.fr et que tu colles le lien fourni ici.
eric
0