Remplir matrice/vecteur

idriss42

XLDnaute Nouveau
Bonjour à tous,

Je suis nouveau sur le forum, en effet je me suis mis a vba aujourd'hui.

Je souhaiterais remplir une matrice ou un vecteur de valeurs que je trouve grace à une fonction que j'ai "construite"
que l'on appellera R(k) k un entier. J'aimerai obtenir un vecteur (R(1),...,R(k)) k étant fixé.

Je ne sais pas du tout pas ou commencer.

Merci d'avance pour votre aide.

Bonne fin de journée.
 

idriss42

XLDnaute Nouveau
Re : Remplir matrice/vecteur

Bonjour à tous,

Je cherche à programmer un fonction renvoyant une valeur aléatoire qui représente un taux d'intérêt.
Ce taux suit le modèle Cox Ingersoll Ross du type: dr = p(q-r)dt + v.sqrt(r)dB ou B est un mouvement brownien.

Voici ce que j'ai programmé. Cette fonction ainsi programmée renvoie uniquement 0.

Function CIR(ByVal T As Long, ByVal r0 As Double, ByVal p As Long, ByVal q As Long, ByVal v As Long) As Long
Dim w As Long
Dim i As Integer
r = r0
For i = 1 To 12 * T
r = r + p * (q - r) + v * (1 / (12 * T)) ^ 0.5 * r ^ 0.5 * Application.WorksheetFunction.NormInv(Rnd(), 0, 1)
Next i
CIR = r
End Function

Il y a surement un erreur dans la phase de déclaration mais je ne la vois pas.

Cordialement,

Idriss
 

Dranreb

XLDnaute Barbatruc
Re : Remplir matrice/vecteur

Bonjour.
r n'est pas déclaré, mais vous devriez pouvoir utiliser CIR à la place, mais ça me parait bizarre, compte tenu de l'expression ajoutée dans la boucle qu'elle doive rendre un Long et non un Double
 

idriss42

XLDnaute Nouveau
Re : Remplir matrice/vecteur

J'ai remplacé w par r, il s'agissait d'une erreur d'inattention vu que j'ai modifié mon code une 20aine de fois.
J'ai considéré la fonction comme double, mais cela n'a pas fonctionné non plus, ce qui est encore plus étrange c'est que la fonction dont je vais mettre le programme ci dessous fonctionne très bien :

Function P_A(ByVal S0 As Double, ByVal Tfinal As Integer, ByVal mu_a As Long, ByVal sigma_a As Long) As Long
Dim i As Integer
Dim s As Long
s = S0
For i = 1 To 12 * Tfinal
s = s + s * (mu_a * (1 / (12 * Tfinal)) + sigma_a * (1 / (12 * Tfinal)) ^ 0.5 * Application.WorksheetFunction.NormInv(Rnd(), 0, 1))
Next i
P_A = s
End Function

Merci à vous.

Cordialement,

Idriss
 

Dranreb

XLDnaute Barbatruc
Re : Remplir matrice/vecteur

Seul un arrondi entier de votre expression est ajoutée à s à chaque passage dans la boucle. Et si S0 < 0.5 elle ne peut que rester à 0. Est-ce bien ce que vous voulez ?
 
Dernière édition:

idriss42

XLDnaute Nouveau
Re : Remplir matrice/vecteur

Quand est-ce qu'il est utile que je déclare mes variables "ByVal" ou non ? Je ne comprends pas la différence.
Un bon nombre de fois, mes fonctions ne renvoient pas ce que'elles doivent renvoyer et dès que j'utilise une déclaration de mes variables à l'aide de ByVal, cela fonctionne.

Cordialement,

Idriss
 

Dranreb

XLDnaute Barbatruc
Re : Remplir matrice/vecteur

Lorsqu'une procédure attend un paramètre ByRef (assumé par défaut) le code appelant n'a pas d'autre choix que d'en passer l'adresse, et la donnée passée, en principe une variable, doit obligatoirement être du type attendu par la procédure. Sa modification dans celle ci se répercute dans la variable passée.
Lorsqu'elle attend un paramètre ByVal, le code appelant a le loisir de traiter toute expression, quitte à la calculer, et ce de telle sorte qu'elle soit du type attendu par la procédure. Elle y devient une variable locale. Sa modification dans la procédure ne peut avoir aucune répercussion dans l'appelant.
Exceptions ou particularités: Un tableau ne peut pas être passé ByVal. Un objet peut être modifié dans une procédure même s'il y est passé en paramètre ByVal: c'est seulement au niveau des conséquences d'un Set effectué par la procédure sur le paramètre que la règle s'applique.
 
Dernière édition:

idriss42

XLDnaute Nouveau
Re : Remplir matrice/vecteur

Bonjour, une nouvelle journée et de nouveaux problèmes arrivent encore:

Ma fonction ZC renvoit valeur! La fonction CIR renvoie des valeurs cohérentes.

Function CIR(T As Integer, ByVal r0 As Double, ByVal p As Double, ByVal q As Double, ByVal v As Double) As Double
Dim r As Double
Dim i As Integer
r = r0
For i = 1 To 12 * T
r = r + p * (q - r) * (1 / (12 * T)) + v * (1 / (12 * T)) ^ 0.5 * r ^ 0.5 * Application.WorksheetFunction.NormInv(Rnd(), 0, 1)
Next i
CIR = r

Function ZC(T As Integer, Tf As Integer, ByVal r0, ByVal p As Double, ByVal q As Double, ByVal v As Double, ByVal l As Double) As Double
Dim g As Double
Dim A As Double
Dim B As Double

g = ((p + l ^ 2) + 2 * v ^ 2) ^ 0.5
A = ((2 * g * Exp((g + p + l) * (Tf - T) / 2)) / ((g + p + l) * (Exp(g * (Tf - T)) - 1) + 2 * g)) ^ (2 * p * q / v ^ 2)
B = (2 * (Exp(g * (Tf - T)) - 1)) / ((g + p + l) * (Exp(g * (Tf - T)) - 1) + 2 * g)

ZC = A * Exp(-B * CIR(T, r0, p, q, v))

End Function

Est-ce encore un problème de déclaration de variables.
Je suis bien trop aveugle en vba pour m'en rendre compte.

Cordialement,

Idriss
 

Dranreb

XLDnaute Barbatruc
Re : Remplir matrice/vecteur

Vérifiez si les arguments passés à la Function dans la formule peuvent être converties en les types de données qu'elle attend. Si vous pensez que oui, mettez un point d'arrêt dans la Function, revalidez la formule, et si l'arrêt se produit bien dans celle ci, déroulez en pas à pas, vérifiez les valeurs. Sinon c'est que vous vous trompez, les arguments ne conviennent pas.
 

Statistiques des forums

Discussions
312 677
Messages
2 090 821
Membres
104 677
dernier inscrit
soufiane12