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