OVH Cloud OVH Cloud

Produit terme a terme de vecteurs en VBA

2 réponses
Avatar
Antoine
Bonjour a tous,

je tiens d'abord a remercier tous ceux qui m'ont repondu
pour mes precedentes questions. Peut-etre que celle ci est
legerement hors-sujet alors pardonnez moi d'avance.

Sous excel, j'arrive a resoudre un systeme Ax=b, c'est
assez simple ^^. De plus je pondere cette solution par les
termes d'un autre vecteur colonne c. Donc j'obtiens x_i =
(Inv(A)*b)_i * c_i ou "_i" designe le i eme terme du
vecteur. Maintenant j'aimerais automatiser tout cela au
sein d'une macro VBA... et bien sur c'est la que tout
plante....
J'ai ecris ceci en VBA :

Function LinEq(A, b, c)

LinEq = Application.WorksheetFunction.MMult
(Application.WorksheetFunction.MInverse
(Application.WorksheetFunction.Transpose(A)), b) * c

End Function

et tout se passe bien jusqu'a la multiplication terme a
terme entre (Inverse A)*b d'un cote et c de l'autre.

Je suis sur qu'il existe une reponse passe partout , mais
la je ne vois pas :(

Antoine

2 réponses

Avatar
garnote
Bonsoir Antoine,

Pour résoudre des systèmes d'équations linéaires
pour lesquels on peut utiliser une matrice inverse, tu pourrais
essayer cette fonction :

Function sel(ici As Range, la As Range)
mi = Application.WorksheetFunction.MInverse(ici)
s = Application.WorksheetFunction.MMult(mi, la)
sel = s
End Function

Exemple : Résoudre le système suivant : 2x+3y=5, x+y=2

A B C D
2 3 5
1 1 2

1. Je sélectionne D1:D2
2. J'entre la fonction =sel(A1:B2;C1:C2)
3. Je valide la fonction par Ctrl+Maj+Entrée.

Qu'en penses-tu ?

Serge



"Antoine" a écrit dans le message de news:

Bonjour a tous,

je tiens d'abord a remercier tous ceux qui m'ont repondu
pour mes precedentes questions. Peut-etre que celle ci est
legerement hors-sujet alors pardonnez moi d'avance.

Sous excel, j'arrive a resoudre un systeme Ax=b, c'est
assez simple ^^. De plus je pondere cette solution par les
termes d'un autre vecteur colonne c. Donc j'obtiens x_i > (Inv(A)*b)_i * c_i ou "_i" designe le i eme terme du
vecteur. Maintenant j'aimerais automatiser tout cela au
sein d'une macro VBA... et bien sur c'est la que tout
plante....
J'ai ecris ceci en VBA :

Function LinEq(A, b, c)

LinEq = Application.WorksheetFunction.MMult
(Application.WorksheetFunction.MInverse
(Application.WorksheetFunction.Transpose(A)), b) * c

End Function

et tout se passe bien jusqu'a la multiplication terme a
terme entre (Inverse A)*b d'un cote et c de l'autre.

Je suis sur qu'il existe une reponse passe partout , mais
la je ne vois pas :(

Antoine






Avatar
garnote
Salut Antoine,

Et tant qu'à être dans les vecteurs, voici une fonction
personnalisée permettant d'obtenir le produit
vectoriel de deux vecteurs.

Function pv(uv As Range)
i = uv(1, 2) * uv(2, 3) - uv(2, 2) * uv(1, 3)
j = uv(1, 3) * uv(2, 1) - uv(1, 1) * uv(2, 3)
k = uv(1, 1) * uv(2, 2) - uv(2, 1) * uv(1, 2)
pv = Array(i, j, k)
End Function

Un exemple : Évaluer (1,2,1) X ( 5,6,8).
1. Jécris les composantes du premier vecteur
dans A1:C1 et celles du deuxième dans
A2:C2

A B C
1 2 1
5 6 8

2. Je sélectionne trois cellules adjacentes
sur une même ligne et entre la fonction
=pv(A1:C2)

3. Je valide par Ctrl+Maj+Entrée


Serge





"Antoine" a écrit dans le message de news:

Bonsoir Serge,

en fqit problème est que je n'arrive pas à faire une multiplication
terme à terme de vecteurs sous VBA. Sous Excel on peut faire un truc du
genre B1:B3*C1:C3 et on obtient le résultat escompté. Mais sous VBA??? Par
exemple :
V = (1,2,3,4)
W=(2,3,4,5)

j'aimerais faire une fonction qui me renvoie
X=(2,6,12,20)
c'est a dire X_i = V_i * W_i ou "_i" désigne le ième élément du vecteur.
Cela doit être possible en faisant une boucle sur tous les éléments des
vecteurs, mais je pense qu'il doit exister un opérateur prédéfini dans VBA
qui me renvoie ce résultat. Si, oui... euh lequel?

Antoine




"garnote" a écrit dans le message de
news:kbmNa.16466$
Plus simple d'utilisation et valable pour
pour tout système d'équations linéaires
pour lequel on peut utiliser la méthode de la
matrice inverse.

A B C D E F
4 3 5 1 4
4 1 2 5 5
2 2 3 2 22
1 2 3 4 5

Système : 4x + 3y + 5z + t = 4, 4x + y + 2z + 5t = 5, ...

Function sel(ici As Range)
nl = ici.Rows.Count
nc = ici.Columns.Count
Set m1 = Range(ici.Cells(1, 1), ici.Cells(nl, nc - 1))
Set m2 = Range(ici.Cells(1, nc), ici.Cells(nl, nc))
mi = Application.WorksheetFunction.MInverse(m1)
s = Application.WorksheetFunction.MMult(mi, m2)
sel = s
End Function

1. Je sélectionne F1:F4 ,
2. J'entre la fonction =sel(A1:E4) ,
3. Je valide la fonction par Ctrl+Maj+Entrée.

Serge


"garnote" a écrit dans le message de news:
pvlNa.16461$
Bonsoir Antoine,

Pour résoudre des systèmes d'équations linéaires
pour lesquels on peut utiliser une matrice inverse, tu pourrais
essayer cette fonction :

Function sel(ici As Range, la As Range)
mi = Application.WorksheetFunction.MInverse(ici)
s = Application.WorksheetFunction.MMult(mi, la)
sel = s
End Function

Exemple : Résoudre le système suivant : 2x+3y=5, x+y=2

A B C D
2 3 5
1 1 2

1. Je sélectionne D1:D2
2. J'entre la fonction =sel(A1:B2;C1:C2)
3. Je valide la fonction par Ctrl+Maj+Entrée.

Qu'en penses-tu ?

Serge



"Antoine" a écrit dans le message de
news:




Bonjour a tous,

je tiens d'abord a remercier tous ceux qui m'ont repondu
pour mes precedentes questions. Peut-etre que celle ci est
legerement hors-sujet alors pardonnez moi d'avance.

Sous excel, j'arrive a resoudre un systeme Ax=b, c'est
assez simple ^^. De plus je pondere cette solution par les
termes d'un autre vecteur colonne c. Donc j'obtiens x_i > > > > (Inv(A)*b)_i * c_i ou "_i" designe le i eme terme du
vecteur. Maintenant j'aimerais automatiser tout cela au
sein d'une macro VBA... et bien sur c'est la que tout
plante....
J'ai ecris ceci en VBA :

Function LinEq(A, b, c)

LinEq = Application.WorksheetFunction.MMult
(Application.WorksheetFunction.MInverse
(Application.WorksheetFunction.Transpose(A)), b) * c

End Function

et tout se passe bien jusqu'a la multiplication terme a
terme entre (Inverse A)*b d'un cote et c de l'autre.

Je suis sur qu'il existe une reponse passe partout , mais
la je ne vois pas :(

Antoine