{"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-02-15T06:11:21","modified_gmt":"2026-02-15T11:11:21","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-unidades\/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-unidades\/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-unidades\/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 <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u03\/pivoteo-parcial-filas\/\" data-type=\"post\" data-id=\"1226\">pivoteo por filas<\/a>, continuando con el algoritmo de \"eliminaci\u00f3n hacia adelante\" del m\u00e9todo de Gauss.&nbsp; 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":6,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1228\/revisions"}],"predecessor-version":[{"id":21562,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1228\/revisions\/21562"}],"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}]}}