{"id":1228,"date":"2017-06-11T09:20:27","date_gmt":"2017-06-11T14:20:27","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/matg1013\/?p=1228"},"modified":"2026-05-07T18:12:55","modified_gmt":"2026-05-07T23:12:55","slug":"matriz-triangular-alu","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u03\/matriz-triangular-alu\/","title":{"rendered":"3.8 Matrices triangulares A=L.U 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\">Matriz A=L.U<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/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=\"#libreria\">librer\u00eda<\/a><\/p>\n\n\n\n<p><a href=\"#solucion\">soluci\u00f3n LY=B<\/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. Matrices triangulares A=L.U<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: Chapra 10.1 p284. Burden 6.5 p298<\/p>\n\n\n\n<p>Una matriz <strong>A<\/strong> puede separarse en dos matrices triangulares que entre ellas tienen la propiedad:&nbsp; <strong>A<\/strong> = <strong>L<\/strong>.<strong>U<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>L<\/strong> de tipo triangular inferior<\/li>\n\n\n\n<li><strong>U<\/strong> de tipo triangular superior<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"517\" height=\"191\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/06\/matrizlu01.png\" alt=\"matriz A=LU diagrama 01\" class=\"wp-image-13440\" \/><\/figure>\n\n\n\n<p>La matriz <strong>U<\/strong> se obtiene despu\u00e9s de aplicar el <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u03\/metodo-gauss\/#eliminaadelante\" data-type=\"post\" data-id=\"1212\">proceso de eliminaci\u00f3n hacia adelante<\/a> del m\u00e9todo de Gauss.<\/p>\n\n\n\n<p>La matriz <strong>L<\/strong> contiene los <strong>factor<\/strong>es usados en el proceso de eliminaci\u00f3n hacia adelante del m\u00e9todo de Gauss, escritos sobre una matriz identidad en las posiciones donde se calcularon.<\/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\">Matriz A=L.U<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/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=\"#libreria\">librer\u00eda<\/a><\/p>\n\n\n\n<p><a href=\"#solucion\">soluci\u00f3n LY=B<\/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>: Chapra Ejemplo 10.1 p285<\/p>\n\n\n\n<p>Presente las matrices <strong>LU<\/strong> de la matriz <strong>A<\/strong> siguiente:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> A= \\begin{pmatrix} 3 &amp; -0.1 &amp; -0.2 \\\\ 0.1 &amp; 7 &amp; -0.3 \\\\0.3 &amp; -0.2 &amp; 10 \\end{pmatrix}<\/span>\n\n\n\n<pre class=\"wp-block-code\"><code>A = &#091;&#091; 3. , -0.1, -0.2],\n     &#091; 0.1,  7. , -0.3],\n     &#091; 0.3, -0.2, 10. ]]\n\nB = &#091;7.85,-19.3,71.4]<\/code><\/pre>\n\n\n\n<p>El resultado del \"<a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u03\/pivoteo-parcial-filas\/\" data-type=\"post\" data-id=\"1226\">pivoteo por filas<\/a>\" y \"eliminaci\u00f3n hacia adelante\" se tiene:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Pivoteo parcial por filas\n&#091;&#091;  3.    -0.1   -0.2    7.85]\n &#091;  0.1    7.    -0.3  -19.3 ]\n &#091;  0.3   -0.2   10.    71.4 ]]<\/code><\/pre>\n\n\n\n<p>de donde la \u00faltima columna es el nuevo vector B<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>eliminaci\u00f3n hacia adelante\nMatriz U: \n&#091;&#091; 3.         -0.1        -0.2       ]\n &#091; 0.          7.00333333 -0.29333333]\n &#091; 0.          0.         10.01204188]]<\/code><\/pre>\n\n\n\n<p>Y guardando los factores del procedimiento de \"eliminaci\u00f3n hacia adelante \" en una matriz <strong>L<\/strong> que empieza con la matriz identidad se obtiene:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>matriz L: \n&#091;&#091; 1.          0.          0.        ]\n &#091; 0.03333333  1.          0.        ]\n &#091; 0.1        -0.02712994  1.        ]]<\/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\">Matriz A=L.U<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/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=\"#libreria\">librer\u00eda<\/a><\/p>\n\n\n\n<p><a href=\"#solucion\">soluci\u00f3n LY=B<\/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 LU en Python<\/h2>\n\n\n\n<p>Realizado a partir del algoritmo de la secci\u00f3n <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u03\/metodo-gauss\/\" data-type=\"post\" data-id=\"1212\">m\u00e9todo de Gauss<\/a> y modificando las partes necesarias para el algoritmo.<\/p>\n\n\n\n<p>Para \u00e9ste algoritmo, se procede desde el bloque de pivoteo por filas, continuando con el algoritmo de \"eliminaci\u00f3n hacia adelante\" del m\u00e9todo de Gauss.\u00a0 Procedimientos que dan como resultado la matriz <strong>U<\/strong>.<\/p>\n\n\n\n<p>La matriz <strong>L<\/strong> requiere iniciar con una matriz identidad,&nbsp; y el procedimiento requiere que al ejecutar \"eliminaci\u00f3n hacia adelante\" se almacene cada factor con el que se multiplica la fila para hacer cero. El factor se lo almacena en la matriz <strong>L<\/strong>, en la posici\u00f3n de d\u00f3nde se determin\u00f3 el factor.<\/p>\n\n\n\n<p>El resultado obtenido con el algoritmo es:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Matriz aumentada\n&#091;&#091;  3.    -0.1   -0.2    7.85]\n &#091;  0.1    7.    -0.3  -19.3 ]\n &#091;  0.3   -0.2   10.    71.4 ]]\nPivoteo parcial:\n  Pivoteo por filas NO requerido\nmatriz L: \n&#091;&#091; 1.      0.      0.    ]\n &#091; 0.0333  1.      0.    ]\n &#091; 0.1    -0.0271  1.    ]]\nMatriz U: \n&#091;&#091; 3.     -0.1    -0.2   ]\n &#091; 0.      7.0033 -0.2933]\n &#091; 0.      0.     10.012 ]]\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<p>Donde se puede verificar que L.U = A usando la instrucci\u00f3n <code>np.dot(L.U)<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; np.dot(L,U)\narray(&#091;&#091; 3. , -0.1, -0.2],\n       &#091; 0.1,  7. , -0.3],\n       &#091; 0.3, -0.2, 10. ]])\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Matrices L y U\n# Modificando el m\u00e9todo de Gauss\nimport numpy as np\n\n# PROGRAMA ------------\n# INGRESO\nA = &#x5B;&#x5B; 3. , -0.1, -0.2],\n     &#x5B; 0.1,  7. , -0.3],\n     &#x5B; 0.3, -0.2, 10. ]]\n\nB = &#x5B;7.85,-19.3,71.4]\n\n# PROCEDIMIENTO\nnp.set_printoptions(precision=4) # 4 decimales en print\ncasicero = 1e-15  # redondear a cero\n\ndef pivoteafila(A,B,vertabla=False):\n    '''\n    Pivotea parcial por filas\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\nAB = pivoteafila(A,B,vertabla=True)\n\ntamano = np.shape(AB)\nn = tamano&#x5B;0]\nm = tamano&#x5B;1]\n\nAB0 = np.copy(AB)\n\nL = np.identity(n,dtype=float) # Inicializa L\n\n# eliminacion hacia adelante\nfor i in range(0,n-1,1):\n    pivote = AB&#x5B;i,i]\n    adelante = i+1\n    for k in range(adelante,n,1):\n        factor = AB&#x5B;k,i]\/pivote\n        AB&#x5B;k,:] = AB&#x5B;k,:] - AB&#x5B;i,:]*factor\n        \n        L&#x5B;k,i] = factor # llena L\n\nU = np.copy(AB&#x5B;:,:n])\n\n# SALIDA\nprint('matriz L: ')\nprint(L)\nprint('Matriz U: ')\nprint(U)\n<\/pre><\/div>\n\n\n<p>Si se requiere una respuesta unificada en una variable, se puede convertir en una arreglo de matrices [<strong>L<\/strong>,<strong>U<\/strong>].<\/p>\n\n\n\n<p>Las matrices <strong>L<\/strong> y <strong>U<\/strong> se pueden leer como <strong>L<\/strong>=LU[0] y <strong>U<\/strong>=LU[1]<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\nLU = np.array(&#x5B;L,U])\n\n# SALIDA\nprint('triangular inferior L')\nprint(LU&#x5B;0])\nprint('triangular superior U')\nprint(LU&#x5B;1])\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\">Matriz A=L.U<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/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=\"#libreria\">librer\u00eda<\/a><\/p>\n\n\n\n<p><a href=\"#solucion\">soluci\u00f3n LY=B<\/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\">4. Algoritmo como Funci\u00f3n de Python<\/h2>\n\n\n\n<p>El resultado a obtener es:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Matriz aumentada\n&#091;&#091;  3.    -0.1   -0.2    7.85]\n &#091;  0.1    7.    -0.3  -19.3 ]\n &#091;  0.3   -0.2   10.    71.4 ]]\nPivoteo parcial:\n  Pivoteo por filas NO requerido\nElimina hacia adelante:\n fila 0 pivote:  3.0\n   factor:  0.03333333333333333  para fila:  1\n   factor:  0.09999999999999999  para fila:  2\n fila 1 pivote:  7.003333333333333\n   factor:  -0.027129938124702525  para fila:  2\n fila 2 pivote:  10.012041884816753\n&#091;&#091;  3.      -0.1     -0.2      7.85  ]\n &#091;  0.       7.0033  -0.2933 -19.5617]\n &#091;  0.       0.      10.012   70.0843]]\nmatriz L: \n&#091;&#091; 1.      0.      0.    ]\n &#091; 0.0333  1.      0.    ]\n &#091; 0.1    -0.0271  1.    ]]\nMatriz U: \n&#091;&#091;  3.      -0.1     -0.2      7.85  ]\n &#091;  0.       7.0033  -0.2933 -19.5617]\n &#091;  0.       0.      10.012   70.0843]]\n&gt;&gt;&gt;<\/code><\/pre>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Matrices L y U\n# Modificando el m\u00e9todo de Gauss\nimport numpy as np\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,lu=False,casicero = 1e-15):\n    ''' Gauss elimina hacia adelante, a partir de,\n    matriz aumentada y pivoteada.\n    Para respuesta en forma A=L.U usar lu=True entrega&#x5B;AB,L,U]\n    '''\n    tamano = np.shape(AB)\n    n = tamano&#x5B;0]\n    m = tamano&#x5B;1]\n    L = np.identity(n,dtype=float) # Inicializa L\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,'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\n                L&#x5B;k,i] = factor # llena L\n                \n                if vertabla==True:\n                    print('   factor: ',factor,' para fila: ',k)\n            else:\n                print('  pivote:', pivote,'en fila:',i,\n                      'genera division para cero')\n    respuesta = AB\n    if vertabla==True:\n        print(AB)\n    if lu==True:\n        U = AB&#x5B;:,:n-1]\n        respuesta = &#x5B;AB,L,U]\n    return(respuesta)\n\n# PROGRAMA ------------------------\n# INGRESO\nA = &#x5B;&#x5B; 3. , -0.1, -0.2],\n     &#x5B; 0.1,  7. , -0.3],\n     &#x5B; 0.3, -0.2, 10. ]]\n\nB = &#x5B;7.85,-19.3,71.4]\n\n# PROCEDIMIENTO\nnp.set_printoptions(precision=4) # 4 decimales en print\ncasicero = 1e-15  # redondear a cero\n\nAB = pivoteafila(A,B,vertabla=True)\n\nAB = gauss_eliminaAdelante(AB,vertabla=True, lu=True)\nL = AB&#x5B;1]\nU = AB&#x5B;0]\n\n# SALIDA\nprint('matriz L: ')\nprint(L)\nprint('Matriz U: ')\nprint(U)\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\">Matriz A=L.U<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/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=\"#libreria\">librer\u00eda<\/a><\/p>\n\n\n\n<p><a href=\"#solucion\">soluci\u00f3n LY=B<\/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\">5. Funci\u00f3n en librer\u00eda Scipy.linalg.lu<\/h2>\n\n\n\n<p>Luego del resultado o definida la matriz a, la instrucci\u00f3n en la librer\u00eda Scipy es:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>&gt;&gt;&gt; import scipy as sp\n&gt;&gt;&gt; &#091;L,U] =sp.linalg.lu(A,permute_l=True)\n&gt;&gt;&gt; L\narray(&#091;&#091; 1.        ,  0.        ,  0.        ],\n       &#091; 0.03333333,  1.        ,  0.        ],\n       &#091; 0.1       , -0.02712994,  1.        ]])\n&gt;&gt;&gt; U\narray(&#091;&#091; 3.        , -0.1       , -0.2       ],\n       &#091; 0.        ,  7.00333333, -0.29333333],\n       &#091; 0.        ,  0.        , 10.01204188]])\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><a href=\"#concepto\">Matriz A=L.U<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/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=\"#libreria\">librer\u00eda<\/a><\/p>\n\n\n\n<p><a href=\"#solucion\">soluci\u00f3n LY=B<\/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=\"solucion\">6. Soluci\u00f3n con&nbsp;LY=B ,&nbsp;UX=Y<\/h2>\n\n\n\n<p><strong>Referencia<\/strong>: Chapra 10.2 p287, pdf312<\/p>\n\n\n\n<p>Se plantea resolver el sistema de ecuaciones usando matrices triangulares<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> A = \\begin{pmatrix} 3 &amp; -0.1 &amp; -0.2 \\\\ 0.1 &amp; 7 &amp; -0.3 \\\\0.3 &amp; -0.2 &amp; 10 \\end{pmatrix}<\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> B = [7.85,-19.3,71.4]<\/span>\n\n\n\n<p>Para encontrar la soluci\u00f3n al sistema de ecuaciones, se plantea resolver:<\/p>\n\n\n\n<p>- sustituci\u00f3n hacia adelante de LY=B<br>- sustituci\u00f3n hacia atr\u00e1s para UX=Y<\/p>\n\n\n\n<p>Al algoritmo de la secci\u00f3n anterior se a\u00f1ade los procedimientos correspondientes con los que se obtiene la soluci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Matriz aumentada\n&#091;&#091;  3.    -0.1   -0.2    7.85]\n &#091;  0.1    7.    -0.3  -19.3 ]\n &#091;  0.3   -0.2   10.    71.4 ]]\nPivoteo parcial:\n  Pivoteo por filas NO requerido\nmatriz L: \n&#091;&#091; 1.          0.          0.        ]\n &#091; 0.03333333  1.          0.        ]\n &#091; 0.1        -0.02712994  1.        ]]\nMatriz U: \n&#091;&#091; 3.         -0.1        -0.2       ]\n &#091; 0.          7.00333333 -0.29333333]\n &#091; 0.          0.         10.01204188]]\nB1 :\n&#091;&#091;  7.85]\n &#091;-19.3 ]\n &#091; 71.4 ]]\nY Sustituci\u00f3n hacia adelante\n&#091;&#091;  7.85      ]\n &#091;-19.56166667]\n &#091; 70.08429319]]\nX Sustituci\u00f3n hacia atras\n&#091; 3.  -2.5  7. ]\n&gt;&gt;&gt;<\/code><\/pre>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Soluci\u00f3n usando Matrices L y U\n# continuaci\u00f3n de ejercicio anterior\nimport numpy as np\n\n# PROGRAMA ------------\n# INGRESO\nA = &#x5B;&#x5B; 3. , -0.1, -0.2],\n     &#x5B; 0.1,  7. , -0.3],\n     &#x5B; 0.3, -0.2, 10. ]]\n\nB = &#x5B;7.85,-19.3,71.4]\n\n# PROCEDIMIENTO\nnp.set_printoptions(precision=4) # 4 decimales en print\ncasicero = 1e-15  # redondear a cero\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\nAB = pivoteafila(A,B,vertabla=True)\n\ntamano = np.shape(AB)\nn = tamano&#x5B;0]\nm = tamano&#x5B;1]\n\nAB0 = np.copy(AB)\nB1 = np.copy(AB&#x5B;:,m-1])\n\n# Matrices L y U\nL = np.identity(n,dtype=float) # Inicializa L\n# eliminacion hacia adelante\nfor i in range(0,n-1,1):\n    pivote = AB&#x5B;i,i]\n    adelante = i+1\n    for k in range(adelante,n,1):\n        factor = AB&#x5B;k,i]\/pivote\n        AB&#x5B;k,:] = AB&#x5B;k,:] - AB&#x5B;i,:]*factor\n        \n        L&#x5B;k,i] = factor # llena L\n\nU = np.copy(AB&#x5B;:,:n])\n\n# Resolver LY = B\nB1  = np.transpose(&#x5B;B1])\nAB =np.concatenate((L,B1),axis=1)\n\n# sustituci\u00f3n hacia adelante\nY = np.zeros(n,dtype=float)\nY&#x5B;0] = AB&#x5B;0,n]\nfor i in range(1,n,1):\n    suma = 0\n    for j in range(0,i,1):\n        suma = suma + AB&#x5B;i,j]*Y&#x5B;j]\n    b = AB&#x5B;i,n]\n    Y&#x5B;i] = (b-suma)\/AB&#x5B;i,i]\n\nY = np.transpose(&#x5B;Y])\n\n# Resolver UX = Y\nAB =np.concatenate((U,Y),axis=1)\n\n# sustituci\u00f3n hacia atr\u00e1s\nultfila = n-1\nultcolumna = m-1\nX = np.zeros(n,dtype=float)\n\nfor i in range(ultfila,0-1,-1):\n    suma = 0\n    for j in range(i+1,ultcolumna,1):\n        suma = suma + AB&#x5B;i,j]*X&#x5B;j]\n    b = AB&#x5B;i,ultcolumna]\n    X&#x5B;i] = (b-suma)\/AB&#x5B;i,i]\n\n# SALIDA\nprint('matriz L: ')\nprint(L)\nprint('Matriz U: ')\nprint(U)\nprint('B1 :')\nprint(B1)\nprint('Y Sustituci\u00f3n hacia adelante')\nprint(Y)\nprint('X Sustituci\u00f3n hacia atras')\nprint(X)\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\">Matriz A=L.U<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/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=\"#libreria\">librer\u00eda<\/a><\/p>\n\n\n\n<p><a href=\"#solucion\">soluci\u00f3n LY=B<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>Matriz A=L.U Ejercicio Algoritmo funci\u00f3n librer\u00eda soluci\u00f3n LY=B 1. Matrices triangulares A=L.U Referencia: Chapra 10.1 p284. Burden 6.5 p298 Una matriz A puede separarse en dos matrices triangulares que entre ellas tienen la propiedad:&nbsp; A = L.U: La matriz U se obtiene despu\u00e9s de aplicar el proceso de eliminaci\u00f3n hacia adelante del m\u00e9todo de Gauss. [&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-1228","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\/1228","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=1228"}],"version-history":[{"count":7,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1228\/revisions"}],"predecessor-version":[{"id":24572,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1228\/revisions\/24572"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=1228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=1228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=1228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}