You are on page 1of 2

Option Explicit

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

Sub Gauss(a() As Double, b() As Double)


Dim s() As Double
ReDim s(1 To n) As Double 'Guarda la mayor magnitud de los elementos de 'a' en
cada fila
ReDim x(1 To n, 1 To 1) As Double
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim ii As Integer
Dim jj As Integer
Dim pivote As Integer
Dim mayor As Double
Dim temporal As Double
Dim factor As Double
Dim suma As Double
Dim Tolerancia As Double

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

You might also like