Professional Documents
Culture Documents
Dim n As Integer
Dim EsSingular As Boolean
Dim a() As Double
Dim b() As Double
Dim x() As Double
Function EliminacionGauss_X_n×1(A_n×n As Range, b_n×1 As Range) As Double()
Dim i As Integer
Dim j As Integer
':::::::::::::: Manejo datos de entrada ::::::::::::::
n = b_n×1.Count
ReDim a(1 To n, 1 To n) As Double
ReDim b(1 To n) As Double
For i = 1 To n
For j = 1 To n
a(i, j) = A_n×n(i, j).Value
b(i) = b_n×1(i).Value
Next j
Next i
':::::::::::::: Ciclo principal Eliminación Gaussiana ::::::::::::::
Call Gauss(a, b)
':::::::::::::: Salida de resultado ::::::::::::::
EliminacionGauss_X_n×1 = x
End Function
Tolerancia = 0.00000000000001
EsSingular = False
For i = 1 To n
s(i) = Abs(a(i, 1)) 'Guarda la mayor magnitud de los elementos de 'a' en
cada fila 'i' en s(i) para normalizar los elementos
For j = 2 To n
If Abs(a(i, j)) > s(i) Then s(i) = Abs(a(i, j))
Next j
Next i
':::::::::::::: Inicio: Eliminación hacia adelante ::::::::::::::
For k = 1 To n - 1
':::::::::::::: Inicio: Pivoteo ::::::::::::::
pivote = k
mayor = Abs(a(k, k) / s(k))
For ii = k + 1 To n
temporal = Abs(a(ii, k) / s(ii))
If temporal > mayor Then
mayor = temporal
pivote = ii
End If
Next ii
If pivote <> k Then
For jj = k To n
temporal = a(pivote, jj)
a(pivote, jj) = a(k, jj)
a(k, jj) = temporal
Next jj
temporal = b(pivote)
b(pivote) = b(k)
b(k) = temporal
temporal = s(pivote)
s(pivote) = s(k)
s(k) = temporal
End If
':::::::::::::: Fin: Pivoteo ::::::::::::::
If Abs(a(k, k) / s(k)) < Tolerancia Then 'Revisa si es quasi-singular
EsSingular = True
Exit For 'k
End If
For i = k + 1 To n
factor = a(i, k) / a(k, k)
For j = k + 1 To n
a(i, j) = a(i, j) - factor * a(k, j)
Next j
b(i) = b(i) - factor * b(k)
Next i
Next k
If Abs(a(k, k) / s(k)) < Tolerancia Then EsSingular = True
':::::::::::::: Fin: Eliminación hacia adelante ::::::::::::::
If EsSingular = False Then
':::::::::::::: Inicio: Sustitución hacia atrás ::::::::::::::
x(n, 1) = b(n) / a(n, n)
For i = n - 1 To 1 Step -1
suma = 0
For j = i + 1 To n
suma = suma + a(i, j) * x(j, 1)
Next j
x(i, 1) = (b(i) - suma) / a(i, i)
Next i
':::::::::::::: Fin: Sustitución hacia atrás ::::::::::::::
End If
End Sub