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.
 

Dranreb

XLDnaute Barbatruc
Re : Remplir matrice/vecteur

Voir ma réponse poste #12.
Joindre un petit classeur en xls qui reproduit le problème … dont vous ne dites rien du symptôme.
Passez de préférence ByVal les paramètres qui ne sont pas destinés à être des variables d'un type obligatoire à modifier dans le programme appelant par la fonction. Plus de souplesse, moins de risques d'incompatibilité de type, l'appelant étant obligé de stocker dans la pile sa valeur sous la forme attendue par la fonction, et non son adresse.
 
Dernière édition:

idriss42

XLDnaute Nouveau
Re : Remplir matrice/vecteur

Je souhaite effectuer une fonction de (lambda) renvoyant une valeur aléatoire suivant une distribution de Poisson dans un premier temps.

Pour cela, il faut savoir sur X=somme (de k=0 à l'infini) k* indicatrice( P(k-1,lambda) <= U < P(k,lambda) )
avec P(k)=P(k-1)+ exp(-lambda)*lambda^k/(k!) et P(0)=exp(-lambda)
et avec U suivant une loi uniforme sur 0,1

suit une loi de poisson de paramètre lambda.

J'ai donc créé la fonction factoriel et la fonction P(k,lambda).

Mon problème arrive alors lors de la création de cette indicatrice.
Un autre problème rencontré est aussi le retour de "VALEUR!" lorsque k est trop grand. En effet cela me posera un problème lorsque que je vais sommer ces indicatrices selon k.

Avez vous une idée, pour programmer cette indicatrice et puis pour régler ce problème de retour de VALEUR! lorsque k grand ?

Merci d'avance,

Cordialement,

Idriss
 

idriss42

XLDnaute Nouveau
Re : Remplir matrice/vecteur

Ma feuille est vierge pour le moment, je l'utilise uniquement pour tester mes fonctions.
Désolé, je n'avais pas vu votre première réponse.

Function Factoriel(k As Long) As Long
Dim i As Integer
Dim m As Long
m = 1
For i = 1 To k
m = m * i
Next i
Factoriel = m
End Function

Function P(ByVal k As Long, ByVal lambda As Double) As Double
Dim q As Double
Dim i As Long
q = Exp(-lambda)
For i = 1 To k
q = q + Exp(-lambda) * lambda ^ i / (Factoriel(i))
Next i
P = q
End Function

Cette fonction renvoie VALEUR! pour lambda=2 et k=13 et + par exemple

Function Id(ByVal k As Long, ByVal lambda As Double, ByVal u As Double) As Double
If P(k, lambda) <= u And P(k + 1, lambda) > u Then
Id = 1
Else
Id = 0
End If
End Function

Cette fonction revoie "La formule que vous avez tapé contient une erreur..."


Désolé, mais je ne comprends pas tout ce que vous me demandez.

J'espère que cela va vous aider à mieux cerner mon problème.
Cordialement,

Idriss
 

Dranreb

XLDnaute Barbatruc
Re : Remplir matrice/vecteur

Factorielle 13 dépasse les capacité même d'un Long. Je crains qu'il ne vous faille l'écrire comme ça :
VB:
Function Factoriel(ByVal K As Long) As Double
Dim I As Long
Factoriel = 1: For I = 1 To K: Factoriel = Factoriel * I: Next I
End Function
Ou bien comme ça :
VB:
Function Factoriel(ByVal N As Long) As Double
Factoriel = 1: While N > 1: Factoriel = Factoriel * N: N = N - 1: Wend
End Function
Alors :
VB:
Sub Test()
MsgBox P(13, 2)
End Sub
affiche 0.99999997.694304
 
Dernière édition:

idriss42

XLDnaute Nouveau
Re : Remplir matrice/vecteur

Merci beaucoup, je rencontre toutefois toujours une difficulté lors de la création de ma fonction indicatrice.
Function Factoriel(ByVal k As Long) As Double

Factoriel = 1
While k > 1: Factoriel = Factoriel * k: k = k - 1:

Wend

End Function

Function P(ByVal k As Long, ByVal lambda As Double) As Double
Dim q As Double
Dim i As Long
q = Exp(-lambda)
For i = 1 To k
q = q + Exp(-lambda) * lambda ^ i / (Factoriel(i))
Next i
P = q
End Function

Function Id(ByVal k As Long, ByVal lambda As Double, ByVal u As Double) As Double
If P(k, lambda) <= u And P(k + 1, lambda) > u Then
Id = 1
Else
Id = 0
End If
End Function


Merci

Cordialement,

Idriss
 

Dranreb

XLDnaute Barbatruc
Re : Remplir matrice/vecteur

Quelle difficulté ?
Si c'est un plantage à l'exécution, allez en débogage, mettez des espions sur les expressions impliquées dans l'instruction qui plante.
Il se peut aussi qu'elle ne soit pas exécutée du tout depuis une formule si les paramètres passés ne peuvent être convertis en le type attendu par la fonction.
 
Dernière édition:

idriss42

XLDnaute Nouveau
Re : Remplir matrice/vecteur

Bonjour,

J'essaie actuellement, d'obtenir une fonction aléatoire X = somme (k=1 à N) de Xk ou N suit une loi de poisson de paramètre lambda et les Xk sont iid de loi log-normal(mu,sigma)
(Remarque: lorsque N=0, X=0 )

Function Charge_Sinistre(lambda As Double, mu As Double, sigma As Double) As Long
Dim k As Integer
Dim c As Double
N = VA_Poisson(lambda)
If N > 0 Then
For k = 1 To N
c = c + LGNORM(mu, sigma)
Next k
Charge_Sinistre = c
Else
Charge_Sinistre = 0
End If

Voici ce que j'ai produit.
Toutefois, je crois que le problème est dans la boucle.
J'ai l'impression que vba n'aime pas que l'on fasse une simulation dans une boucle.
J'ai bien pensé à ranger les N simulation de LGNORM dans une feuille puis les utiliser mais je ne sais pas faire.

Qu'en pensez vous?

Merci d'avance.

Cordialement,
Idriss
 

Dranreb

XLDnaute Barbatruc
Re : Remplir matrice/vecteur

Je n'ai absolument pas les éléments pour voir ce qui ne fonctionnerait pas dans le code indiqué. Mettez des point d'arrêts, des espions, déroulez en pas à pas. Interrogez la pile aussi éventuellement. Enfin utilisez les outils de débogage, quoi. Je ne peux pas le faire à votre place.
 

idriss42

XLDnaute Nouveau
Re : Remplir matrice/vecteur

A vrai dire, je ne sais pas faire..
Toutefois, j'ai remarqué que ma fonction f(lambda,mu,sigma) fonctionne très bien lorsqu'elle est de la forme f(lambda) et que je fixe des valeurs définies à l'avance pour sigma et mu dans le programme.

Function Charge_Sinistre(ByVal lambda As Double)as Long au lieu de (lambda As Double, mu As Double, sigma As Double) As Long
Dim k As Integer
Dim c As Double
N = VA_Poisson(lambda)
If N > 0 Then
For k = 1 To N
c = c + LGNORM(0, 1) au lieu de c = c + LGNORM(mu, sigma)
Next k
Charge_Sinistre = c
Else
Charge_Sinistre = 0
End If

Je ne peux résoudre cette erreur tout seul, j'y ai deja été confronté la semaine dernière, c'est pour cela que je vous avez demandé comment remplir un vecteur de valeurs.

Cordialement,

Idriss
 

Dranreb

XLDnaute Barbatruc
Re : Remplir matrice/vecteur

Pour mettre ou enlever un point d'arrêt, il suffit de cliquer dans la marge grise gauche en face d'une instruction exécutable. La touche F8 permet ensuite de dérouler pas à pas.
Pour beaucoup d'expressions une infobulle en montre la valeur. Sinon sélectionnez la, puis Alt+D, U, Entrée. Pour interroger la pile: Ctrl+L et vous pouvez sélectionner les appels successifs.
Conseils: Mettez Option Explicit en tête de tous vos modules, ce n'est pas une contrainte que ça entraine mais une meilleure aisance de mise au point. Mettez ByVal les paramètres des fonctions.
 

Statistiques des forums

Discussions
312 756
Messages
2 091 737
Membres
105 060
dernier inscrit
DEDJAN Gaston