J'ai passé pas mal de temps à essayer de comprendre ce qui cloche dans mon programme, mais ne trouvant je me résigne à demander de l'aide à des internautes sympas qui auraient un peu de temps à y consacrer.
L'objectif de ce pg tout simple est de calculer les intérêts cumulés. p.e : Montant de 1000 euros placé à un taux d'intérêt de 5% pendant 3 ans, cela rapporte...
Il s'agit d'un taux continu, la formule est donc = Montant*Exp(r*T)
Pour corser, un peux le problème je considère que le taux varie en fonction d'un paramètre aléatoire (calculé par : NormSInv(Rnd)). Je découpe l'évolution de cette variable afin qu'elle ne soit pas continue mais discrète selon un certain nombre de période. (Principe de Montecarlo)
Un essai = un tirage (composé d'une succession de points de durée égale à "dt" tel que : dt = T / NbPeriode)
Je lance donc "NbEssai" chacun composé de "NbPeriode"... et la moyenne de la dernière période de tous ces essaias me donne le résultat final.
Mon résultat par la fonction : Interets_R1 -> Ok, elle fonctionne.
Function Interets_R1(Montant, r, T, NbEssai, NbPeriode)
ReDim Total(NbEssai) As Double
ReDim Tableau_Essais(NbEssai, NbPeriode + 1) As Variant
dt = T / NbPeriode
For i = 1 To NbEssai
Var = Montant
Tableau_Essais(i, 1) = Montant
For j = 1 To NbPeriode
Randomize
Var_Aleatoire = WorksheetFunction.NormSInv(Rnd)
Var = Var * Exp(r * dt * Var_Aleatoire)
Tableau_Essais(i, j + 1) = Var
Next j
Total(i) = Tableau_Essais(i, NbPeriode + 1)
Next i
Interets_R1 = WorksheetFunction.Average(Total)
End Function
Par contre, je ne comprends par pourquoi je n'arrive pas à la modifier des deux façons suivantes : A/ Je souhaite récupérer tous les résultats intermédiaires : La différence est en rouge en dessous (Worksheets("Solution" ) : existe bien dans mon classeur).
Auparavant, j'avais réalisé une récupération de varaible tableau par procédure et cela fonctionnait très bien ?!?!
Function Interets_R3(Montant, r, T, NbEssai, NbPeriode)
ReDim Total(NbEssai) As Double
ReDim Tableau_Essais(NbEssai, NbPeriode + 1) As Variant
dt = T / NbPeriode
For i = 1 To NbEssai
Var = Montant
Tableau_Essais(i, 1) = Montant
For j = 1 To NbPeriode
Randomize
Var_Aleatoire = WorksheetFunction.NormSInv(Rnd)
Var = Var * Exp(r * dt * Var_Aleatoire)
Tableau_Essais(i, j + 1) = Var
Next j
Total(i) = Tableau_Essais(i, NbPeriode + 1)
Next i
Interets_R3 = WorksheetFunction.Average(Total)
Worksheets("Solution" ).Activate
For i = 1 To NbEssai
For j = 1 To NbPeriode + 1
Cells(i, j).Value = Tableau_Essais(i, j)
Next j
Next i End Function
B/ Je souhaitais simplifier le code en enlevant une variable : J'ai enlevé cette variable, mais cela ne fonctionne pas "ReDim Total(NbEssai) As Double"
Je voulais récupérer le résultat de la fonction tel qu'indiqué ci-dessous en rouge
Function Interets_R2(Montant, r, T, NbEssai, NbPeriode)
ReDim Tableau_Essais(NbEssai, NbPeriode + 1) As Variant
dt = T / NbPeriode
For i = 1 To NbEssai
Var = Montant
Tableau_Essais(i, 1) = Montant
For j = 1 To NbPeriode
Randomize
Var_Aleatoire = WorksheetFunction.NormSInv(Rnd)
Var = Var * Exp(r * dt * Var_Aleatoire)
Tableau_Essais(i, j + 1) = Var
Next j
Next i
Interets_R2 = WorksheetFunction.Average(Tableau_Essais(NbPeriode + 1)) End Function
Bonjour,
Voici mon précédent message complété avec les balises.
D'avance Merci à tous PS : Pour être sincère le problème de R3 est vraiement celui qui pose problème. Pour R2, c'est simplement que j'aimerais comprendre comment faire ce genre d'action sans activer une autre variable.
La fonction R1 (initiale), qui fonctionne.
Code :
Function Interets_R1(Montant, r, T, NbEssai, NbPeriode)
ReDim Total(NbEssai) As Double
ReDim Tableau_Essais(NbEssai, NbPeriode + 1) As Variant
dt = T / NbPeriode
For i = 1 To NbEssai
Var = Montant
Tableau_Essais(i, 1) = Montant
For j = 1 To NbPeriode
Randomize
Var_Aleatoire = WorksheetFunction.NormSInv(Rnd)
Var = Var * Exp(r * dt * Var_Aleatoire)
Tableau_Essais(i, j + 1) = Var
Next j
Total(i) = Tableau_Essais(i, NbPeriode + 1)
Next i
Interets_R1 = WorksheetFunction.Average(Total)
End Function
R3 (R1 modifiée) ne fonctionnant pas :
Code :
Function Interets_R3(Montant, r, T, NbEssai, NbPeriode)
ReDim Total(NbEssai) As Double
ReDim Tableau_Essais(NbEssai, NbPeriode + 1) As Variant
dt = T / NbPeriode
For i = 1 To NbEssai
Var = Montant
Tableau_Essais(i, 1) = Montant
For j = 1 To NbPeriode
Randomize
Var_Aleatoire = WorksheetFunction.NormSInv(Rnd)
Var = Var * Exp(r * dt * Var_Aleatoire)
Tableau_Essais(i, j + 1) = Var
Next j
Total(i) = Tableau_Essais(i, NbPeriode + 1)
Next i
Interets_R3 = WorksheetFunction.Average(Total)
Worksheets("Solution" ).Activate
For i = 1 To NbEssai
For j = 1 To NbPeriode + 1
Cells(i, j).Value = Tableau_Essais(i, j)
Next j
Next i
End Function
Pour R3, les modifications sont seulement celles indiquées ci-dessous :
Code :
Worksheets("Solution" ).Activate
For i = 1 To NbEssai
For j = 1 To NbPeriode + 1
Cells(i, j).Value = Tableau_Essais(i, j)
Next j
Next i
R2 (R1 modifiée en vue d'être optimisé) ne fonctionnant pas également, la seule modimodifications à la place de la variable "Total"