2014-05-03 16 views
7

Sto cercando un piccolo aiuto per eseguire alcune matricole matematiche in VBA di Excel. Ho letto un sacco di risposte che suggeriscono di utilizzare il foglio di lavoro di Excel, ma spero di risolverlo nel codice VBA stesso.Matrix Math con VBA (sistema di equazioni lineari)

Sebbene la mia domanda è molto più grande, diciamo Ho un sistema di equazioni lineari che devo risolvere:

x1 + x2 = 8 
2*x1 + 4*x2 = 100 

Questo può essere risolto con la matrice semplice formula A * x = B o x = A^(- 1) * B dove,

A = [1, 1; 2, 4] 
B = [8; 100] 

Se risolvete questo, troverete x1 = -34 e x2 = 42. In termini di matrice, quindi:

X = [-34; 42] 

L'utilizzo dei fogli di lavoro di Excel con le sue funzioni MMULT e MINVERSE lo rende facile e ho ottenuto che funzioni correttamente. Il mio problema è che ho bisogno di fare questo calcolo all'interno di una funzione VBA. Ecco quello che sto cercando:

Dim A(0 To 1, 0 To 1) As Single 
Dim B(0 To 0, 0 To 1) As Single 
Dim X(0 To 0, 0 To 1) As Single 

A(0, 0) = 1 
A(1, 0) = 1 
A(0, 1) = 2 
A(1, 1) = 4 

B(0, 0) = 8 
B(0, 1) = 100 

X = Application.WorksheetFunction.MMult(Application.WorksheetFunction.MInverse(A), B) 

Purtroppo, l'ultima riga produce un "Errore di compilazione: Impossibile assegnare alla serie" messaggio. Penso che sia perché devo specificare ogni elemento dell'array uno alla volta, ma le funzioni del foglio di lavoro sono funzioni di array.

Qualcuno ha qualche idea? Grazie in anticipo per il vostro aiuto!

---------- [EDIT: Risolto] ----------

Con l'aiuto di Cor_Blimey e Jean-François Corbett, ho ottenuto la seguente per completare senza errori (notare le modifiche alle dimensioni di matrice - ero confuso circa se righe o colonne venuto prima):

Dim A(0 To 1, 0 To 1) As Single 
Dim B(0 To 1, 0 To 0) As Single 
Dim X As Variant 

A(0, 0) = 1 
A(0, 1) = 1 
A(1, 0) = 2 
A(1, 1) = 4 

B(0, 0) = 8 
B(1, 0) = 100 

X = Application.WorksheetFunction.MMult(Application.WorksheetFunction.MInverse(A), B) 

'Display outputs in a MsgBox for validation 
MsgBox "x1 = " & X(1, 1) & vbNewLine & "x2 = " & X(2, 1), vbCritical 

Grazie ancora a tutti coloro che mi hanno aiutato qui!

+1

Cerca nella finestra dei locali (se non riesci a vedere, fai clic su Visualizza> Locali, e per andare alla parte destra o passa il codice con F8 o imposta un punto di interruzione) per vedere solo i valori delle variabili prima del msgbox - che ti dirà esattamente cosa X è e come indicizzarlo. Potrebbe essere la matrice restituita da MMult in realtà è una matrice 'vettoriale' (cioè 1 dimensionale) e quindi dovrebbe essere indicizzata come semplicemente X (0) e X (1). –

+1

Ha funzionato! Come riferimento, MMult sembra memorizzare i valori in X (1,1) e X (2,1), il che ha senso: non pensavo solo a controllare la finestra dei locali. Buona pesca! E tu sei il benvenuto nell'algoritmo: l'ho usato sempre in fogli di calcolo Excel, ma non ho mai avuto bisogno di VBA. Grazie ancora! :) –

risposta

8

due cose:

vale la stessa regola come in matematica reali: B devono essere un array verticale di moltiplicazione matriciale sia possibile nel caso. Dichiararlo come

Dim B(0 To 1, 0 To 0) As Single 

e inizializzarlo di conseguenza. Inoltre, basta dichiarare

Dim X As Variant 

dal momento che il MMult restituisce una matrice Variant. Questo è ciò che stava causando il tuo errore originale.

Problemi correlati