cs_ppppp
Messages postés12Date d'inscriptionmardi 17 août 2004StatutMembreDernière intervention 2 novembre 2004
-
19 août 2004 à 14:37
Zigarn
Messages postés106Date d'inscriptionmardi 13 juillet 2004StatutMembreDernière intervention26 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
cs_ppppp
Messages postés12Date d'inscriptionmardi 17 août 2004StatutMembreDerniè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!
Zigarn
Messages postés106Date d'inscriptionmardi 13 juillet 2004StatutMembreDernière intervention26 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 !
Zigarn
Messages postés106Date d'inscriptionmardi 13 juillet 2004StatutMembreDernière intervention26 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 !