{"id":1226,"date":"2017-06-03T09:05:16","date_gmt":"2017-06-03T14:05:16","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/matg1013\/?p=1226"},"modified":"2026-03-31T15:57:21","modified_gmt":"2026-03-31T20:57:21","slug":"pivoteo-parcial-filas","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u03\/pivoteo-parcial-filas\/","title":{"rendered":"3.2 Pivoteo parcial por filas con Python"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p><a href=\"#pivoteo\">Pivoteo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#matrizaumentada\">Matriz Aumentada<\/a> <\/p>\n\n\n\n<p><a href=\"#pivoteofilas\">Pivoteo filas<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/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\n\n\n<p><a href=\"#ejercicio2\">ejercicio2<\/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=\"pivoteo\">1. Pivoteo - Concepto<\/h2>\n\n\n\n<figure class=\"wp-block-image alignleft size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"311\" height=\"255\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/06\/pivoteofilas_animado.gif\" alt=\"pivoteo filas gr\u00e1fico animado\" class=\"wp-image-13393\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"399\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2025\/11\/montana-huayna-picchu.png\" alt=\"montana cresta posici\u00f3n dominante en matriz\" class=\"wp-image-13395\" style=\"width:300px\" \/><\/figure>\n\n\n\n<p><strong>Referencia<\/strong>: Chapra 9.4.2 p268. Burden 6.2 p279. Rodr\u00edguez 4.0 p105<\/p>\n\n\n\n<p>Los m\u00e9todos de soluci\u00f3n a sistemas de ecuaciones en los primeros pasos usan la <strong>matriz aumentada<\/strong> y <strong>pivoteada por filas<\/strong>.<\/p>\n\n\n\n<p>Como es un procedimiento usado en todos los m\u00e9todos de la unidad, para simplificar se presenta como uno de los primeros algoritmos.<\/p>\n\n\n\n<p>El objetivo del pivoteo es ordenar la matriz para que en lo posible sea diagonal dominante.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> |a_{i,i}| \\geq \\sum_{j=0 ; i\\neq j}^n |a_{i,j}| <\/span>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p><a href=\"#pivoteo\">Pivoteo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#matrizaumentada\">Matriz Aumentada<\/a> <\/p>\n\n\n\n<p><a href=\"#pivoteofilas\">Pivoteo filas<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/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\n\n\n<p><a href=\"#ejercicio2\">ejercicio2<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ejercicio\">2. Ejercicio<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-eval\/mn-1e15\/1eva2011tii_t2-sistema-de-ecuaciones-diagonal-dominante\/\" data-type=\"post\" data-id=\"407\">1Eva2011TII_T2 Sistema de Ecuaciones, diagonal dominante<\/a><\/p>\n\n\n\n<p>Considere el siguiente sistema de ecuaciones AX=B dado por:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{cases} -2x+5y+9z=1\\\\7x+y+z=6\\\\-3x+7y-z=-26\\end{cases} <\/span>\n\n\n\n<p>Realice el <strong>pivoteo parcial por filas<\/strong>, de tal manera que la diagonal de A sea estrictamente dominante.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p><a href=\"#pivoteo\">Pivoteo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#matrizaumentada\">Matriz Aumentada<\/a> <\/p>\n\n\n\n<p><a href=\"#pivoteofilas\">Pivoteo filas<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/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\n\n\n<p><a href=\"#ejercicio2\">ejercicio2<\/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=\"matrizaumentada\">3. Matriz Aumentada<\/h2>\n\n\n\n<p>El sistema de ecuaciones se escribe en la forma algebraica como matrices y vectores de la forma Ax=B<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{pmatrix} -2 &amp; 5 &amp; 9 \\\\ 7 &amp; 1 &amp; 1 \\\\-3 &amp; 7 &amp; -1 \\end{pmatrix} \\begin{pmatrix} x_0 \\\\ x_1 \\\\ x_2 \\end{pmatrix} = \\begin{pmatrix} 1 \\\\ 6 \\\\ -26 \\end{pmatrix} <\/span>\n\n\n\n<p>Para el algoritmo, las ecuaciones se escriben en forma de matriz A y vector B.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>A = &#091;&#091;-2, 5, 9],\n     &#091; 7, 1, 1],\n     &#091;-3, 7,-1]]\n\nB = &#091;1,6,-26]<\/code><\/pre>\n\n\n\n<p>Las matrices y vectores se procesan como arreglos&nbsp;<code>np.array()<\/code> de n\u00fameros reales.&nbsp;<em><strong>No se usan listas.<\/strong><\/em><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\nA = np.array(A,dtype=float)\nB = np.array(B,dtype=float)\n<\/pre><\/div>\n\n\n<p>El vector B para la matriz aumentada se usa en forma de columna.&nbsp;Se aumenta una dimensi\u00f3n <code>[B]<\/code> y se aplica la transpuesta.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\nB_columna = np.transpose(&#x5B;B])\n<\/pre><\/div>\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; B_columna\narray(&#091;&#091;  1],\n       &#091;  6],\n       &#091;-26]])<\/code><\/pre>\n\n\n\n<p>La matriz aumentada AB se forma al concatenar <strong>por columnas<\/strong> la matriz A con el vector B_columna,&nbsp; usando el par\u00e1metro <code>axis=1<\/code>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\nAB = np.concatenate((A,B_columna),axis=1)\n<\/pre><\/div>\n\n\n<p>el resultado AB se muestra como:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; AB\narray(&#091;&#091; -2. ,  5. ,   9. ,   1.],\n       &#091;  7. ,  1. ,   1. ,   6.],\n       &#091; -3. ,  7. ,  -1. , -26.]])<\/code><\/pre>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\left( \\begin{array}{rrr|r} -2 &amp; 5 &amp; 9 &amp; 1 \\\\ 7 &amp; 1 &amp; 1 &amp; 6 \\\\ -3 &amp; 7 &amp; -1 &amp; -26 \\end{array} \\right)<\/span>\n\n\n\n<p>En varios algoritmos se usa la <strong>matriz aumentada<\/strong> AB, para mantener el orden entre filas de A y B al aplicar cambios de fila.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p><a href=\"#pivoteo\">Pivoteo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#matrizaumentada\">Matriz Aumentada<\/a> <\/p>\n\n\n\n<p><a href=\"#pivoteofilas\">Pivoteo filas<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/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\n\n\n<p><a href=\"#ejercicio2\">ejercicio2<\/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=\"pivoteofilas\">4. Pivoteo parcial por filas<\/h2>\n\n\n\n<figure class=\"wp-block-image alignright size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"311\" height=\"255\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/06\/pivoteofilas00.png\" alt=\"pivoteo filas 00\" class=\"wp-image-13399\" \/><\/figure>\n\n\n\n<p>Para el <strong><em>pivoteo por filas<\/em><\/strong> de la matriz aumentada <strong>AB<\/strong>, tiene como primer paso revisar la primera <strong>columna<\/strong>, desde la posici\u00f3n diagonal hacia todas las filas por debajo, usando solo la magnitud de los coeficientes |A|.<\/p>\n\n\n\n<p>La representaci\u00f3n gr\u00e1fica de la matriz A, permite visualizar los intercambios de fila.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; AB\narray(&#091;&#091; <strong><span style=\"color: #ff0000\">-2.<\/span><\/strong> ,  5. ,   9. ,   1.],\n       <strong>&#091;  <span style=\"color: #ff0000\">7.<\/span> ,  1. ,   1. ,   6.]<\/strong>,\n       &#091; <strong><span style=\"color: #ff0000\">-3.<\/span><\/strong> ,  7. ,  -1. , -26.]])<\/code><\/pre>\n\n\n\n<p>Las instrucciones para seleccionar la <strong>columna<\/strong>, usar el valor <strong>abs<\/strong>oluto y <strong>d\u00f3nde<\/strong> se encuentra el <strong>m\u00e1x<\/strong>imo son:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\ncolumna = abs(AB&#x5B;i:,i])\ndondemax = np.argmax(columna)\n<\/pre><\/div>\n\n\n<p>Los valores de la columna se reducen a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>columna = &#091; | -2.|,   <em>fila=0<\/em>\n            |  <strong><span style=\"color: #ff0000\">7.<\/span><\/strong>|,   <em>fila=1<\/em>\n            | -3.| ]  <em>fila=2<\/em>\ndondemax = 1<\/code><\/pre>\n\n\n\n<p>Si la magnitud de mayor valor no est\u00e1 en la diagonal (<em>dondemax\u22600<\/em>), se realiza el intercambio entre la fila <strong>dondemax<\/strong> y la fila de la diagonal <strong>i<\/strong> en AB.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AB = &#091;<strong>&#091;  <span style=\"color: #ff0000\">7.<\/span> ,  1. ,   1. ,   6.]<\/strong>,\n      &#091; -2. ,  5. ,   9. ,   1.],\n      &#091; -3. ,  7. ,  -1. , -26.]]<\/code><\/pre>\n\n\n\n<p>En \u00e9ste paso se asegura que en la casilla AB[0,0] se encuentre el mayor valor de la columna 1.<\/p>\n\n\n\n<p>El intercambio de filas requiere tres pasos: realizar una copia de la fila que se esta analizando en un vector <code>temporal<\/code>. Luego se copian los valores en la fila AB[dondemax+i] en la fila AB[i]. Finalmente actualizando la fila&nbsp;AB[dondemax+i] con los valores de <code>temporal<\/code>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\n    if (dondemax !=0): # NO en diagonal\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<\/pre><\/div>\n\n\n<figure class=\"wp-block-image alignright size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"312\" height=\"255\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/06\/pivoteofilas01.png\" alt=\"pivoteo filas 01\" class=\"wp-image-13400\" \/><\/figure>\n\n\n\n<p>Se repite el proceso anterior para la siguiente columna (j=1), pero siempre formada desde la diagonal (i=j).<\/p>\n\n\n\n<p>La columna en \u00e9ste paso se reduce el tama\u00f1o en una posici\u00f3n. Se consideran solo las magnitudes para la selecci\u00f3n de <strong>dondemax<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AB = &#091;&#091;  7. ,  1. ,   1. ,   6.],\n      &#091; -2. ,  <strong><span style=\"color: #ff0000\">5.<\/span><\/strong> ,   9. ,   1.],\n      &#091; -3. ,  <strong><span style=\"color: #ff0000\">7.<\/span><\/strong> ,  -1. , -26.]]<\/code><\/pre>\n\n\n\n<p>Los valores de la columna se reducen a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>columna = &#091; |5|,   <em>fila=0<\/em>\n            |7| ]  <em>fila=1<\/em>\ndondemax = 1<\/code><\/pre>\n\n\n\n<p>En el ejercicio se encuentra que: la magnitud de mayor valor est\u00e1 en la fila=1, no en la diagonal. Se realiza el intercambio entre la fila 'i' y la fila (dondemax+i) de AB.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AB = (&#091;&#091;  7. ,  1. ,   1. ,   6.],\n       <strong>&#091; -3. ,  <span style=\"color: #ff0000\">7.<\/span> ,  -1. , -26.]<\/strong>,\n       &#091; -2. ,  5. ,   9. ,   1.]]<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image alignright size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"312\" height=\"255\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/06\/pivoteofilas03.png\" alt=\"pivoteo filas 03\" class=\"wp-image-13401\" \/><\/figure>\n\n\n\n<p>Se repite el proceso para la tercera columna desde la diagonal, que resulta tener solo una casilla (columna =[9]) y no ser requiere continuar.<\/p>\n\n\n\n<p>En la gr\u00e1fica se destaca el resultado del pivoteo por filas, acercando en lo posible a una matriz diagonal dominante.<\/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\n<p><strong>Tarea<\/strong>: Revisar cuando en una columna se tiene dos valores mayores de igual valor. Ampliar el algoritmo. Considere como ejemplo del caso planteado:&nbsp;<a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-eval\/mn-1e15\/1eva2011ti_t2-alimentos-de-animales\/\" data-type=\"post\" data-id=\"400\">1Eva2011TI_T2_MN Alimentos para animales<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p><a href=\"#pivoteo\">Pivoteo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#matrizaumentada\">Matriz Aumentada<\/a> <\/p>\n\n\n\n<p><a href=\"#pivoteofilas\">Pivoteo filas<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/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\n\n\n<p><a href=\"#ejercicio2\">ejercicio2<\/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\">5. Algoritmo en Python<\/h2>\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=\"Pivoteo Parcial por Filas con matriz aumentada en Python - M\u00e9todos Num\u00e9ricos\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/4225zz_FEpc?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>Para realizar el algoritmo, es de recordar que para realizar operaciones en una matriz sin alterar la original, se usa una <em><strong>copia<\/strong><\/em> de la matriz (<code>np.copy<\/code>).&nbsp; Con la copia de la matriz, se puede comparar y observar los cambios entre la matriz original y la copia a la que se aplicaron cambios.<\/p>\n\n\n\n<p>Si no es necesaria la comparaci\u00f3n entre el antes y despu\u00e9s, no se realiza la copia y se ahorra el espacio de memoria, detalle importante para matrices de \"gran tama\u00f1o\" y una computadora con \"limitada\" memoria.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Pivoteo parcial por filas\nimport numpy as np\n\n# INGRESO\nA = &#x5B;&#x5B;-2, 5, 9],\n     &#x5B; 7, 1, 1],\n     &#x5B;-3, 7,-1]]\nB = &#x5B;1,6,-26]\n\n# PROCEDIMIENTO\n# Matrices como arreglo, numeros reales\nA = np.array(A,dtype=float)\nB = np.array(B,dtype=float)\n\n# Matriz aumentada AB\nB_columna = np.transpose(&#x5B;B])\nAB  = np.concatenate((A,B_columna),axis=1)\nAB0 = np.copy(AB) # copia de AB\n\n# Pivoteo parcial por filas\ntamano = np.shape(AB)\nn = tamano&#x5B;0]\nm = tamano&#x5B;1]\n\n# Para cada fila en AB\nfor i in range(0,n-1,1):\n    # columna desde diagonal i en adelante\n    columna = abs(AB&#x5B;i:,i])\n    dondemax = np.argmax(columna)\n    \n    if (dondemax !=0): # NO en diagonal\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# Actualiza A y B pivoteado\nA = AB&#x5B;:,:n]\nB = AB&#x5B;:,n]\n\n# SALIDA\nprint('Matriz aumentada:')\nprint(AB0)\nprint('Pivoteo parcial por filas AB:')\nprint(AB)\nprint('A:')\nprint(A)\nprint('B:')\nprint(B)\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p><a href=\"#pivoteo\">Pivoteo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#matrizaumentada\">Matriz Aumentada<\/a> <\/p>\n\n\n\n<p><a href=\"#pivoteofilas\">Pivoteo filas<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/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\n\n\n<p><a href=\"#ejercicio2\">ejercicio2<\/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\">6. Funci\u00f3n pivoteafila(M)<\/h2>\n\n\n\n<p>Los bloques de cada procedimiento que se repiten en otros m\u00e9todos se convierten a funciones <code>def-return<\/code>, empaquetando las soluciones algor\u00edtmicas.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Pivoteo parcial por filas, funcion\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            print(AB)\n    return(AB)\n\n# INGRESO\nA = &#x5B;&#x5B;-2, 5, 9],\n     &#x5B; 7, 1, 1],\n     &#x5B;-3, 7,-1]]\nB = &#x5B;1,6,-26]\n\n# PROCEDIMIENTO\nAB = pivoteafila(A,B,vertabla=True)\nn = len(AB)\n\n# Actualiza A y B pivoteado\nA = AB&#x5B;:,:n]\nB = AB&#x5B;:,n]\n\n# SALIDA\nprint('Pivoteo parcial por filas AB:')\nprint(AB)\nprint('A:')\nprint(A)\nprint('B:')\nprint(B)\n<\/pre><\/div>\n\n\n<p>El resultado del ejercicio es:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Matriz aumentada\n&#091;&#091; -2.   5.   9.   1.]\n &#091;  7.   1.   1.   6.]\n &#091; -3.   7.  -1. -26.]]\nPivoteo parcial:\n  1 intercambiar filas:  0 con 1\n  2 intercambiar filas:  1 con 2\n&#091;&#091;  7.   1.   1.   6.]\n &#091; -3.   7.  -1. -26.]\n &#091; -2.   5.   9.   1.]]\nPivoteo 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\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p><a href=\"#pivoteo\">Pivoteo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#matrizaumentada\">Matriz Aumentada<\/a> <\/p>\n\n\n\n<p><a href=\"#pivoteofilas\">Pivoteo filas<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/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\n\n\n<p><a href=\"#ejercicio2\">ejercicio2<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"grafica\">7. Gr\u00e1fica de Matriz A en 3D<\/h2>\n\n\n\n<p>Instrucciones para la gr\u00e1fica en 3D de una matriz A. Las alturas de las barras son relativas a los valores de la casilla A[i,j]<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Matriz A como Barras3D\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# INGRESO\n##A = &#x5B;&#x5B;-2, 5, 9],\n##     &#x5B; 7, 1, 1],\n##     &#x5B;-3, 7,-1]]\n##titulo = 'matriz A'\n\n##A = &#x5B;&#x5B; 7, 1, 1],\n##     &#x5B;-2, 5, 9],\n##     &#x5B;-3, 7,-1]]\n##titulo = 'A pivotea fila0 y fila1'\n\n##A = &#x5B;&#x5B; 7, 1, 1],\n##     &#x5B;-3, 7,-1],\n##     &#x5B;-2, 5, 9]]\n##titulo = 'A pivotea fila1 y fila2'\n\nA = &#x5B;&#x5B; 7, 1, 1],\n     &#x5B;-3, 7,-1],\n     &#x5B;-2, 5, 9]]\ntitulo='A: Pivoteo por Filas'\n\n# PROCEDIMIENTO\nA = np.array(A, dtype=float)\nn,m = np.shape(A)\n\n# para grafica 3D\nxi = np.arange(0,n,1)\nyj = np.arange(0,m,1)\nXi,Yj = np.meshgrid(xi,yj)\n\nA_min = np.min(&#x5B;np.min(A),-3])\nA_max = np.max(&#x5B;np.max(A),9])\n\n# SALIDA\n# Grafica barras 3D\nfig3D = plt.figure()\ngraf3D = fig3D.add_subplot(111,projection='3d')\n\nAT = np.transpose(A) # filas en x, columnas en y\nh = 0.5 # Barras ancho y profundidad\ncolor_A = AT.ravel()\/A_max\ncolor_ij = plt.cm.rainbow(color_A)\n\ngraf3D.bar3d(Xi.ravel(),Yj.ravel(),\n             np.zeros(n*m),h,h,\n             AT.ravel(),color=color_ij)\n\n# escala eje z\ngraf3D.set_zlim(A_min,A_max)\n# etiqueta\ngraf3D.set_xlabel('filas i')\ngraf3D.set_ylabel('columnas j')\ngraf3D.set_zlabel('A&#x5B;i,j]')\ngraf3D.set_title(titulo)\n# etiquetas ejes\ngraf3D.xaxis.set_ticks(xi + h\/2)\ngraf3D.xaxis.set_ticklabels(xi)\ngraf3D.yaxis.set_ticks(yj + h\/2)\ngraf3D.yaxis.set_ticklabels(yj)\n# Barra de color\ncolor_escala = plt.Normalize(A_min,A_max)\ncolor_barra = plt.cm.ScalarMappable(norm=color_escala,\n                cmap=plt.colormaps&#x5B;&quot;rainbow&quot;])\nfig3D.colorbar(color_barra,ax=graf3D,label=&quot;A&#x5B;i,j]&quot;)\n\ngraf3D.view_init(35,35)\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 alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p><a href=\"#pivoteo\">Pivoteo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#matrizaumentada\">Matriz Aumentada<\/a> <\/p>\n\n\n\n<p><a href=\"#pivoteofilas\">Pivoteo filas<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/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\n\n\n<p><a href=\"#ejercicio2\">ejercicio2<\/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=\"ejercicio2\">8. Ejercicio 2<\/h2>\n\n\n\n<figure class=\"wp-block-image alignright size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"289\" height=\"249\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/06\/vendefrutas01.png\" alt=\"vende frutas 01\" class=\"wp-image-13402\" \/><\/figure>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>:&nbsp;Rodr\u00edguez 4.0 p105,&nbsp; <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-eval\/mn-1e2010\/1eva2010ti_t3_mn-precio-articulos\/\" data-type=\"post\" data-id=\"757\">1Eva2010TI_T3_MN Precio art\u00edculos<\/a><\/p>\n\n\n\n<p><strong>Ejemplo 1<\/strong>. Un comerciante compra tres productos A, B, C, pero en las facturas \u00fanicamente consta la <strong>cantidad<\/strong> comprada en Kg y el <strong>valor<\/strong> total de la compra.<\/p>\n\n\n\n<p>Se necesita determinar el precio unitario de cada producto.&nbsp; Dispone de solo tres facturas con los siguientes datos:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&nbsp;<\/td><td colspan=\"3\">Cantidad<\/td><td>Valor ($)<\/td><\/tr><tr><td>Factura<\/td><th>X<sub>0<\/sub><\/th><th>X<sub>1<\/sub><\/th><th>X<sub>2<\/sub><\/th><th>Pagado<\/th><\/tr><tr><td>1<\/td><td>4<\/td><td>2<\/td><td>5<\/td><td>60.70<\/td><\/tr><tr><td>2<\/td><td>2<\/td><td>5<\/td><td>8<\/td><td>92.90<\/td><\/tr><tr><td>3<\/td><td>5<\/td><td>4<\/td><td>3<\/td><td>56.30<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Los precios unitarios se pueden representar por las variables x<sub>0<\/sub>, x<sub>1<\/sub>, x<sub>2<\/sub> para escribir el sistema de ecuaciones que muestran las relaciones de cantidad, precio y valor pagado:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{cases} 4x_0+2x_1+5x_2 = 60.70 \\\\ 2x_0+5x_1+8x_2 = 92.90 \\\\ 5x_0+4x_1+3x_2 = 56.30 \\end{cases} <\/span>\n\n\n\n<p>Desarrollo<\/p>\n\n\n\n<p>El sistema de ecuaciones se escribe en la forma algebraica como matrices y vectores de la forma Ax=B<\/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} \\begin{pmatrix} x_0 \\\\ x_1 \\\\ x_2 \\end{pmatrix} = \\begin{pmatrix} 60.70 \\\\ 92.90 \\\\ 56.30 \\end{pmatrix} <\/span>\n\n\n\n<p>La matriz aumentada usando el algoritmo tiene como resultado:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; AB\narray(&#091;&#091; 4. ,  2. ,  5. , 60.7],\n       &#091; 2. ,  5. ,  8. , 92.9],\n       &#091; 5. ,  4. ,  3. , 56.3]])<\/code><\/pre>\n\n\n\n<p>En varios algoritmos se usa la <strong>matriz aumentada<\/strong> AB, para mantener el orden entre filas al aplicar cambios de fila.<\/p>\n\n\n\n<p>Para el <strong><em>pivoteo por fila<\/em><\/strong> de la matriz aumentada <strong>AB<\/strong>, tiene como primer paso revisar la primera <strong>columna<\/strong> desde la diagonal en adelante.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; AB\narray(&#091;&#091; <strong>4.<\/strong> ,  2. ,  5. , 60.7],\n       &#091; <strong>2.<\/strong> ,  5. ,  8. , 92.9],\n       <strong>&#091; 5. ,  4. ,  3. , 56.3]<\/strong>])\n<\/code><\/pre>\n\n\n\n<p>Los valores de la columna se reducen a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>columna = &#091; |4|,   fila=0\n            |2|,   fila=1\n            |<strong>5<\/strong>| ]  fila=2\ndondemax = 2<\/code><\/pre>\n\n\n\n<p>En el ejercicio se encuentra que: la magnitud de mayor valor est\u00e1 en la \u00faltima fila, no en la diagonal. Se realiza el intercambio entre la fila 2 y la fila 0 de AB.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AB = &#091;<strong>&#091; 5. ,  4. ,  3. , 56.3]<\/strong>,\n      &#091; 2. ,  5. ,  8. , 92.9],\n      &#091; 4. ,  2. ,  5. , 60.7]]<\/code><\/pre>\n\n\n\n<p>Se repite el proceso anterior para la siguiente columna, pero siempre formada desde la diagonal.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>AB = &#091;&#091; 5. ,  4. ,  3. , 56.3],\n      &#091; 2. ,  <strong>5.<\/strong> ,  8. , 92.9],\n      &#091; 4. ,  <strong>2.<\/strong> ,  5. , 60.7]]<\/code><\/pre>\n\n\n\n<p>Los valores de la columna se reducen a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>columna = &#091; |5|,  fila=0\n            |2| ] fila=1\ndondemax = 0<\/code><\/pre>\n\n\n\n<p>Como la posici\u00f3n <code>dondemax<\/code> es la primera, \u00edndice 0, se determina que ya est\u00e1 en la diagonal de AB y no es necesario realizar el intercambio de filas.<\/p>\n\n\n\n<p>Se repite el proceso para la tercera columna desde la diagonal, que resulta tener solo una casilla (columna =[5]) y no ser requiere continuar.<\/p>\n\n\n\n<p>El resultado del pivoteo por fila se muestra a continuaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Pivoteo parcial por filas AB:\n&#091;&#091; 5.   4.   3.  56.3]\n &#091; 2.   5.   8.  92.9]\n &#091; 4.   2.   5.  60.7]]\nA:\n&#091;&#091;5. 4. 3.]\n &#091;2. 5. 8.]\n &#091;4. 2. 5.]]\nB:\n&#091;56.3 92.9 60.7]<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group alignwide has-medium-font-size is-content-justification-center is-layout-flex wp-container-core-group-is-layout-b02886af wp-block-group-is-layout-flex\">\n<p><a href=\"#pivoteo\">Pivoteo<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#matrizaumentada\">Matriz Aumentada<\/a> <\/p>\n\n\n\n<p><a href=\"#pivoteofilas\">Pivoteo filas<\/a><\/p>\n\n\n\n<p><a href=\"http:\/\/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\n\n\n<p><a href=\"#ejercicio2\">ejercicio2<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pivoteo Ejercicio Matriz Aumentada Pivoteo filas Algoritmo funci\u00f3n gr\u00e1fica ejercicio2 1. Pivoteo - Concepto Referencia: Chapra 9.4.2 p268. Burden 6.2 p279. Rodr\u00edguez 4.0 p105 Los m\u00e9todos de soluci\u00f3n a sistemas de ecuaciones en los primeros pasos usan la matriz aumentada y pivoteada por filas. Como es un procedimiento usado en todos los m\u00e9todos de la [&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-1226","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\/1226","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=1226"}],"version-history":[{"count":9,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1226\/revisions"}],"predecessor-version":[{"id":21548,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/1226\/revisions\/21548"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=1226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=1226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=1226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}