De l'aide pour une boucle

cs_ppppp Messages postés 12 Date d'inscription mardi 17 août 2004 Statut Membre Dernière intervention 2 novembre 2004 - 19 août 2004 à 14:37
Zigarn Messages postés 106 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 26 janvier 2005 - 20 août 2004 à 09:38
Rebonjour à tous et à toutes.
Mon problème est le suivant:
J'ai un formulaire où je rentre dans trois champ une durée , un capital et une mensualité. Il faut que j'obtienne dans le quatrième champ le taux de l'emprunt.
Pour cela j'ai une formule qui calcule une mensualité:
Mensualité=(Capital*((Taux/100)/12)*(1+((Taux/100)/12))^Durée)/(((1+((Taux/100)/12))^Durée)-1)
Etant donné que l'on entre le capital , la durée, et la mensualité , pour avoir le taux il suffit d'en essayer plusieurs pour trouver celui qui permet de vérifier l'égalité. J'ai ce petit bout de programme mais ça ne fonctionne pas :

Dim var1 As Double
Dim var2 As Currency
var1 = 0
var2 = 0
Do Until var2 = Mensualité
var1 = var1 + 0.01
var2 = (Capital * ((var1 / 100) / 12) * (1 + ((var1 / 100) / 12)) ^ Durée) / (((1 + ((var1 / 100) / 12)) ^ Durée) - 1)
Exit Do
Loop
If var2 = Mensualité Then
Taux = var1
End If

Une idée chers programmeurs?
merci d'avance

6 réponses

cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
19 août 2004 à 15:29
j'ai pas regardé en détails ... mais
t'as pensé au problème d'arrondi !!!
;)

Allez, on tient le bon bout ....
0
Zigarn Messages postés 106 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 26 janvier 2005
19 août 2004 à 16:18
Si tu regardais les réponses de ton premier message ?

http://www.vbfrance.com/forum.v2.aspx?ID=279779

-------------------------------------------------
Débutant ... mais pas pour longtemps !
0
cs_ppppp Messages postés 12 Date d'inscription mardi 17 août 2004 Statut Membre Dernière intervention 2 novembre 2004
19 août 2004 à 16:18
Merci mais ça vient pas de là .
j'ai fini par trouver:
Dim var1 As Double
Dim var2 As Currency
var1 = 0
var2 = 0
While var2 < Mensualité
var1 = var1 + 0.01
var2 = (Capital * ((var1 / 100) / 12) * (1 + ((var1 / 100) / 12)) ^ Durée) / (((1 + ((var1 / 100) / 12)) ^ Durée) - 1)
Wend
Taux = var1
Et ça calcule un taux!
0
Zigarn Messages postés 106 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 26 janvier 2005
19 août 2004 à 16:22
Fais plutôt une recherche dichotomique comme expliqué en réponse à ton premier message !
http://www.vbfrance.com/forum.v2.aspx?ID=279779

-------------------------------------------------
Débutant ... mais pas pour longtemps !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Zigarn Messages postés 106 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 26 janvier 2005
19 août 2004 à 20:01
Ton algorithme doit fonctionner (et le problème venais bien, comme l'a dis thephil, de la non égalité exact entre tes des membres du fait des arrondis), mais je tiens à ta démontrer les bienfaits de la dichotomie.
Pour cela prenons un exemple : un taux à 5.5.
Avec ton algo, tu teste toutes les valeurs de 0 à 5.5 par intervalle de 0.01 soit (5.5-0)/0.01 = 500 valeurs testées, et cela ne fais que croître avec la valeur exact du taux.
Avec une recherche dichotomique, les valeurs testées sont 50, 25, 12.5, 6.125, 3.0625, 4.59375, 5.359375, 5.7421875, 5.55078125, 5.455078125, 5.5029296875, 5.47900390625, 5.490966796875, 5.4969482421875, 5.79993896484375 et enfin 5.501434326171875 soit en tout 16 valeurs testées.
De plus, suivant la précision choisi et l'intervalle de recherche, il est possible de calculer le nombre maximal de valeurs testées, qui n'est pas très élevé.
Au final, la recherche dichotomique est un des types de recherche possédant la compléxité moyenne (le nombre moyen d'opérations de bases effectuées) la plus basse.

Donc si tu veux que ton programme ne rame pas pendant un certain temps pour trouver un taux élevé, la recherche dichotomique est la solution à adopter.
Un programme qui fonctionne, c'est bien, un programme efficace, c'est mieux !

-------------------------------------------------
Débutant ... mais pas pour longtemps !
0
Zigarn Messages postés 106 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 26 janvier 2005
20 août 2004 à 09:38
Petite correction : avec la dichotomie, on ne teste que 14 valeurs car 5.5029296875 - 5.4969482421875 = 0.00598... < 0.01
Cela correspond du coup au calcul du nombre de tests effectué. En effet, sachant que l'on divise par deux l'intervalle entre les valeurs Max et Min à chaque itération, on s'arrète lorsque cet intervalle est inférieur à la précision, soit le premier i tel que Intervalle/(2^i) < Precision qui s'écrit aussi sous la forme i < log2(Intervalle/Précision). Ainsi le nombre de tests est exactement Sup(log2(Intervalle/Précision)), où Sup est la partie superieure c'est à dire la partie entière + 1.Dans notre cas cela donne Sup(log2((100-0)/0.01)) Sup(13.2877...) 14 CQFD

Comme quoi les maths c'est toujours utile en info !

-------------------------------------------------
Débutant ... mais pas pour longtemps !
0
Rejoignez-nous