{"id":6399,"date":"2017-06-10T10:05:36","date_gmt":"2017-06-10T15:05:36","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/analisisnumerico\/?p=6399"},"modified":"2026-03-04T09:27:42","modified_gmt":"2026-03-04T14:27:42","slug":"metodo-gauss-seidel","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u03\/metodo-gauss-seidel\/","title":{"rendered":"3.7 M\u00e9todo de Gauss-Seidel con Python"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">Gauss-Seidel<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"concepto\">1. El m\u00e9todo iterativo de Gauss-Seidel<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: Chapra 11.2 p310, Burden 7.3 p337, Rodr\u00edguez 5.2 p162<\/p>\n\n\n\n<p>El <strong>m\u00e9todo de Gauss-Seidel<\/strong>, reescribe las expresiones del sistema de ecuaciones, despejando la inc\u00f3gnita de la diagonal en cada ecuaci\u00f3n. Usa el vector inicial <strong>X<\/strong><sub>0<\/sub>, actualizando el vector <strong>X<\/strong>&nbsp;por cada nuevo valor calculado del vector.&nbsp;La&nbsp;diferencia principal con el m\u00e9todo de Jacobi es la actualizaci\u00f3n de <strong>X<\/strong> en cada c\u00e1lculo, por lo que las iteraciones llegan m\u00e1s r\u00e1pido al punto cuando el m\u00e9todo converge.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"420\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/06\/gaussseidel_animado.gif\" alt=\"M\u00e9todo Gauss-Seidel gr\u00e1fico animado\" class=\"wp-image-13436\" \/><\/figure>\n\n\n\n<p>Las iteraciones pueden ser o no, convergentes.<\/p>\n\n\n\n<p>La expresi\u00f3n para encontrar nuevos valores usando la matriz de coeficientes A, el vector de constantes B y como inc\u00f3gnitas X es la misma que Jacobi:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_i = \\bigg(b_i - \\sum_{j=0, j\\neq i}^n a_{i,j}x_j\\bigg) \\frac{1}{a_{ii}} <\/span>\n\n\n\n<p>La convergencia del m\u00e9todo iterativo se puede revisar usando el n\u00famero de condici\u00f3n de la matriz de coeficientes <strong>A<\/strong>. Un resultado&nbsp;<em>cercano a 1<\/em>, implica que el sistema ser\u00e1 convergente.<\/p>\n\n\n\n<p class=\"has-text-align-center\">cond(A) = ||A|| ||A<sup>-1<\/sup>||<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>np.linalg.cond(A)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">Gauss-Seidel<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ejercicio\">2. Ejercicio<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-eval\/mn-1e15\/1eva2011tii_t2-sistema-de-ecuaciones-diagonal-dominante\/\" data-type=\"post\" data-id=\"407\">1Eva2011TII_T2 Sistema de Ecuaciones, diagonal dominante<\/a><\/p>\n\n\n\n<p>Considere el siguiente sistema de ecuaciones AX=B dado por:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{cases} -2x+5y+9z=1\\\\7x+y+z=6\\\\-3x+7y-z=-26\\end{cases} <\/span>\n\n\n\n<p>Luego del <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u03\/pivoteo-parcial-filas\/\" data-type=\"post\" data-id=\"1226\">pivoteo parcial por filas<\/a>, el sistema de ecuaciones a usar para el m\u00e9todo de Gauss-Seidel es:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{cases} 7x+y+z=6\\\\-3x+7y-z=-26\\\\-2x+5y+9z=1\\end{cases} <\/span>\n\n\n\n<p>Desarrolle el ejercicio usando el <strong>m\u00e9todo de Gauss-Seidel<\/strong>, tomando como vector inicial X<sub>0<\/sub>=[0,0,0] y tolerancia de 0.0001<\/p>\n\n\n\n<p><em><strong>Compare<\/strong> los resultados con el m\u00e9todo de Jacobi<\/em>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">Gauss-Seidel<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"analitico\">3. Desarrollo Anal\u00edtico<\/h2>\n\n\n\n<p>Para el m\u00e9todo de Gauss-Seidel,&nbsp;se usan las ecuaciones reordenas con el <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u03\/pivoteo-parcial-filas\/\" data-type=\"post\" data-id=\"1226\">pivoteo parcial por filas<\/a>,&nbsp;para que en lo posible sea diagonal dominante que mejora la convergencia.&nbsp;El resultado del algoritmo a partir de las ecuaciones presentadas al inicio es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Pivoteo parcial por filas AB:\n&#091;&#091;  7.   1.   1.   6.]\n &#091; -3.   7.  -1. -26.]\n &#091; -2.   5.   9.   1.]]\nA:\n&#091;&#091; 7.  1.  1.]\n &#091;-3.  7. -1.]\n &#091;-2.  5.  9.]]\nB:\n&#091;  6. -26.   1.]<\/code><\/pre>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{cases} 7x+y+z=6\\\\-3x+7y-z=-26\\\\-2x+5y+9z=1\\end{cases} <\/span>\n\n\n\n<p>se reescriben despejando la inc\u00f3gnita de la diagonal en cada ecuaci\u00f3n.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x=\\frac{6-y-z}{7} <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y= \\frac{-26+3x+z}{7} <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> z=\\frac{1+2x-5y}{9} <\/span>\n\n\n\n<p>El vector inicial&nbsp;X<sub>0<\/sub>=[0,0,0] representa un punto de partida, valores estimados o semilla para buscar la soluci\u00f3n a las variables X<sub>0<\/sub>=[x<sub>0<\/sub>,y<sub>0<\/sub>,z<sub>0<\/sub>].<\/p>\n\n\n\n<p>Como las ecuaciones son el comportamiento del '<em><strong>sistema<\/strong><\/em>', se usan con &nbsp;X<sub>0<\/sub> para obtener un <strong>nuevo<\/strong> y mejor valor estimado para la soluci\u00f3n.<\/p>\n\n\n\n<p><strong><em>itera = 0<\/em><\/strong><\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_0=[x_0,y_0,z_0] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_1 = X_0=[0,0,0] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_1=\\frac{6-(0)-(0)}{7} =\\frac{6}{7}=0.8571<\/span>\n\n\n\n<p>Se actualiza el vector X<sub>1<\/sub>,<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_1 = [0.8571,0,0] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y_1= \\frac{-26+3(0.8571)+(0)}{7} =-3.3469<\/span>\n\n\n\n<p>Se actualiza el vector X<sub>1<\/sub>,<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_1 = [0.8571,-3.3469,0] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> z_1=\\frac{1+2(0.8571)-5(-3.3469)}{9} =\\frac{1}{9}=2.161<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_1=[0.8571, -3.3469, 2.161] <\/span>\n\n\n\n<p>Para revisar si se est\u00e1 m\u00e1s cerca o no de la soluci\u00f3n se calculan los desplazamientos o <strong>diferencias<\/strong> entre los valores anteriores y los nuevos:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{diferencias}=X_1-X_0<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> =[0.8571-0, -3.3469-0, 2.161-0]<\/span>\n\n\n\n<pre class=\"wp-block-code\"><code> &#091;0.8571, -3.3469, 2.161]\n-&#091;0.    ,  0.    , 0.    ]\n__________________________\n &#091;0.8571, -3.3469, 2.161]<\/code><\/pre>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{diferencias}=[0.8571, -3.3469, 2.161]<\/span>\n\n\n\n<p>Para estimar el valor del <strong>error<\/strong>, se presenta un valor simplificado o escalar de las diferencias (<a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u03\/normas-de-vector-o-matriz\/\" data-type=\"post\" data-id=\"318\">norma<\/a> del error). Por simplicidad se usa el valor de magnitud m\u00e1xima. Se usa como variable '<strong>errado<\/strong>', para evitar el conflicto de nombre de variable error usada como palabra reservada en Python:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{errado}= max \\Big|\\text{diferencias}\\Big|<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{errado}= max \\Big|[0.8571, -3.3469, 2.161]\\Big| = 3.3469<\/span>\n\n\n\n<p>Al comparar el valor <strong>errado<\/strong> con la <strong>tolera<\/strong>ncia, se observa que el error a\u00fan es mayor que lo tolerado. Por lo que se sigue con la siguiente iteraci\u00f3n.<\/p>\n\n\n\n<p><strong><em>itera = 1<\/em><\/strong><\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_1=[x_1,y_1,z_1] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_2 = X_1=[0.8571, -3.3469, 2.161] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_2=\\frac{6-(-3.3469)-(2.161)}{7} = 1.0266<\/span>\n\n\n\n<p>Se actualiza el vector X<sub>2<\/sub>,<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_2 = [1.0266, -3.3469, 2.161] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y_2= \\frac{-26+3(1.0266)+(2.161)}{7} =-2.9656<\/span>\n\n\n\n<p>Se actualiza el vector X<sub>2<\/sub>,<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_2 = [1.0266, -2.9656, 2.161] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> z_2=\\frac{1+2(1.0266)-5(-2.9656)}{9} =1.9868<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_2 = [1.0266, -2.9656, 1.9868] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{diferencias}=|X_2-X_1|<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">=|[1.0266-0.8571, -2.9656-(-3.3469), 1.9868-2.161]|<\/span>\n\n\n\n<pre class=\"wp-block-code\"><code> &#091;1.0266, -2.9656, 1.9868]\n-&#091;0.8571, -3.3469, 2.161 ] \n__________________________\n &#091;0.1694,  0.3813, 0.1742]<\/code><\/pre>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{diferencias}= |[0.1694, 0.3813, 0.1742]|<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{errado}=max |X_2-X_1|= 0.3813<\/span>\n\n\n\n<p><strong><em>itera = 2<\/em><\/strong><\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_3 = X_2=[1.0266, -2.9656, 1.9868] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_3=\\frac{6-(-2.9656)-(1.9868)}{7} = 0.997 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_3 =[0.997, -2.9656, 1.9868] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y_3= \\frac{-26+3(0.997)+(1.9868)}{7} = -3.0032 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_3 =[0.997, -3.0032, 1.9868] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> z_3=\\frac{1+2(0.997)-5(-3.0032)}{9} = 2.0011 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_3 =[0.997, -3.0032, 2.0011] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{diferencias}=|X_3-X_2| <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">=|[0.997-1.0266, -3.0032-(-2.9656), 2.0011-1.9868]| <\/span>\n\n\n\n<pre class=\"wp-block-code\"><code> &#091; 0.997 , -3.0032, 2.0011]\n-&#091; 1.0266, -2.9656, 1.9868] \n__________________________\n &#091;-0.0296,  0.0376, 0.0143]<\/code><\/pre>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{diferencias}=|[-0.0296, 0.0376, 0.0143]| <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{errado}=max |X_2-X_1|= 0.0376<\/span>\n\n\n\n<figure class=\"wp-block-image alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"556\" height=\"436\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/06\/gauss_seidel_x_itera_errores.png\" alt=\"M\u00e9todo Gauss-Seidel errores por iteraci\u00f3n gr\u00e1fica\" class=\"wp-image-13437\" style=\"width:350px\" \/><\/figure>\n\n\n\n<p>En cada iteraci\u00f3n el valor de error disminuye, por lo que se estima que el <strong>m\u00e9todo converge<\/strong>.<\/p>\n\n\n\n<p>Al usar el algoritmo, de los resultados se observa que se detiene luego de <strong>6 iteraciones,<\/strong> los errores son menores a la <strong>tolera<\/strong>ncia:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Iteraciones Gauss-Seidel\nitera,&#091;X]\n   errado,&#091;diferencia]\n0 &#091;0. 0. 0.] 0.0002\n1 &#091; 0.8571 -3.3469  2.161 ]\n  3.3469387755102042 &#091;0.8571 3.3469 2.161 ]\n2 &#091; 1.0266 -2.9656  1.9868]\n  0.381322597066037 &#091;0.1694 0.3813 0.1742]\n3 &#091; 0.997  -3.0032  2.0011]\n  0.03756644188210334 &#091;0.0296 0.0376 0.0143]\n4 &#091; 1.0003 -2.9997  1.9999]\n  0.00346691102194141 &#091;0.0033 0.0035 0.0012]\n5 &#091; 1. -3.  2.]\n  0.0003256615309844557 &#091;3.2566e-04 3.0918e-04 9.9398e-05]\n6 &#091; 1. -3.  2.]\n  2.996898191776065e-05 &#091;2.9969e-05 2.7044e-05 8.3644e-06]\nMetodo de Gauss-Seidel\nnumero de condici\u00f3n: 1.9508402675105447\nX:  &#091; 1. -3.  2.]\nerrado: 2.996898191776065e-05\niteraciones: 6<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">Gauss-Seidel<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"algoritmo\">4. Algoritmo en Python<\/h2>\n\n\n\n<p>El algoritmo para Gauss-Seidel es semejante al realizado para Jacobi, se debe incorporar las instrucciones para actualizar los valores de X[i] en cada uso de ecuaci\u00f3n o fila.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"M\u00e9todo de Gauss-Seidel y Gr\u00e1fica con Python\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/rKluUDbuiA8?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>Para el algoritmo se usa el sistema de ecuaciones en su forma matricial A.X=B.<br>Se asume que se ha aplicado el&nbsp;<a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u03\/pivoteo-parcial-filas\/\" data-type=\"post\" data-id=\"1226\">pivoteo parcial por filas<\/a> y matriz aumentada.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\ni=0 # una ecuacion\nsuma = B&#x5B;i] # numerador\nfor j in range(0,m,1): # un coeficiente\n    if (i!=j): # excepto diagonal de A\n        suma = suma-A&#x5B;i,j]*X&#x5B;j]\n                \nnuevo = suma\/A&#x5B;i,i]\ndiferencia&#x5B;i] = abs(nuevo-X&#x5B;i])\nX&#x5B;i] = nuevo\nerrado = np.max(diferencia)\n<\/pre><\/div>\n\n\n<p>La actualizaci\u00f3n para el algoritmo es:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# M\u00e9todo de Gauss-Seidel\nimport numpy as np\n\n# INGRESO\n# NOTA: Para AB, se ha usado pivoteo parcial por filas\nA = &#x5B;&#x5B; 7,  1,  1],\n     &#x5B;-3,  7, -1],\n     &#x5B;-2,  5,  9]]\nB = &#x5B;6, -26, 1]\n\nX0 = &#x5B;0,0,0]\ntolera = 0.0001\niteramax = 100\n\n# PROCEDIMIENTO\n# Matrices como arreglo, numeros reales\nA = np.array(A,dtype=float)\nB = np.array(B,dtype=float)\nX0 = np.array(X0,dtype=float)\ntamano = np.shape(A) # tama\u00f1o A\nn = tamano&#x5B;0]\nm = tamano&#x5B;1]\n\n# valores iniciales\ndiferencia = np.ones(n, dtype=float)\nerrado = 2*tolera # np.max(diferencia)\n\nitera = 0 \nX = np.copy(X0)\nwhile errado&gt;tolera and itera&lt;=iteramax:\n    \n    for i in range(0,n,1): # una ecuacion\n        suma = B&#x5B;i] # numerador\n        for j in range(0,m,1): # un coeficiente\n            if (i!=j): # excepto diagonal de A\n                suma = suma-A&#x5B;i,j]*X&#x5B;j]\n                \n        nuevo = suma\/A&#x5B;i,i]\n        diferencia&#x5B;i] = abs(nuevo-X&#x5B;i])\n        X&#x5B;i] = nuevo\n    errado = np.max(diferencia)\n    \n    print(itera, X)\n    print('  ',errado,diferencia)\n    itera = itera + 1\n\nif (itera&gt;iteramax): # No converge\n    X = np.nan\n    print('No converge,iteramax superado')\n\n# numero de condicion\nncond = np.linalg.cond(A)\n\n# SALIDA\nprint('M\u00e9todo de Gauss-Seidel')\nprint('numero de condici\u00f3n:', ncond)\nprint('X: ',X)\nprint('errado:',errado)\nprint('iteraciones:', itera)\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">Gauss-Seidel<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"funcion\">5. Algoritmo en Python como funci\u00f3n<\/h2>\n\n\n\n<p>Las instrucciones del algoritmo, empaquetadas como funci\u00f3n, a\u00f1aden algunas facilidades para el desarrollo del ejercicio. Antes de usar el&nbsp;<strong>m\u00e9todo de Gauss-Seidel<\/strong>, se aplica el <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u03\/pivoteo-parcial-filas\/\" data-type=\"post\" data-id=\"1226\">pivoteo parcial por filas<\/a> para mejorar de ser posible la convergencia.<\/p>\n\n\n\n<p>En la funci\u00f3n <code><strong>gauss_seidel<\/strong>()<\/code> se a\u00f1aden las instrucciones para mostrar los resultados parciales en cada iteraci\u00f3n. Se a\u00f1ade una <code>tabla<\/code> para revisi\u00f3n de valores al final del algoritmo, o para realizar la gr\u00e1fica de errores por iteraci\u00f3n.<\/p>\n\n\n\n<p>Si el sistema es de 3x3 se puede a\u00f1adir una gr\u00e1fica de los resultados por iteraci\u00f3n, mostrando la trayectoria descrita por los resultados parciales en 3D.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Algoritmo Gauss-Seidel\n# soluci\u00f3n de matrices\n# m\u00e9todos iterativos\n# Referencia: Chapra 11.2, p.310,\n#      Rodriguez 5.2 p.162\nimport numpy as np\n\ndef gauss_seidel(A,B,X0,tolera, iteramax=100, vertabla=False, precision=4):\n    ''' M\u00e9todo de Gauss Seidel, tolerancia, vector inicial X0\n        para mostrar iteraciones: vertabla=True\n    '''\n    # Matrices como arreglo, numeros reales\n    A = np.array(A, dtype=float)\n    B = np.array(B, dtype=float)\n    X0 = np.array(X0, dtype=float)\n    tamano = np.shape(A)\n    n = tamano&#x5B;0]\n    m = tamano&#x5B;1]\n\n    # valores iniciales\n    diferencia = 2*tolera*np.ones(n, dtype=float)\n    errado = 2*tolera # np.max(diferencia)\n   \n    tabla = &#x5B;np.copy(X0)] # tabla de iteraciones\n    tabla = np.concatenate((tabla,&#x5B;&#x5B;np.nan]]),\n                            axis=1) # a\u00f1ade errado\n\n    if vertabla==True:\n        print('Iteraciones Gauss-Seidel')\n        print('itera,&#x5B;X]')\n        print('   errado,&#x5B;diferencia]')\n        print(0,X0)\n        print(' ',np.nan)\n        np.set_printoptions(precision)\n\n    itera = 0 # Gauss-Sediel\n    X = np.copy(X0)\n    while (errado&gt;tolera and itera&lt;iteramax):\n        \n        for i in range(0,n,1): # una ecuacion\n            suma = B&#x5B;i]\n            for j in range(0,m,1):\n                if (i!=j):\n                    suma = suma-A&#x5B;i,j]*X&#x5B;j]\n            nuevo = suma\/A&#x5B;i,i]\n            diferencia&#x5B;i] = np.abs(nuevo-X&#x5B;i])\n            X&#x5B;i] = nuevo\n        errado = np.max(diferencia)\n\n        Xfila= np.concatenate((X,&#x5B;errado]),axis=0)\n        tabla = np.concatenate((tabla,&#x5B;Xfila]),axis = 0)\n        itera = itera + 1\n        if vertabla==True:\n            print(itera, X)\n            print(' ', errado,diferencia)\n        \n    # No converge\n    if (itera&gt;iteramax):\n        X = np.nan\n        print('No converge,iteramax superado')\n    if vertabla==True:\n        X = &#x5B;X,tabla]\n    return(X)\n\ndef pivoteafila(A,B,vertabla=False):\n    '''\n    Pivotea parcial por filas, entrega matriz aumentada AB\n    Si hay ceros en diagonal es matriz singular,\n    Tarea: Revisar si diagonal tiene ceros\n    '''\n    A = np.array(A,dtype=float)\n    B = np.array(B,dtype=float)\n    # Matriz aumentada\n    nB = len(np.shape(B))\n    if nB == 1:\n        B = np.transpose(&#x5B;B])\n    AB  = np.concatenate((A,B),axis=1)\n    \n    if vertabla==True:\n        print('Matriz aumentada')\n        print(AB)\n        print('Pivoteo parcial:')\n    \n    # Pivoteo por filas AB\n    tamano = np.shape(AB)\n    n = tamano&#x5B;0]\n    m = tamano&#x5B;1]\n    \n    # Para cada fila en AB\n    pivoteado = 0\n    for i in range(0,n-1,1):\n        # columna desde diagonal i en adelante\n        columna = np.abs(AB&#x5B;i:,i])\n        dondemax = np.argmax(columna)\n        \n        # dondemax no es en diagonal\n        if (dondemax != 0):\n            # intercambia filas\n            temporal = np.copy(AB&#x5B;i,:])\n            AB&#x5B;i,:] = AB&#x5B;dondemax+i,:]\n            AB&#x5B;dondemax+i,:] = temporal\n\n            pivoteado = pivoteado + 1\n            if vertabla==True:\n                print(' ',pivoteado, 'intercambiar filas: ',i,'y', dondemax+i)\n    if vertabla==True:\n        if pivoteado==0:\n            print('  Pivoteo por filas NO requerido')\n        else:\n            print('AB')\n            print(AB)\n    return(AB)\n\n# PROGRAMA B\u00fasqueda de solucion  --------\n# INGRESO\nA = &#x5B;&#x5B; 7,  1,  1],\n     &#x5B;-3,  7, -1],\n     &#x5B;-2,  5,  9]]\nB = &#x5B;6, -26, 1]\n\nX0 = &#x5B;0,0,0]\ntolera = 0.0001\niteramax = 100\nverdecimal = 4\n\n# PROCEDIMIENTO\nAB = pivoteafila(A,B,vertabla=True)\nn,m = np.shape(AB)\n\nA = AB&#x5B;:,:n] # separa en A y B\nB = AB&#x5B;:,n]\n\n&#x5B;X, tabla] = gauss_seidel(A,B,X0, tolera,\n                           vertabla=True,\n                           precision=verdecimal)\nn_itera = len(tabla)-1\nerrado = tabla&#x5B;-1,-1]\n\n# numero de condicion\nncond = np.linalg.cond(A)\n\n# SALIDA\nprint('Metodo de Gauss-Seidel')\nprint('numero de condici\u00f3n:', ncond)\nprint('X: ',X)\nprint('errado:',errado)\nprint('iteraciones:', n_itera)\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">Gauss-Seidel<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"grafica\">6. Gr\u00e1ficas de iteraciones<\/h2>\n\n\n\n<p>Se muestra la gr\u00e1fica de errores vs iteraciones.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA de iteraciones\nerrados = tabla&#x5B;:,n]\n\nimport matplotlib.pyplot as plt\n# grafica de error por iteracion\nfig2D = plt.figure()\ngraf = fig2D.add_subplot(111)\ngraf.plot(errados,color='purple')\ngraf.set_xlabel('itera')\ngraf.set_ylabel('|error|')\ngraf.set_title('M\u00e9todo de Gauss-Seidel: error&#x5B;itera]')\ngraf.grid()\n\nplt.show()\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">6.1 Gr\u00e1fica de iteraciones para sistema de 3\u00d73<\/h3>\n\n\n\n<p>Si el sistema es de 3\u00d73, se muestra una gr\u00e1fica de la trayectoria de resultados parciales, semejante a la presentada para la descripci\u00f3n del concepto. Permite observar si la espiral es convergente o no.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# grafica de iteraciones x,y,z\n# solo para 3x3\nxp = tabla&#x5B;:,0]\nyp = tabla&#x5B;:,1]\nzp = tabla&#x5B;:,2]\n\nfig3D = plt.figure()\ngraf3D = fig3D.add_subplot(111,projection='3d')\n\ngraf3D.plot(xp,yp,zp,color='purple')\ngraf3D.plot(xp&#x5B;0],yp&#x5B;0],zp&#x5B;0],'o',label='X&#x5B;0]')\ngraf3D.plot(xp&#x5B;n_itera],yp&#x5B;n_itera],zp&#x5B;n_itera],\n            'o',label='X&#x5B;'+str(n_itera)+']')\n\ngraf3D.set_xlabel('x')\ngraf3D.set_ylabel('y')\ngraf3D.set_zlabel('z')\ngraf3D.set_title('M\u00e9todo de Gauss-Seidel: iteraciones X')\n\n# graf3D.view_init(45,45)\nplt.legend()\nplt.show()\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p><a href=\"#concepto\">Gauss-Seidel<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>Gauss-Seidel Ejercicio Anal\u00edtico Algoritmo funci\u00f3n gr\u00e1fica 1. El m\u00e9todo iterativo de Gauss-Seidel Referencia: Chapra 11.2 p310, Burden 7.3 p337, Rodr\u00edguez 5.2 p162 El m\u00e9todo de Gauss-Seidel, reescribe las expresiones del sistema de ecuaciones, despejando la inc\u00f3gnita de la diagonal en cada ecuaci\u00f3n. Usa el vector inicial X0, actualizando el vector X&nbsp;por cada nuevo valor calculado [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-mn-unidades","format":"standard","meta":{"footnotes":""},"categories":[37],"tags":[],"class_list":["post-6399","post","type-post","status-publish","format-standard","hentry","category-mn-u03"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/6399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/comments?post=6399"}],"version-history":[{"count":8,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/6399\/revisions"}],"predecessor-version":[{"id":22670,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/6399\/revisions\/22670"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=6399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=6399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=6399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}