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

Résolu
Peyo -  
 Peyo -
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

A voir également:

2 réponses

eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 279
 
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
Peyo
 
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 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 279
 
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
ccm81 Messages postés 11033 Statut Membre 2 433
 
bonjour a tous les deux

@ eriic
salutations et pas mal l'histoire (tordue) de la semence pour démarrer le processus

une question (bête)
pour ce genre de pb, pourquoi ne pas utiliser le solveur d'exel, qui est quand même fait pour ça?
bien sur, si c'est pour le plaisir .....

bonne journée
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 279
 
Salut ccm,

Ca peut être une idée oui.
Mais toutes les fonctions ne s'y prete pas forcément et parfois le solveur, vu son fonctionnement, s'écarte largement de la solution.
Et là, la fonction a l'air de converger très rapidement et devrait être plus rapide que le solveur.
A voir donc... :-)
eric
0
ccm81 Messages postés 11033 Statut Membre 2 433
 
re

j'ai testé avec le solveur, c'est immédiat (du moins avec les valeurs de a et de b que j'ai choisies) et ça colle avec ta formule récursive
0
Peyo
 
Bonjour !

Merci pour vos réponses !

Pour ce qui est de l'utilisation du solveur, je me suis posé la question quant à la possibilité d'y recourir, mais je ne l'ai finalement pas utilisé pas car je n'ai simplement jamais appris / pris le temps d'apprendre à l'utiliser.
J'opte alors pour cette méthode car elle m'a semblé rapide et ne requiert pas de savoir utiliser le solveur !

Voici un fichier où j'explique ma question, si certains on l'envie de s'y pencher, qu'ils n'hésitent pas ^^ : http://www.cijoint.fr/cjlink.php?file=cj201106/cijA6jmYeu.xlsx

Merci !!!
0
eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 279
 
Bonjour,

Je comprend mieux ta question.
Je pense que lorsque tu saisis une formule pour excel c'est la 1ère saisie (il ne va pas perdre des ressources pour historiser tout ça, voir si c'est la même ou s'il y a eu modif... ) et tout est réinitialisé pour évaluer la formule lors de la validation.
Lorsque tu passes en édition pour excel c'est une nouvelle saisie de formule, et F2 doit reprendre sa valeur d'erreur juste au moment de l'évaluation ( ce qu'on ne peut pas voir).
Si tu quittes par echap tu gardes l'évaluation précédente.
Sûrement un choix justifié des développeurs.

eric
0
Peyo
 
La cellule prend effectivement comme "valeur" une erreur après validation de l'édition (c'est bien ce que l'on constate si l'on ne procède pas au test de réinitialisation sur l'erreur), maintenant, cela doit comme tu le dis provenir d'une raison justifiée connue des développeurs (mais inconnue des honnêtes gens ^^).

Merci pour votre patience et votre aide !

Bonne journée !
0