lunes, 12 de diciembre de 2011

Invertir Matrices a través de VBA

Podemos calcular una matriz de 2x2 y de 3x3 en VBA con una subrutina a partir de la regla

$$A^{-1}=\dfrac {1} {det\left( A\right) }adj\left( A\right)$$

a continuación se muestran los códigos, para que esta subrutina corra de forma correcta la matriz a invertir debe encontrarse emplazada en el rango de celdas "B3:D5" y los resultados serán desplegados en el rango de celdas "F3:H5" como se muestra en la figura



Private Sub inv3x3()

'invertir una matriz A = [a b;c d]
'recordando que la la inversa de esta matriz es:
'1/det(A).*[d -b;-c a]

Dim A(1 To 2, 1 To 2) As Double

    For i = 1 To 2
    For j = 1 To 2
    
        A(i, j) = Cells(2 + i, 1 + j)
    
    Next j
    Next i

'determinante de la matriz
det = A(1, 1) * A(2, 2) - A(1, 2) * A(2, 1)

'si el determinate de la matriz es 0 => inversa de la matriz no existe
    If det = 0 Then
        MsgBox ("La matriz no es invertible")
        Exit Sub
    End If

'reordenando los terminos y multiplicando por el reciproco del determinate
    Cells(3, 5) = det ^ -1 * A(2, 2)
    Cells(3, 6) = det ^ -1 * -A(1, 2)
    Cells(4, 5) = det ^ -1 * -A(2, 1)
    Cells(4, 6) = det ^ -1 * A(1, 1)

End Sub


para invertir una matriz de 2x2 se ocupa el siguiente código, para que esta subrutina se ejecute de forma optima la matriz a invertir debe ubicarse en el rango "B3:C4" y los resultados serán arrojados en rango de celdas "E3:F4" como se muestra en la siguiente imagen





Private Sub inv2x2()

'invertir una matriz A = [a b;c d]
'recordando que la la inversa de esta matriz es:
'1/det(A).*[d -b;-c a]

Dim A(1 To 2, 1 To 2) As Double

    For i = 1 To 2
    For j = 1 To 2
    
        A(i, j) = Cells(2 + i, 1 + j)
    
    Next j
    Next i

'determinante de la matriz
det = A(1, 1) * A(2, 2) - A(1, 2) * A(2, 1)

'si el determinate de la matriz es 0 => inversa de la matriz no existe
    If det = 0 Then
        MsgBox ("La matriz no es invertible")
        Exit Sub
    End If

'reordenando los terminos y multiplicando por el reciproco del determinate
    Cells(3, 5) = det ^ -1 * A(2, 2)
    Cells(3, 6) = det ^ -1 * -A(1, 2)
    Cells(4, 5) = det ^ -1 * -A(2, 1)
    Cells(4, 6) = det ^ -1 * A(1, 1)

End Sub

5 comentarios:

  1. dios mio...
    si lo hubiera hecho a mano, seria mas rapido que con este pseudomacro...

    ResponderEliminar
    Respuestas
    1. si tienes que invertir 1000 matrices es más rápido hacerlo con algún tipo de código que invertirlas a mano, también tengo un código para invertir matrices de n x n, más adelante puede que lo suba.

      saludos

      Eliminar
  2. Una falta de respeto invertir matrices tan simples con semejante código tan maluco :')

    ResponderEliminar
  3. Pero la de tres matrices esta mal :c pusiste la de dos!! D: podrías pasarme mejor la de nxn please!!!!!

    ResponderEliminar