{"id":5436,"date":"2017-06-09T10:00:20","date_gmt":"2017-06-09T15:00:20","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/matg1013\/?p=5436"},"modified":"2026-02-15T06:06:28","modified_gmt":"2026-02-15T11:06:28","slug":"metodo-jacobi","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u03\/metodo-jacobi\/","title":{"rendered":"3.6 M\u00e9todo de Jacobi 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\">Jacobi<\/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\">1. El m\u00e9todo iterativo de Jacobi<\/h2>\n\n\n\n<p id=\"concepto\"><strong><em>Referencia<\/em><\/strong>: Burden 7.3 p334, Rodr\u00edguez 5.1 p154, Chapra&nbsp; 11.2.1p312<\/p>\n\n\n\n<p>Los m\u00e9todos iterativos para sistemas de ecuaciones, son semejantes al <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u02\/metodo-punto-fijo\/\" data-type=\"post\" data-id=\"1143\">m\u00e9todo de punto fijo<\/a> para b\u00fasqueda de ra\u00edces, requieren un punto inicial para la b\u00fasqueda \"de la ra\u00edz o soluci\u00f3n\" que satisface el sistema.&nbsp;Se&nbsp;plantea considerar aproximaciones o iteraciones de forma sucesiva desde un punto de partida o inicial <strong>X<\/strong><sub>0<\/sub>, hacia una soluci\u00f3n del sistema de ecuaciones.<\/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\/jacobi_animado.gif\" alt=\"M\u00e9todo de Jacobi con gr\u00e1fica animada\" class=\"wp-image-13432\" \/><\/figure>\n\n\n\n<p>Las iteraciones pueden ser o no, convergentes.<\/p>\n\n\n\n<p>Para describir el m\u00e9todo iterativo de <strong>Jacobi<\/strong>, se usa como ejemplo: un sistema de 3 inc\u00f3gnitas y 3 ecuaciones, <strong>diagonalmente dominante<\/strong>, planteado en su forma matricial.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{cases} a_{0,0} x_0+a_{0,1}x_1+a_{0,2} x_2 = b_{0} \\\\ a_{1,0} x_0+a_{1,1}x_1+a_{1,2} x_2 = b_{1} \\\\ a_{2,0} x_0+a_{2,1}x_1+a_{2,2} x_2 = b_{2} \\end{cases} <\/span>\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:<\/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>El <strong>m\u00e9todo de Jacobi<\/strong>, reescribe las expresiones&nbsp;despejando la inc\u00f3gnita de la diagonal en cada ecuaci\u00f3n. El patr\u00f3n que se observa en las ecuaciones despejadas, se describe en la f\u00f3rmula para <strong>x<sub>i<\/sub><\/strong> de la fila <strong>i<\/strong>, que se usar\u00e1 en&nbsp;el algoritmo en Python.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_0 = \\frac{b_{0} -a_{0,1}x_1 -a_{0,2} x_2 }{a_{0,0}} <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_1 = \\frac{b_{1} -a_{1,0} x_0 -a_{1,2} x_2}{a_{1,1}} <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_2 = \\frac{b_{2} -a_{2,0} x_0 - a_{2,1} x_1}{a_{2,2}} <\/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 <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<p>Usando de forma experimental los ejercicios de las evaluaciones de la secci\u00f3n matriciales iterativos,&nbsp; el <strong>n\u00famero de condici\u00f3n<\/strong> no deber\u00eda superar el valor de 7 para que el sistema sea convergente. Puede revisar que si es mayor, el m\u00e9todo tiende a no ser convergente.&nbsp; Aunque los textos del libro no lo indican directamente,<\/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\">Jacobi<\/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 A.X=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 Jacobi 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 Jacobi<\/strong>, tomando como vector inicial <strong>X<\/strong><sub>0<\/sub>=[0,0,0] y <strong>tolera<\/strong>ncia de 0.0001.<\/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\">Jacobi<\/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 Jacobi, 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>, 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 despejan 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;<strong>X<\/strong><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>,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;<strong>X<\/strong><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_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<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y_1= \\frac{-26+3(0)+(0)}{7} =\\frac{-26}{7}=-3.7142<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> z_1=\\frac{1+2(0)-5(0)}{9} =\\frac{1}{9}=0.1111<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_1=[0.8571, -3.7142, 0.1111] <\/span>\n\n\n\n<p>Para revisar si se est\u00e1 m\u00e1s cerca de la soluci\u00f3n, se calculan las <strong>diferencias<\/strong>, tramos o&nbsp;desplazamientos entre los valores nuevos y anteriores:<\/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.7142-0, 0.1111-0]<\/span>\n\n\n\n<pre class=\"wp-block-code\"><code> &#091;0.8571, -3.7142, 0.1111]\n-&#091;0.    ,  0.    , 0.    ]\n__________________________\n &#091;0.8571, -3.7142, 0.1111]<\/code><\/pre>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{diferencias}=[0.8571, -3.7142, 0.1111]<\/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=\"http:\/\/blog.espol.edu.ec\/analisisnumerico\/normas-vs-distancias-en-3d\/\">norma<\/a> del error). Por simplicidad se usa el valor de <strong>magnitud m\u00e1xima<\/strong> de los errores. 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.7142, 0.1111]\\Big| = 3.7142<\/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 <strong>tolera<\/strong>do. Por lo que se contin\u00faa con otra 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_1=[0.8571, -3.7142, 0.1111] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_2=\\frac{6-(-3.7142)-(0.1111)}{7} = 1.3718<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y_2= \\frac{-26+3(0.8571)+(0.1111)}{7} =-3.3310<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> z_2=\\frac{1+2(0.8571)-5(-3.7142)}{9} =2.3650<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_2=[1.3718, -3.3310, 2.3650] <\/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\">=|[0.8571-1.3718, -3.3310-(-3.7142), 2.3650-0.1111]|<\/span>\n\n\n\n<pre class=\"wp-block-code\"><code> &#091;1.3718, -3.3310, 2.3650]\n-&#091;0.8571, -3.7142, 0.1111] \n__________________________\n&#091;0.51474, -0.38322, 2.25397]<\/code><\/pre>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{diferencias}= |[0.51474, -0.38322, 2.25397]|<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{errado}=max |X_2-X_1|= 2.2539<\/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_2=[1.3718, -3.3310, 2.3650] <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> x_3=\\frac{6-(-3.3310)-(2.3650)}{7} = 0.9951 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> y_3= \\frac{-26+3(1.3718)+(2.3650)}{7} = -2.7884 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> z_3=\\frac{1+2(1.3718)-5(-3.3310)}{9} = 2.2665 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> X_3=[0.99514, -2.7884, 2.2665] <\/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.99514-1.3718, -2.7884-(-3.3310), 2.2665-2.3650]| <\/span>\n\n\n\n<pre class=\"wp-block-code\"><code> &#091; 0.9951, -2.7884, 2.2665]\n-&#091; 1.3718, -3.3310, 2.3650] \n__________________________\n &#091;-0.3767,  0.5426, 0.0985]<\/code><\/pre>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{diferencias}=|[-0.3767, 0.5426, 0.0985]| <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\text{errado}=max |X_2-X_1|= 0.5425<\/span>\n\n\n\n<figure class=\"wp-block-image alignright size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"560\" height=\"439\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/06\/jacobi_x_itera_errores.png\" alt=\"M\u00e9todo de Jacobi por error por iteraci\u00f3n gr\u00e1fica\" class=\"wp-image-13433\" \/><\/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 14 iteraciones, los errores son menores a la <strong>tolera<\/strong>ncia:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Iteraciones Jacobi\nitera,&#091;X]\n     ,errado,|diferencia|\n0 &#091;0. 0. 0.]\n  nan\n1 &#091; 0.85714 -3.71429  0.11111]\n  3.7142857142857144 &#091;0.85714 3.71429 0.11111]\n2 &#091; 1.37188 -3.33107  2.36508]\n  2.2539682539682544 &#091;0.51474 0.38322 2.25397]\n3 &#091; 0.99514 -2.78847  2.26657]\n  0.5425979915775843 &#091;0.37674 0.5426  0.09851]\n4 &#091; 0.9317 -2.964   1.8814]\n  0.3851635892452223 &#091;0.06344 0.17553 0.38516]\n...\n  0.0003598675094789 &#091;2.30116e-04 3.59868e-04 6.47473e-05]\n13 &#091; 1.00004 -3.00002  2.00007]\n  0.0002510632800638 &#091;4.21600e-05 1.07871e-04 2.51063e-04]\n14 &#091; 0.99999 -2.99997  2.00002]\n  5.393476706316e-05 &#091;5.12763e-05 5.39348e-05 5.05593e-05]\nMetodo de Jacobi\nnumero de condici\u00f3n: 1.9508402675105447\nX:  &#091; 0.99999 -2.99997  2.00002]\nerrado: 5.3934767063168465e-05\niteraciones: 14<\/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\">Jacobi<\/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>Para el algoritmo se usa el sistema de ecuaciones en su forma matricial A.X=B.&nbsp;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 (luego se a\u00f1ade como una funci\u00f3n).&nbsp;Se asegura que <strong>A<\/strong>, <strong>X<\/strong> y <strong>B<\/strong> sean arreglos de n\u00fameros reales.<\/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 Jacobi y Gr\u00e1fica con Python\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/zTOdaCEThBY?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>Las instrucciones inician seleccionando la primera ecuaci\u00f3n, primera fila,&nbsp;<code>i=0<\/code>.&nbsp;El numerador de la expresi\u00f3n se acumula en&nbsp;<code>suma<\/code>, que inicia con B[i]. Luego se restan todas las combinaciones de <code>A[i,j]*X[j]<\/code>, menos en la diagonal. El nuevo valor de X[i], o&nbsp;<code>Xnuevo<\/code>, es <code>suma<\/code> dividido para el coeficiente de la diagonal&nbsp;<code>A[i,i]<\/code><\/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<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]\nXnuevo&#x5B;i] = suma\/A&#x5B;i,i]\n<\/pre><\/div>\n\n\n<p>Se repite el proceso para las siguientes ecuaciones, cambiando el valor de 'i'<\/p>\n\n\n\n<p>En cada iteraci\u00f3n se determinan las <strong>diferencia<\/strong>s |X[i+1]-X[i]| como los <strong>error<\/strong>es de iteraci\u00f3n para cada variable.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\ndiferencia = abs(Xnuevo-X)\nerrado = np.max(diferencia)\n<\/pre><\/div>\n\n\n<p>Como las <strong>diferencia<\/strong>s es un vector&nbsp;y la <strong>tolera<\/strong>ncia solo un n\u00famero (escalar), se simplifica usando&nbsp;la norma <code>np.max(diferencia)<\/code>.<br>De ser necesario, se repite la iteraci\u00f3n, actualizando el vector <strong>X<\/strong>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# M\u00e9todo de Jacobi\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)\nXnuevo = 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        Xnuevo&#x5B;i] = suma\/A&#x5B;i,i]\n    \n    diferencia = abs(Xnuevo-X)\n    errado = np.max(diferencia)\n    \n    print(itera, X)\n    print('  ',errado,diferencia)\n    \n    X = np.copy(Xnuevo) # actualiza X\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('Metodo de Jacobi')\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\">Jacobi<\/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 como funci\u00f3n en Python<\/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 Jacobi<\/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 <strong>jacobi<\/strong>() se a\u00f1aden las instrucciones para mostrar los resultados parciales en cada iteraci\u00f3n. Se a\u00f1ade una tabla 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# 1Eva_IIT2011_T2 Sistema de Ecuaciones, diagonal dominante\n# Metodo de Jacobi para sistemas de ecuaciones\nimport numpy as np\n\ndef jacobi(A,B,X0, tolera, iteramax=100,\n           vertabla=False, precision=4):\n    ''' M\u00e9todo de Jacobi, tolerancia, vector inicial X0\n        para mostrar iteraciones y tabla: 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) # tama\u00f1o 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    tabla = &#x5B;np.copy(X0)] # tabla de iteraciones\n    tabla = np.concatenate((tabla,&#x5B;&#x5B;np.nan]]),\n                            axis=1) # errado\n\n    if vertabla==True:\n        print('Iteraciones Jacobi')\n        print('itera,&#x5B;X]')\n        print('     ,errado,|diferencia|')\n        print(0,X0)\n        print(' ',np.nan)\n        np.set_printoptions(precision)\n\n    itera = 0 # Jacobi\n    X = np.copy(X0)\n    Xnuevo = 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): # un coeficiente\n                if (i!=j): # excepto diagonal de A\n                    suma = suma-A&#x5B;i,j]*X&#x5B;j]\n            Xnuevo&#x5B;i] = suma\/A&#x5B;i,i]\n        diferencia = abs(Xnuevo-X)\n        errado = np.max(diferencia)\n        X = np.copy(Xnuevo)\n\n        Xfila = np.concatenate((Xnuevo,&#x5B;errado]),axis=0)\n        tabla = np.concatenate((tabla,&#x5B;Xfila]),axis=0)\n\n        itera = itera + 1\n\n        if vertabla==True:\n            print(itera, Xnuevo)\n            print(' ',errado,diferencia)\n\n    # No converge\n    if (itera&gt;iteramax):\n        X = np.nan\n        print('No converge,iteramax superado')\n\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 = 5\n\n# PROCEDIMIENTO\nAB = pivoteafila(A,B,vertabla=True)\nn,m = np.shape(AB)\nA = AB&#x5B;:,:n] # separa en A y B\nB = AB&#x5B;:,n]\n\n&#x5B;X, tabla] = jacobi(A,B,X0,tolera,iteramax,\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 Jacobi')\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\">Jacobi<\/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<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)\ngraf.set_xlabel('itera')\ngraf.set_ylabel('|error|')\ngraf.set_title('M\u00e9todo de Jacobi: error&#x5B;itera]')\ngraf.grid()\n\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\">Jacobi<\/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<h3 class=\"wp-block-heading\">6.1 Gr\u00e1fica de iteraciones para sistema de 3x3<\/h3>\n\n\n\n<p>Si el sistema es de 3x3, 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)\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 Jacobi: iteraciones X')\n\n# graf3D.view_init(45,45)\nplt.legend()\n\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\">Jacobi<\/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>Jacobi Ejercicio Anal\u00edtico Algoritmo funci\u00f3n gr\u00e1fica 1. El m\u00e9todo iterativo de Jacobi Referencia: Burden 7.3 p334, Rodr\u00edguez 5.1 p154, Chapra&nbsp; 11.2.1p312 Los m\u00e9todos iterativos para sistemas de ecuaciones, son semejantes al m\u00e9todo de punto fijo para b\u00fasqueda de ra\u00edces, requieren un punto inicial para la b\u00fasqueda \"de la ra\u00edz o soluci\u00f3n\" que satisface el sistema.&nbsp;Se&nbsp;plantea [&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-5436","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\/5436","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=5436"}],"version-history":[{"count":13,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/5436\/revisions"}],"predecessor-version":[{"id":21560,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/5436\/revisions\/21560"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=5436"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=5436"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=5436"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}