Colaboración de Harvey Triana (2)

Rutina para la Solución de Ecuaciones Lineales

Lo que nos dice el autor sobre esta rutina:

Solución de Ecuaciones Lineales
======================
La solución de un sistema de 'n' ecuaciones lineales con 'n' incógnitas es un interesante reto a los programadores.
El siguiente código lo escribí inicialmente en Fortran, aquí te presento la versión Visual Basic.
He utilizado esta función en programación de Simuladores de Flujo y Solución del Método de los Mínimos Cuadrados.
En general, la función tiene múltiples usos en procedimientos matemáticos.

Es un código bastante complicado de seguir, pero si necesitas una guía, es el método de Eliminación de Gauss.

'Esto acelerará los cálculos
DefInt A-Z
Private Sub EjemploSencillo()
   
   'Se tiene el siguiente sistema de ecuaciones lineales que debe ser resuelto:
   '|1 1 1 6|
   '|1 0 1 4|
   '|1 1 0 3|

    Dim Sistema(1 To 3, 1 To 4) As Double 'Almacenará el sistema de ecuaciones
    Dim Solución(1 To 3) As Double        'Almacenará la solución del sistema
    
    Sistema(1, 1) = 1: Sistema(1, 2) = 1: Sistema(1, 3) = 1: Sistema(1, 4) = 6
    Sistema(2, 1) = 1: Sistema(2, 2) = 0: Sistema(2, 3) = 1: Sistema(2, 4) = 4
    Sistema(3, 1) = 1: Sistema(3, 2) = 1: Sistema(3, 3) = 0: Sistema(3, 4) = 3
    
    If Gauss(Sistema(), Solución()) Then
       Debug.Print "Solución:"
       Debug.Print "C1 = "; Solución(1)
       Debug.Print "C2 = "; Solución(2)
       Debug.Print "C3 = "; Solución(3)
       Stop
    Else
       MsgBox "El sistema de ecuaciones no tiene solución..."
    End If
End Sub


'-------------------------------------------------------------------------
'Matrix Solution. Return True if then function was successful
'-------------------------------------------------------------------------
Static Function Gauss(ByRef A() As Double, ByRef C() As Double) As Boolean
   
    Dim Tem As Double, Sum As Double, i, l, j, k, n, m
    
    On Error GoTo Gauss_Err
    n = UBound(C)
    m = n + 1
    For l = 1 To n - 1
        j = l
        For k = l + 1 To n
            If (Abs(A(j, l)) < Abs(A(k, l))) Then j = k
        Next
        If Not (j = l) Then
           For i = 1 To m
               Tem = A(l, i)
               A(l, i) = A(j, i)
               A(j, i) = Tem
           Next
        End If
        For j = l + 1 To n
            Tem = A(j, l) / A(l, l)
            For i = 1 To m
                A(j, i) = A(j, i) - Tem * A(l, i)
            Next
        Next
    Next
    C(n) = A(n, m) / A(n, n)
    For i = 1 To n - 1
        j = n - i
        Sum = 0
        For l = 1 To i
            k = j + l
            Sum = Sum + A(j, k) * C(k)
        Next
        C(j) = (A(j, m) - Sum) / A(j, j)
    Next
    Gauss = True
    
   'Programmed by Harvey Triana ©
    Exit Function
    
Gauss_Err: Gauss = False
End Function