Résolution équation par référence circulaire
Résolu/Fermé
A voir également:
- Il existe une ou plusieurs références circulaires
- Excel erreur références circulaires ✓ - Forum Excel
- Excel référence circulaire ✓ - Forum Excel
- Référence circulaire dans Excel 365 - Forum Excel
- Excel: Reference circulaire ✓ - Forum Excel
- Références circulaires entre excel-word - Forum Excel
2 réponses
eriiic
Messages postés
24601
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
25 novembre 2024
7 240
Modifié par eriiic le 20/06/2011 à 19:51
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
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
21 juin 2011 à 08:53
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 !
21 juin 2011 à 10:43
Peut-être serait-il interessant que tu déposes un exemple sur cijoint.fr et que tu colles le lien fourni ici.
eric