Remplir matrice/vecteur

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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.
 
Re : Remplir matrice/vecteur

Bonjour.

Je ne sais si ça répond à la question (sinon joindre un classeur montrant ce que vous voulez faire) mais une Function renvoyant un tableau de Variant à 2 dimensions peut être invoquée dans une formule de plage matricielle de taille appropriée en lignes et colonnes.
 
Re : Remplir matrice/vecteur

A vrai dire si cela répond à ma question, je suis très pessimiste au sujet de ma future carrière de programmeur vba.

Je souhaiterai savoir comment on peut programmer le remplissage d'un vecteur. On a une fonction f(k) k entier, et je souhaite créer
un vecteur f(1),...,f(p)) afin de pouvoir réutiliser les valeurs f(1)...f(p) par la suite.

Je ne sais pas si c'est compréhensible.

Merci en tout cas.
 
Re : Remplir matrice/vecteur

Bonjour.
Utilisez le bouton "Aller en mode avancé", puis le bouton "Gérer les pièces jointes".
Sélectionnez votre classeur où vous avez fait tout ce que vous avez pu et "Envoyer"
Parce que là je ne sais pas du tout où vous bloquez exactement pour réaliser ce que vous voulez.
Avez vous déjà écrit votre Function dans VBA ? Bref, montrez moi votre problème.
Je ne suis même pas sûr que ce soit dans une feuille de calcul que vous voulez votre vecteur ou seulement en mémoire pour l'utiliser dans une autre macro. En tout cas ça passe par des tableaux VBA.
 
Dernière édition:
Re : Remplir matrice/vecteur

Function CIR(k As Integer) As Double

Dim R As Double
Dim i As Integer
R = 0.05
For i = 1 To k
R = R + (0.06 - R) + 0.03 * R ^ 0.5 * Application.WorksheetFunction.NormInv(Rnd(), 0, 1)
Next i
CIR = R

End Function

Voila ce que j'ai ecris en VBA, desolé je ne trouve pas le fichier avec le programme.

Ce que je souhaiterais par exemple, c'est créer une fonction G(k) qui attribuerait en A1 la valeur CIR(1) ... et en Ak CIR(k).

Merci à vous
 
Re : Remplir matrice/vecteur

Ben mettez en A1 :
Code:
=CIR(COLONNE())
et propagez à droite.
Remarquez la fonction NormInv n'est pas faite pour générer des nombres en distribution normale. Elle procède par itérations successives pour obtenir une valeur exacte. Ridicule quand on cherche à produire n'importe quoi. C'est un peu un marteau pilon pour écraser une mouche.

Essayez comme ça :
VB:
Function CIR(k As Integer) As Double
Dim R As Double
Dim i As Integer
Randomize
R = 0.05
For i = 1 To k
   R = R + (0.06 - R) + 0.03 * R ^ 0.5 * AléatN
Rem: pourrait s'écrire:  R = 0.06 + 0.03 * Sqr(R) * AléatN
'    ou encore : R = AléatN(Moy:=0.06, ÉTyp:=0.03 * Sqr(R))
   Next i
CIR = R
End Function

Function AléatN(Optional ByVal ÉTyp As Double = 1, Optional ByVal Moy As Double = 0) As Double
Const Pi = 245850922 / 78256779, Pi×2 = 2 * Pi
AléatN = Sqr(-2 * Log(Rnd)) * ÉTyp * Cos(Rnd * Pi×2) + Moy
End Function
Ce ne sont pas les valeurs successives d'un même calcul que vous voulez au moins ?
Mais non. Sans cela vous vous seriez arrangé pour que la fonction renvoie soit un tableau, soit un seul terme quitte à lui passer en paramètre la valeur du terme précédent, plutôt que le rang k qui ne servirait plus à rien.

Reste un problème de fond. Ce sont des valeurs dérivées d'éléments aléatoires n'ayant pas d'antécédent. Quand est-ce qu'une nouvelle séquence devra être calculée ? Je déconseille assez Application.Volatile qui aboutirait à ce que soit recalculé à l'occasion de n'importe quelle peccadille.
 
Dernière édition:
Re : Remplir matrice/vecteur

Merci pour votre réponse!

Je vais devoir simuler d'autres valeurs de variables aléatoires ( Poisson, Binomiale Negative, lognormale ...) comme il a été fait pour la loi normale.

Y a-il un moyen de générer ces types de variables aléatoires rapidement à l'aid de vba ou dois-je passer par les propriétés basiques de ces lois ne fait appel à la base, qu'a la loi uniforme sur 0,1 ? (Exemple: loi gamma et une somme de loi exponentielle, la loi exponentielle est liée a la loi de poisson (processus poissonien), la loi de poisson est liée a la loi binomiale jusqu'a arriver à la loi uniforme sur 0,1 )

Je ne sais pas si c'est vraiment clair ce que je demande ?

Cordialement,

Idriss
 
Re : Remplir matrice/vecteur

Enfin moi j'étudierais ces lois ne serait-ce qu'en vue de les connaitre si ça m'intéressait et en vue de me les calculer. D'autre lois que la normale sont plus faciles à inverser et un système analogue à ce que vous aviez prévu convient. J'utilise volontiers des truc comme ça dans ce genre :
VB:
Function DistrATH(ByVal Rnd0à1 As Double, ByVal Moyenne As Double, ByVal ÉcartMoitié As Double) As Double
Const Inv2ATanH½ = 191646774 / 210545501
Dim RndDispersé As Double: RndDispersé = Log(Rnd0à1 / (1 - Rnd0à1)) * Inv2ATanH½ ' = ATanH(2*Rnd0à1-1) / AtanH(0.5)
DistrATH = RndDispersé * ÉcartMoitié + Moyenne            ' Transformée de Fisher :  ATanH(x)=ln((1+x)/(1-x))/2
' ÉcartMoitié : Fourchette en + et - de la moyenne contenant statitistiquement la moitié des nombres à engendrer.
End Function
'

Function DistrQsN(ByVal Rnd0à1 As Double, ByVal Moyenne As Double, ByVal ÉcartType As Double) As Double
Rem. Distribution quasi normale à part que le nombre engendré ne fuira la moyenne de plus de 4 fois l'écart type
DistrQsN = (Rnd0à1 ^ 0.18148 - (1 - Rnd0à1) ^ 0.18148) * 4 * ÉcartType + Moyenne
End Function
Si de plus ça fait partie d'une famille de calculs que voulez programmer tous de façons semblable, alors évidemment …
Mais bon j'ai un peu regardé le thème sur internet. Je n'y ai pas compris grand chose, mais il y est question de mouvement brownien. Il ne me semble pas, d'une part que ce soit ce que vous calculez, avec votre méthode ou la mienne, ni d'autre part qu'un tel mouvement obéisse à une autre loi.
 
Re : Remplir matrice/vecteur

Merci à vous, non je ne calcule pas de mouvement browien (je n'ai pas eu de problème avec cela pour le moment, un mouvement brownien suit une loi normale dont la variance varie avec le temps)

Afin de faire certaines simulation de lois, j'ai besoin d'introduire une fonction indicatrice du type :

Ind(x,k)=1 si (x>=f(k) et x< g(k))
Ind(x,k)=0 sinon

j'ai écris ceci :

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

Mon erreur est surement dans l'utilisation de if else ... je n'ai rein trouvé sur internet expliquant un tel cas.

Merci et bonne fin d'après-midi à vous.

Cordialement,

Idriss
 
Re : Remplir matrice/vecteur

Oui elle ne fonctionne pas.
La fonction P je l'ai créée de cette manière:

Function P(k as integer, lambda as double) as double

Dim i as integer
Dim q as double
q = exp(-lambda)

For i = 1 to k
q = q + (exp(-lamba)*lambda^i)/(factoriel(i)
Next i

P=q
End function

j'ai créé avant la fonction factoriel qui marche, la fonction p marche aussi.

Un seul probleme pour ma fonction P, a partir d'un certain rang k, elle ne revoie plus de valeur. P est une suite en fonction de k qui converge vers 1 ( fonction de répartition de la loi de Poisson )

Cordialement,

Idriss
 
Re : Remplir matrice/vecteur

Bonjour.

Déclarez la comme ça :
VB:
Function P(ByVal K As Long, ByVal Lambda As Double) As Double
et mettez partout Long au lieu de Integer, voire Double si ça peut dépasser 2147483647.
Un Integer est codé sur 2 octets soit 16 bits dont un pour le signe, et ne va pas au delà de 32767 soit 2 ^15 -1.
 
Re : Remplir matrice/vecteur

Merci, toutefois pour lambda=2, k ne peut dépasser 12.
voici ce que j'ai ecris:

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


merci
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

  • Question Question
Microsoft 365 Formule Excel
Réponses
4
Affichages
263
Réponses
3
Affichages
721
  • Question Question
Microsoft 365 Mise en barre
Réponses
2
Affichages
679
Retour