sábado, 1 de abril de 2017

Metodo Iterativo Gauss-Seidel en Visual Basic

Un cordial saludo programadores y matemáticos a fin. En esta entrega hacemos mención a la resolución de ecuaciones simultaneas por métodos iterativos y es así que el método de Gauss-Seidel se acopla muy bien como una mejora al método de Jacobi, sin embargo la condicion fundamental  que su diagonal principal debe ser mayor a las demas. Por todo lo expresado aqui presento un poco de teoria tomado de  http://www.jldelafuenteoconnor.es/Clase_itera_2016.pdf  en el cual se expresan algunos métodos más pero para este tema analizaremos solamente el mencionado.







La implementación en visual Basic 2015

Module Module1
    Dim A(500, 500) As Single
    Dim B(500, 500) As Single
    Dim X(500, 500) As Single
    Dim n, iter As Integer
    Dim cError, Tol, sum As Double
    Sub Main()
        Console.BackgroundColor = ConsoleColor.White
        Console.Clear()
        Console.ForegroundColor = ConsoleColor.Black
        Console.Title = "METODO ITERATIVO GAUSS-SEIDEL"
        Console.Write(vbLf) 'Da un enter al titulo
        Console.Write("" & vbTab & "METODO ITERATIVO GAUSS-SEIDEL")
        Console.Write(vbLf)
        Console.Write(vbLf)
        Ingresar()
        Presentar()
        GSEIDEL()

    End Sub
    Sub Ingresar()
        Console.Write("" & vbTab & "Ingrese el orden de la matriz: ", n)
        n = Integer.Parse(Console.ReadLine())
        '--------------------Lectura de la Matriz ---------
        Console.WriteLine("" & vbLf & " * Ingrese los elementos de la matriz A :  " & vbLf & "")

        For i As Integer = 1 To n
            For j As Integer = 1 To n
                Console.Write("" & vbTab & "Elemento [{0},{1}] : ", i, j)
                A(i, j) = Double.Parse(Console.ReadLine())
            Next
        Next
        '-----------------------------Lee el vector columna B------------------------------
        Console.WriteLine("" & vbLf & " * Ingrese los elementos del vector B :  " & vbLf & "")
        For i As Integer = 1 To n
            For j As Integer = 1 To 1
                Console.Write("" & vbTab & "Elemento [{0},{1}] : ", i, 1)
                B(i, 1) = Double.Parse(Console.ReadLine())
            Next
        Next
        ''-----------------------------Tolerancia ------------------------------
        Console.Write("" & vbLf & " * Ingrese la tolerancia : ", Tol)
        Tol = Double.Parse(Console.ReadLine())

        ''-----------------Lee el vector de valor iteraciones--------------------
        Console.Write("" & vbLf & " * Ingrese el número de iteraciones  : ", iter)
        iter = Integer.Parse(Console.ReadLine())
        ''   -----------------------Lee el vector de valores iterativos iniciales----
        Console.WriteLine("" & vbLf & " * Ingrese valores iniciales para iterar :  " & vbLf & "")
        For i As Integer = 1 To n
            Console.Write("" & vbTab & "Elemento [{0},{1}] : ", 1, i)
            X(1, i) = Double.Parse(Console.ReadLine())

        Next
    End Sub
    Sub Presentar()
        '-----------Presentar la Matriz A en pantalla -------------------
        Console.WriteLine("" & vbLf & " * La matriz A ingresada  es : " & vbLf & "")
        For i As Integer = 1 To n
            For j As Integer = 1 To n
                Console.Write("" & vbTab & "{0,2:F2}", A(i, j))
            Next
            Console.Write("" & vbLf & "")
        Next
        ' -------------Presentar el vector B en pantalla-----------------------
        Console.WriteLine("" & vbLf & " *El vector B ingresado es : " & vbLf & "")
        For i As Integer = 1 To n
            For j As Integer = 1 To 1
                Console.Write("" & vbTab & "{0,2:f2}", B(i, 1))
            Next
            Console.Write("" & vbLf & "")
        Next
    End Sub
    Sub GSEIDEL()
        Console.WriteLine("" & vbLf & " * La solución del sistema : " & vbLf & "")
        Console.Write("" & vbLf & " * Cálculo del Error:" & "   Tolerancia = " & Tol)
        Console.Write("" & vbLf & "------------------------------------------------")
        Console.Write("" & vbLf & "")
        For k As Integer = 1 To iter
            sum = 0
            For i As Integer = 1 To n
                sum = B(i, 1)
                For j As Integer = 1 To n
                    If i <> j Then
                        sum = sum + (-1) * A(i, j) * X(1, j)
                    End If
                Next j
                sum = sum / A(i, i)
                cError = cError + Math.Abs(sum - X(1, i))
                X(1, i) = sum
                Console.Write("" & vbTab & "{0,2:f5}" & "  i" & "[" & k & "]", cError)
                cError = cError / n
            Next i
            Console.Write("" & vbLf & "")
            If cError < Tol Then
                Console.Write("" & vbLf & " * Solución:")
                Console.Write("" & vbLf & "")
                Console.Write("" & vbLf & "")
                For r As Integer = 1 To n
                    For p As Integer = 1 To 1
                        Console.Write("" & vbTab & "X" & r & "=" & "{0,2:F3}" & "  i" & "[" & k & "]", X(p, r))
                    Next
                    Console.Write("" & vbLf & "")
                Next
                Console.Write("" & vbLf & " Fín del cálculo")
                Exit For

            End If
        Next k
        Console.ReadLine()
    End Sub
End Module


De acuerdo al ejemplo corremos el programa y obtenemos:


Y llegamos al final, un gusto y comentarios y/o preguntas a mi correo, nos vemos