Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Metodo Gauss Seidel
1. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
METODO MMMEEETTTOOODDDOOO DDDDEEEE GGGGAAAAUUUUSSSSSSSS SSSSEEEEIIIIDDDDEEEELLLL
UUUUNNNNIIIIVVVVEEEERRRRSSSSIIIIDDDDAAAADDDD SSSSAAAANNNN MMMMAAAARRRRTTTTIIIINNNN
IIIINNNNGGGGEEEENNNNIIIIEEEERRRRIIIIAAAA DDDDEEEE SSSSIIIISSSSTTTTEEEEMMMMAAAASSSS
MMMMEEEETTTTOOOODDDDOOOOSSSS NNNNUUUUMMMMEEEERRRRIIIICCCCOOOOSSSS
2222000011114444
2. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
METODO MMMEEETTTOOODDDOOO DDDDEEEE GGGGAAAAUUUUSSSSSSSS SSSSEEEEIIIIDDDDEEEELLLL
En análisis numérico el método de Gauss-Seidel es un método iterativo utilizado para
resolver sistemas de ecuaciones lineales. El método se llama así en honor a los matemáticos
alemanes Carl Friedrich Gauss y Philipp Ludwig von Seidel y es similar al método de
Jacobi.
Aunque este método puede aplicarse a cualquier sistema de ecuaciones lineales que
produzca una matriz (cuadrada, naturalmente pues para que exista solución única, el
sistema debe tener tantas ecuaciones como incógnitas).
Iremos realizando un ejemplo práctico para lograr su mejor comprensión:
Ecuaciones Originales:
a) 3x1 – 0,2x2 – 0,5x3 = 8
b) 0,1x1 + 7x2 + 0,4x3 = -19,5
c) 0,4x1 + 0,1x2 + 10x3 = 72,4
El método de Gauss-Seidel nos dice que en primera instancia debemos despejar la variable
x1 de la ecuación a, la variable x2 de la ecuación b y la variable x3 de la ecuación c, para
hallar los valores aproximados de cada variable en las diferentes iteraciones.
Ecuaciones Despejadas
a) x1 = (0,2x2 + 0,5x3 + 8) / 3
b) x2 = (-0,1x1 - 0,4x3 -19,5) / 7
c) x3 = (-0,4x1 - 0,1x2 + 72,4) / 10
3. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
Iteración Principal
Una vez contamos con las 3 ecuaciones debidamente despejadas procederemos a hallar los
valores iniciales (Iteración No. 1) de las variables x1, x2 y x3:
a) En la ecuación a donde tenemos despejada la variable x1, vamos a asignarle valores
iniciales a x2=0 y x3=0, hallando de esta forma el valor de x1.
x1 = (0,2*(0) + 0,5*(0) + 8) / 3 donde x1 =2,6667
b) Teniendo el valor de x1, vamos a reemplazar su valor en el ecuación b donde
tenemos despejada la variable x2 y le asignamos valor inicial a x3=0, hallando de
esta forma el valor de x2
x2 = (-0,1*(2,6667) - 0,4*(0) -19,5) / 7 donde x2 =-2,8238
c) Con el valor de x1 encontrado en el literal a y el valor de x2 encontrado en el literal
b, reemplazamos en la ecuación c donde tenemos despejada la variable x3 y
hallamos su valor
x3 = (-0,4*(2,6667) - 0,1*(-2,8238) + 72,4) / 10 donde x3 = 7,1615
Iteraciones Subsiguientes
Una vez contamos con los resultados iniciales para x1 (2,6667), x2 (-2,8238) y x3 (7,1615)
procederemos a hallar los valores para las iteraciones subsiguientes (Iteración No. 2) de las
variables x1, x2 y x3:
a) En la ecuación a donde tenemos despejada la variable x1, vamos a asignarle a x2 y x3
los valores encontrados en la Iteración 1, hallando de esta forma el valor de x1.
x1 = (0,2*(-2,8238) + 0,5*(7,1615) + 8) / 3 donde x1 =3,672
b) Teniendo el valor de x1 de la segunda iteración, vamos a reemplazar su valor en el
ecuación b donde tenemos despejada la variable x2 y le asignamos a x3 el valor
encontrado en la Iteración 1, hallando de esta forma el valor de x2
x2 = (-0,1*(3,672) - 0,4*(7,1615) -19,5) / 7 donde x2 =-3,2474
4. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
c) Con el valor de x1 y x2 encontrado en el literal a y b de la Iteración No. 2,
reemplazamos en la ecuación c donde tenemos despejada la variable x3 y hallamos
su valor
x3 = (-0,4*(3,672) - 0,1*(-3,2474) + 72,4) / 10 donde x3 = 7,1256
De esta forma tenemos los siguientes resultados para las primeras dos iteraciones:
x1 x2 x3
Iteración No 1 2,6667 -2,8238 7,1615
Iteración No 2 3,672 -3,2474 7,1256
Y con los cuales calcularemos el porcentaje de error para cada una de las variables, usando
la siguiente fórmula:
Ea = | [(Vf - Vi) / Vf ] * 100 |
Donde Vf hace referencia al valor de x1, x2 ó x3 de la Iteración No 2 respectivamente y Vi al
valor de x1, x2 ó x3 de la Iteración No 1:
Ea1 = | [(3,672 – 2,6667) / 3,672] * 100 | => Ea1 = 27,38%
Ea2 = | [(-3,2474 – (-2,8238)) / -3,2474] * 100 | => Ea2 = 13,04%
Ea3 = | [(7,1256 – 7,1615) / 7,1256] * 100 | => Ea3 = -0,50%
Si el porcentaje de error de cualquiera de las 3 variables es superior a 1% se debe calcular
una 3ra Iteración, tomando como referencia los valores de x1, x2 y x3 de la Iteración 2; que
en el caso práctico de este ejercicio sería:
a) En la ecuación a donde tenemos despejada la variable x1, vamos a asignarle a x2 y x3
los valores encontrados en la Iteración 2, hallando de esta forma el valor de x1.
x1 = (0,2*(-3,2474) + 0,5*(7,1256) + 8) / 3 donde x1 =3,6377
5. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
b) Teniendo el valor de x1 de la tercera iteración, vamos a reemplazar su valor en el
ecuación b donde tenemos despejada la variable x2 y le asignamos a x3 el valor
encontrado en la Iteración 2, hallando de esta forma el valor de x2
x2 = (-0,1*(3,6377) - 0,4*(7,1256) -19,5) / 7 donde x2 =-3,2448
c) Con el valor de x1 y x2 encontrado en el literal a y b de la Iteración No. 3,
reemplazamos en la ecuación c donde tenemos despejada la variable x3 y hallamos
su valor
x3 = (-0,4*(3,6377) - 0,1*(-3,2448) + 72,4) / 10 donde x3 = 7,1269
De esta forma tenemos los siguientes resultados para las primeras tres iteraciones:
x1 x2 x3
Iteración No 1 2,6667 -2,8238 7,1615
Iteración No 2 3,672 -3,2474 7,1256
Iteración No 3 3,6377 -3,2448 7,1269
Y con los cuales calcularemos el porcentaje de error para cada una de las variables, pero
esta vez con los resultados de las Iteraciones No. 2 y 3:
Ea = | [(Vf - Vi) / Vf ] * 100 |,
Donde Vf hace referencia al valor de x1, x2 ó x3 de la Iteración No 3 respectivamente y Vi al
valor de x1, x2 ó x3 de la Iteración No 2:
Ea1 = | [(3,6377 – 3,672) / 3,6377] * 100 | => Ea1 = -0,94%
Ea2 = | [(-3,2448 – (-3,2474)) / -3,2448] * 100 | => Ea2 = -0,07%
Ea3 = | [(7,1269 – 7,1256) / 7,1269] * 100 | => Ea3 = 0,01%
Como podemos observar los porcentajes de error en este punto son menores a 1% por lo
que podemos deducir que los valores más óptimos de las variables x1, x2 y x3 son los de la
6. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
Iteración No 3. Si alguno de los 3 porcentajes de error hubiese sido mayor a 1% deberíamos
calcular una nueva iteración y hacer el mismo proceso iterativo.
Con el objetivo de sistematizar este procedimiento para ecuaciones lineales de 3x3 hemos
diseñado un sistema desarrollado en Visual Basic que implementa este método y el cuál
explicaremos con el mismo ejemplo literal planteado durante este documento.
Interfaz inicial del sistema:
Al costado izquierdo de la ventana, en la sección de “Ecuaciones Originales” introducimos
las constantes de las variables para cada una de las ecuaciones. Inicialmente el sistema
validará que ninguno de los valores sea 0, en caso de encontrar alguno y dar clic en el botón
Despejar, generará un mensaje de alerta como el siguiente:
7. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
De lo contrario el sistema automáticamente despejara las variables x1, x2 y x3 para cada una
de las ecuaciones y nos las mostrará al costado derecho en la sección “Ecuaciones
Despejadas”, como se ve muestra a continuación, activando a su vez el botón calcular para
iniciar el proceso iterativo:
Al dar clic en el Botón Calcular se inicia el proceso iterativo y cálculo de los valores para
x1, x2 y x3 en las diferentes iteraciones con su respectivo porcentaje de error, así como se
muestra en las siguientes imágenes:
8. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
Iteración 1 y 2
Iteración 2 y 3
9. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
Como el sistema detecta que el porcentaje de error para las 3 variables es menor a 1%
muestra el mensaje con los valores óptimos.
CÓDIGO FUENTE DEL PROGRAMA:
--------------------------------------------------------------------------------------------------------------
Dim X1I1 As Single, X2I1 As Single, X3I1 As Single, X1I2 As Single, X2I2 As Single
Dim X3I2 As Single, Ea1 As Single, Ea2 As Single, Ea3 As Single
--------------------------------------------------------------------------------------------------------------
Private Sub Calcular_Click()
cont = 1
X2 = 0
X3 = 0
X1I1 = (X2 + X3 + Const1.Text) / ValEc1X1.Text
X2I1 = ((ValEc2X1.Text * X1I1) + 0 + Const2.Text) / ValEc2X2.Text
X3I1 = ((ValEc3X1.Text * X1I1) + (ValEc3X2.Text * X2I1) + Const3.Text) /
ValEc3X3.Text
X1I2 = ((ValEc1X2.Text * X2I1) + (ValEc1X3.Text * X3I1) + Const1.Text) /
ValEc1X1.Text
X2I2 = ((ValEc2X1.Text * X1I2) + (ValEc2X3.Text * X3I1) + Const2.Text) /
ValEc2X2.Text
X3I2 = ((ValEc3X1.Text * X1I2) + (ValEc3X2.Text * X2I2) + Const3.Text) /
ValEc3X3.Text
If (X1I1 < 0) Then
VAbX1I1 = X1I1 * -1
10. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
Else: VAbX1I1 = X1I1
End If
If (X2I1 < 0) Then
VAbX2I1 = X2I1 * -1
Else: VAbX2I1 = X2I1
End If
If (X3I1 < 0) Then
VAbX3I1 = X3I1 * -1
Else: VAbX3I1 = X3I1
End If
If (X1I2 < 0) Then
VAbX1I2 = X1I2 * -1
Else: VAbX1I2 = X1I2
End If
If (X2I2 < 0) Then
VAbX2I2 = X2I2 * -1
Else: VAbX2I2 = X2I2
End If
If (X3I2 < 0) Then
VAbX3I2 = X3I2 * -1
Else: VAbX3I2 = X3I2
End If
Ea1 = ((VAbX1I2 - VAbX1I1) / VAbX1I2) * 100
Ea2 = ((VAbX2I2 - VAbX2I1) / VAbX2I2) * 100
Ea3 = ((VAbX3I2 - VAbX3I1) / VAbX3I2) * 100
MsgBox "Iteracion No. " & cont & vbNewLine & "X1 =" & X1I1 & vbNewLine & "X2 ="
& X2I1 & vbNewLine & "X3 =" & X3I1 & vbNewLine & vbNewLine & "Iteracion No. "
& cont + 1 & vbNewLine & "X1 =" & X1I2 & vbNewLine & "X2 =" & X2I2 &
vbNewLine & "X3 =" & X3I2 & vbNewLine & vbNewLine & "Porcentajes de error:" &
vbNewLine & vbNewLine & "Ea1 =" & Ea1 & "%" & vbNewLine & "Ea2 =" & Ea2 &
"%" & vbNewLine & "Ea3 =" & Ea3 & "%", , "Resultados Iteracion"
Do While Ea1 > 1 Or Ea2 > 1 Or Ea3 > 1
Ea1 = 0
Ea2 = 0
Ea3 = 0
cont = cont + 1
X1I1 = X1I2
X2I1 = X2I2
X3I1 = X3I2
11. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
X1I2 = ((ValEc1X2.Text * X2I1) + (ValEc1X3.Text * X3I1) + Const1.Text) /
ValEc1X1.Text
X2I2 = ((ValEc2X1.Text * X1I2) + (ValEc2X3.Text * X3I1) + Const2.Text) /
ValEc2X2.Text
X3I2 = ((ValEc3X1.Text * X1I2) + (ValEc3X2.Text * X2I2) + Const3.Text) /
ValEc3X3.Text
If (X1I1 < 0) Then
VAbX1I1 = X1I1 * -1
Else: VAbX1I1 = X1I1
End If
If (X2I1 < 0) Then
VAbX2I1 = X2I1 * -1
Else: VAbX2I1 = X2I1
End If
If (X3I1 < 0) Then
VAbX3I1 = X3I1 * -1
Else: VAbX3I1 = X3I1
End If
If (X1I2 < 0) Then
VAbX1I2 = X1I2 * -1
Else: VAbX1I2 = X1I2
End If
If (X2I2 < 0) Then
VAbX2I2 = X2I2 * -1
Else: VAbX2I2 = X2I2
End If
If (X3I2 < 0) Then
VAbX3I2 = X3I2 * -1
Else: VAbX3I2 = X3I2
End If
Ea1 = ((VAbX1I2 - VAbX1I1) / VAbX1I2) * 100
Ea2 = ((VAbX2I2 - VAbX2I1) / VAbX2I2) * 100
Ea3 = ((VAbX3I2 - VAbX3I1) / VAbX3I2) * 100
MsgBox "Iteracion No. " & cont & vbNewLine & "X1 =" & X1I1 & vbNewLine & "X2 ="
& X2I1 & vbNewLine & "X3 =" & X3I1 & vbNewLine & vbNewLine & "Iteracion No. "
& cont + 1 & vbNewLine & "X1 =" & X1I2 & vbNewLine & "X2 =" & X2I2 &
vbNewLine & "X3 =" & X3I2 & vbNewLine & vbNewLine & "Porcentajes de error:" &
vbNewLine & vbNewLine & "Ea1 =" & Ea1 & "%" & vbNewLine & "Ea2 =" & Ea2 &
"%" & vbNewLine & "Ea3 =" & Ea3 & "%", , "Resultados Iteracion"
Loop
12. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
MsgBox "Los valores más óptimos con un porcentaje de error menor a 1% son:" &
vbNewLine & vbNewLine & "X1 =" & X1I2 & vbNewLine & "X2 =" & X2I2 &
vbNewLine & "X3 =" & X3I2, , "Valores Optimos"
Calcular.Enabled = False
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub C1_GotFocus()
C1 = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub C1_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub C2_GotFocus()
C2 = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub C2_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub C3_GotFocus()
C3 = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub C3_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Despejar_Click()
If (Ec1X1.Text = "") Then Ec1X1.Text = 0
If (Ec1X2.Text = "") Then Ec1X2.Text = 0
If (Ec1X3.Text = "") Then Ec1X3.Text = 0
If (Ec2X1.Text = "") Then Ec2X1.Text = 0
If (Ec2X2.Text = "") Then Ec2X2.Text = 0
If (Ec2X3.Text = "") Then Ec2X3.Text = 0
If (Ec3X1.Text = "") Then Ec3X1.Text = 0
If (Ec3X2.Text = "") Then Ec3X2.Text = 0
13. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
If (Ec3X3.Text = "") Then Ec3X3.Text = 0
If (C1.Text = "") Then C1.Text = 0
If (C2.Text = "") Then C2.Text = 0
If (C3.Text = "") Then C3.Text = 0
ValEc1X1 = Ec1X1
ValEc1X2 = Ec1X2 * -1
ValEc1X3 = Ec1X3 * -1
Const1 = C1
ValEc2X1 = Ec2X1 * -1
ValEc2X2 = Ec2X2
ValEc2X3 = Ec2X3 * -1
Const2 = C2
ValEc3X1 = Ec3X1 * -1
ValEc3X2 = Ec3X2 * -1
ValEc3X3 = Ec3X3
Const3 = C3
If (Ec1X1.Text = 0 Or Ec1X2.Text = 0 Or Ec1X3.Text = 0 Or Ec2X1.Text = 0 Or
Ec2X2.Text = 0 Or Ec2X3.Text = 0 Or Ec3X1.Text = 0 Or Ec3X2.Text = 0 Or Ec3X3.Text
= 0 Or C1.Text = 0 Or C2.Text = 0 Or C3.Text = 0) Then
MsgBox "Verifique los valores introducidos:" & vbNewLine & "No se puede operar con
valores en 0", , "Alerta"
Else
Calcular.Enabled = True
End If
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Limpiar_Click()
Ec1X1.Text = 0
Ec1X2.Text = 0
Ec1X3.Text = 0
Ec2X1.Text = 0
Ec2X2.Text = 0
Ec2X3.Text = 0
Ec3X1.Text = 0
Ec3X2.Text = 0
Ec3X3.Text = 0
C1.Text = 0
C2.Text = 0
14. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
C3.Text = 0
ValEc1X1.Text = 0
ValEc1X2.Text = 0
ValEc1X3.Text = 0
ValEc2X1.Text = 0
ValEc2X2.Text = 0
ValEc2X3.Text = 0
ValEc3X1.Text = 0
ValEc3X2.Text = 0
ValEc3X3.Text = 0
Const1.Text = 0
Const2.Text = 0
Const3.Text = 0
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec1X1_GotFocus()
Ec1X1.Text = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec1X1_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec1X2_GotFocus()
Ec1X2.Text = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec1X2_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Public Function Numeros(Tecla As Integer) As Integer
Dim strValido As String
strValido = "0123456789,-"
If Tecla > 26 Then
If InStr(strValido, Chr(Tecla)) = 0 Then
Tecla = 0
End If
End If
Numeros = Tecla
End Function
--------------------------------------------------------------------------------------------------------------
15. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
Private Sub Ec1X3_GotFocus()
Ec1X3.Text = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec1X3_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec2X1_GotFocus()
Ec2X1.Text = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec2X1_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec2X2_GotFocus()
Ec2X2.Text = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec2X2_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec2X3_GotFocus()
Ec2X3.Text = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec2X3_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec3X1_GotFocus()
Ec3X1.Text = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec3X1_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec3X2_GotFocus()
Ec3X2.Text = ""
End Sub
--------------------------------------------------------------------------------------------------------------
16. UNIVERSIDAD SAN MARTÍN
Ingeniería de Sistemas - Distancia
METODOS NUMERICOS
Private Sub Ec3X2_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec3X3_GotFocus()
Ec3X3.Text = ""
End Sub
--------------------------------------------------------------------------------------------------------------
Private Sub Ec3X3_KeyPress(KeyAscii As Integer)
KeyAscii = Numeros(KeyAscii)
End Sub