{"id":1214,"date":"2017-06-13T09:35:41","date_gmt":"2017-06-13T14:35:41","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/matg1013\/?p=1214"},"modified":"2026-02-15T06:15:36","modified_gmt":"2026-02-15T11:15:36","slug":"metodo-gauss-jordan-inversa","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u03\/metodo-gauss-jordan-inversa\/","title":{"rendered":"3.9.2 M\u00e9todo de Gauss-Jordan para matriz Inversa 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>Matriz inversa:<\/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\">librer\u00eda<\/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\">1. Ejercicio<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: Chapra 10.2 p292, Burden 6.3 p292, Rodr\u00edguez 4.2.5 Ejemplo 1 p118<\/p>\n\n\n\n<p>Obtener la inversa de una matriz usando el m\u00e9todo de Gauss-Jordan, a partir de la matriz:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{pmatrix} 4 &amp; 2 &amp; 5 \\\\ 2 &amp; 5 &amp; 8 \\\\ 5 &amp; 4 &amp; 3 \\end{pmatrix} <\/span>\n\n\n\n<pre class=\"wp-block-code\"><code>A = &#091;&#091;4,2,5],\n     &#091;2,5,8],\n     &#091;5,4,3]]<\/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>Matriz inversa:<\/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\">librer\u00eda<\/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\">2. Desarrollo anal\u00edtico<\/h2>\n\n\n\n<p>Para el procedimiento, se crea la matriz aumentada de A con la identidad I.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> AI = A|I <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{pmatrix} 4 &amp; 2 &amp; 5 &amp; 1 &amp; 0 &amp; 0\\\\ 2 &amp; 5 &amp; 8 &amp; 0 &amp; 1 &amp; 0 \\\\ 5 &amp; 4 &amp; 3 &amp; 0 &amp; 0 &amp; 1 \\end{pmatrix} <\/span>\n\n\n\n<pre class=\"wp-block-code\"><code>&#091;&#091;  4.,    2.,    5.,   1.,    0.,    0., ]\n &#091;  2.,    5.,    8.,   0.,    1.,    0., ]\n &#091;  5.,    4.,    3.,   0.,    0.,    1., ]]<\/code><\/pre>\n\n\n\n<p>Con la matriz aumentada AI&nbsp; se repiten los procedimientos aplicados en el m\u00e9todo de Gauss-Jordan:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><em><strong>pivoteo<\/strong><\/em> parcial por filas<\/li>\n\n\n\n<li>eliminaci\u00f3n hacia <strong>adelante<\/strong><\/li>\n\n\n\n<li>eliminaci\u00f3n hacia <strong>atr\u00e1s<\/strong><\/li>\n<\/ul>\n\n\n\n<p>De la matriz aumentada resultante, se obtiene la inversa A<sup>-1<\/sup> en la mitad derecha de AI, lugar que originalmente correspond\u00eda a la identidad.<\/p>\n\n\n\n<p>el resultado buscado es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>la matriz inversa es:\n&#091;&#091; 0.2        -0.16470588  0.10588235]\n &#091;-0.4         0.15294118  0.25882353]\n &#091; 0.2         0.07058824 -0.18823529]]<\/code><\/pre>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{pmatrix} 0.2 &amp; -0.16470588 &amp; 0.10588235 \\\\ -0.4 &amp; 0.15294118 &amp; 0.25882353 \\\\ 0.2 &amp; 0.07058824 &amp; -0.18823529 \\end{pmatrix} <\/span>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Verifica resultado<\/h3>\n\n\n\n<p>El resultado se verifica realizando la operaci\u00f3n producto punto entre A y la inversa, que debe resultar la matriz identidad.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><code>A.A<sup>-1<\/sup> = I<\/code><\/p>\n\n\n\n<p>El resultado de la operaci\u00f3n es una matriz identidad. Observe que los valores del orden de 10<sup>-15<\/sup> o menores se consideran como casi cero o cero.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> A.inversa = identidad\n&#091;&#091; 1.00000000e+00 -1.38777878e-17 -1.38777878e-16]\n &#091; 2.22044605e-16  1.00000000e+00 -2.22044605e-16]\n &#091; 5.55111512e-17 -9.71445147e-17  1.00000000e+00]]<\/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>Matriz inversa:<\/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\">librer\u00eda<\/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\">3. Algoritmo en Python<\/h2>\n\n\n\n<p>El algoritmo que describe el proceso en Python:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Matriz Inversa con Gauss-Jordan\n# AI es la matriz aumentada A con Identidad\nimport numpy as np\n\n# INGRESO\nA = &#x5B;&#x5B;4,2,5],\n     &#x5B;2,5,8],\n     &#x5B;5,4,3]]\n\n# PROCEDIMIENTO\n# B = matriz_identidad\nn,m = np.shape(A)\nidentidad = np.identity(n)\n\nnp.set_printoptions(precision=4) # 4 decimales en print\ncasicero = 1e-15  # redondear a cero\n\n# Matrices como arreglo, numeros reales\nA = np.array(A,dtype=float)\nB = np.array(identidad,dtype=float)\n\ndef pivoteafila(A,B,vertabla=False):\n    '''\n    Pivoteo 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,\n                      'intercambiar filas: ',i,\n                      'con', dondemax+i)\n    if vertabla==True:\n        if pivoteado==0:\n            print('  Pivoteo por filas NO requerido')\n        else:\n            print(AB)\n    return(AB)\n\ndef gauss_eliminaAdelante(AB,vertabla=False,\n                          lu=False,casicero = 1e-15):\n    ''' Gauss elimina hacia adelante\n    tarea: verificar t\u00e9rminos cero\n    '''\n    tamano = np.shape(AB)\n    n = tamano&#x5B;0]\n    m = tamano&#x5B;1]\n    if vertabla==True:\n        print('Elimina hacia adelante:')\n    for i in range(0,n,1):\n        pivote = AB&#x5B;i,i]\n        adelante = i+1\n        if vertabla==True:\n            print(' fila i:',i,' pivote:', pivote)\n        for k in range(adelante,n,1):\n            if (np.abs(pivote)&gt;=casicero):\n                factor = AB&#x5B;k,i]\/pivote\n                AB&#x5B;k,:] = AB&#x5B;k,:] - factor*AB&#x5B;i,:]\n                for j in range(0,m,1): # casicero revisa\n                    if abs(AB&#x5B;k,j])&lt;casicero:\n                        AB&#x5B;k,j]=0\n                if vertabla==True:\n                    print('  fila k:',k,\n                          ' factor:',factor)\n            else:\n                print('  pivote:', pivote,'en fila:',i,\n                      'genera division para cero')\n        if vertabla==True:\n            print(AB)\n    respuesta = np.copy(AB)\n    if lu==True: # matriz triangular A=L.U\n        U = AB&#x5B;:,:n-1]\n        respuesta = &#x5B;AB,L,U]\n    return(respuesta)\n\ndef gauss_eliminaAtras(AB, vertabla=False,\n                       inversa=False,\n                       casicero = 1e-14):\n    ''' Gauss-Jordan elimina hacia atras\n    Requiere la matriz triangular inferior\n    Tarea: Verificar que sea triangular inferior\n    '''\n    tamano = np.shape(AB)\n    n = tamano&#x5B;0]\n    m = tamano&#x5B;1]\n    \n    ultfila = n-1\n    ultcolumna = m-1\n    if vertabla==True:\n        print('Elimina hacia Atras:')\n        \n    for i in range(ultfila,0-1,-1):\n        pivote = AB&#x5B;i,i]\n        atras = i-1  # arriba de la fila i\n        if vertabla==True:\n            print(' fila i:',i,' pivote:', pivote)\n            \n        for k in range(atras,0-1,-1):\n            if np.abs(AB&#x5B;k,i])&gt;=casicero:\n                factor = AB&#x5B;k,i]\/pivote\n                AB&#x5B;k,:] = AB&#x5B;k,:] - factor*AB&#x5B;i,:]\n                \n                # redondeo a cero\n                for j in range(0,m,1): \n                    if np.abs(AB&#x5B;k,j])&lt;=casicero:\n                        AB&#x5B;k,j]=0\n                if vertabla==True:\n                    print('  fila k:',k,\n                          ' factor:',factor)\n            else:\n                print('  pivote:', pivote,'en fila:',i,\n                      'genera division para cero')\n        AB&#x5B;i,:] = AB&#x5B;i,:]\/AB&#x5B;i,i] # diagonal a unos\n        \n        if vertabla==True:\n            print(AB)\n    \n    respuesta = np.copy(AB&#x5B;:,ultcolumna])\n    if inversa==True: # matriz inversa\n        respuesta = np.copy(AB&#x5B;:,n:])\n    return(respuesta)\n\nAB = pivoteafila(A,identidad,vertabla=True)\nAB = gauss_eliminaAdelante(AB,vertabla=True)\nA_inversa = gauss_eliminaAtras(AB,inversa=True,\n                               vertabla=True)\nA_verifica = np.dot(A,A_inversa)\n# redondeo a cero\nfor i in range(0,n,1):\n    for j in range(0,m,1): \n        if np.abs(A_verifica&#x5B;i,j])&lt;=casicero:\n            A_verifica&#x5B;i,j]=0\n\n# SALIDA\nprint('A_inversa: ')\nprint(A_inversa)\nprint('verifica A.A_inversa = Identidad:')\nprint(A_verifica)\n<\/pre><\/div>\n\n\n<p>el resultado buscado es:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Matriz aumentada\n&#091;&#091;4. 2. 5. 1. 0. 0.]\n &#091;2. 5. 8. 0. 1. 0.]\n &#091;5. 4. 3. 0. 0. 1.]]\nPivoteo parcial:\n  1 intercambiar filas:  0 con 2\n&#091;&#091;5. 4. 3. 0. 0. 1.]\n &#091;2. 5. 8. 0. 1. 0.]\n &#091;4. 2. 5. 1. 0. 0.]]\nElimina hacia adelante:\n fila i: 0  pivote: 5.0\n  fila k: 1  factor: 0.4\n  fila k: 2  factor: 0.8\n&#091;&#091; 5.   4.   3.   0.   0.   1. ]\n &#091; 0.   3.4  6.8  0.   1.  -0.4]\n &#091; 0.  -1.2  2.6  1.   0.  -0.8]]\n fila i: 1  pivote: 3.4\n  fila k: 2  factor: -0.3529411764705883\n&#091;&#091; 5.      4.      3.      0.      0.      1.    ]\n &#091; 0.      3.4     6.8     0.      1.     -0.4   ]\n &#091; 0.      0.      5.      1.      0.3529 -0.9412]]\n fila i: 2  pivote: 5.0\n&#091;&#091; 5.      4.      3.      0.      0.      1.    ]\n &#091; 0.      3.4     6.8     0.      1.     -0.4   ]\n &#091; 0.      0.      5.      1.      0.3529 -0.9412]]\nElimina hacia Atras:\n fila i: 2  pivote: 5.0\n  fila k: 1  factor: 1.3599999999999999\n  fila k: 0  factor: 0.6\n&#091;&#091; 5.      4.      0.     -0.6    -0.2118  1.5647]\n &#091; 0.      3.4     0.     -1.36    0.52    0.88  ]\n &#091; 0.      0.      1.      0.2     0.0706 -0.1882]]\n fila i: 1  pivote: 3.4\n  fila k: 0  factor: 1.1764705882352942\n&#091;&#091; 5.      0.      0.      1.     -0.8235  0.5294]\n &#091; 0.      1.      0.     -0.4     0.1529  0.2588]\n &#091; 0.      0.      1.      0.2     0.0706 -0.1882]]\n fila i: 0  pivote: 5.0\n&#091;&#091; 1.      0.      0.      0.2    -0.1647  0.1059]\n &#091; 0.      1.      0.     -0.4     0.1529  0.2588]\n &#091; 0.      0.      1.      0.2     0.0706 -0.1882]]\n&lt;strong&gt;A_inversa&lt;\/strong&gt;: \n&#091;&#091; 0.2    -0.1647  0.1059]\n &#091;-0.4     0.1529  0.2588]\n &#091; 0.2     0.0706 -0.1882]]\nverifica A.A_inversa = Identidad:\n&#091;&#091;1. 0. 0.]\n &#091;0. 1. 0.]\n &#091;0. 0. 1.]]<\/code><\/pre>\n\n\n\n<p><strong><em>Observe<\/em><\/strong> que el algoritmo se pude reducir si usan los procesos de Gauss-Jordan como funciones.<\/p>\n\n\n\n<p><em><strong>Tarea<\/strong><\/em>: Realizar el algoritmo usando una funci\u00f3n creada para Gauss-Jordan<\/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>Matriz inversa:<\/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\">librer\u00eda<\/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=\"libreria\">4. Funci\u00f3n en librer\u00eda Numpy<\/h2>\n\n\n\n<p>La funci\u00f3n en la librer\u00eda Numpy es <code>np.linalg.inv()<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>&gt;&gt;&gt; np.linalg.inv(A)\narray(&#091;&#091; 0.2       , -0.16470588,  0.10588235],\n       &#091;-0.4       ,  0.15294118,  0.25882353],\n       &#091; 0.2       ,  0.07058824, -0.18823529]])\n&gt;&gt;&gt; <\/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>Matriz inversa:<\/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\">librer\u00eda<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>Matriz inversa: Ejercicio Anal\u00edtico Algoritmo librer\u00eda 1. Ejercicio Referencia: Chapra 10.2 p292, Burden 6.3 p292, Rodr\u00edguez 4.2.5 Ejemplo 1 p118 Obtener la inversa de una matriz usando el m\u00e9todo de Gauss-Jordan, a partir de la matriz: Matriz inversa: Ejercicio Anal\u00edtico Algoritmo librer\u00eda 2. Desarrollo anal\u00edtico Para el procedimiento, se crea la matriz aumentada de A [&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-1214","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\/1214","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=1214"}],"version-history":[{"count":8,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1214\/revisions"}],"predecessor-version":[{"id":21566,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1214\/revisions\/21566"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=1214"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=1214"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=1214"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}