Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Universidad Politécnica de Madrid Escuela Técnica Superior de Ingenieros Informáticos Grado en Matemáticas e Informática Trabajo Fin de Grado Desarrollo de una Aplicación Didáctica en Álgebra Lineal: Matrices, Sistemas y Determinantes Autor: Jaime Jiménez Jiménez Tutor(a): Héctor Barge y Jonatan Sánchez Madrid, Junio 2023 Este Trabajo Fin de Grado se ha depositado en la ETSI Informáticos de la Univer- sidad Politécnica de Madrid para su defensa. Trabajo Fin de Grado Grado en Matemáticas e Informática Título: Desarrollo de una Aplicación Didáctica en Álgebra Lineal: Matrices, Sistemas y Determinantes Junio 2023 Autor: Jaime Jiménez Jiménez Tutor: Héctor Barge y Jonatan Sánchez DMATIC ETSI Informáticos Universidad Politécnica de Madrid Tabla de contenidos 1. Introducción 1 2. Marco teórico 3 2.1. Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.1. Matriz transpuesta . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.2. Matriz cuadrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.3. Operaciones con matrices . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.3.1. Suma de matrices . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.3.2. Producto por escalar . . . . . . . . . . . . . . . . . . . . . 4 2.1.3.3. Producto de matrices . . . . . . . . . . . . . . . . . . . . . 5 2.2. Algoritmo de Gauss-Jordan . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.1. Matrices equivalentes por filas . . . . . . . . . . . . . . . . . . . . . . 6 2.2.2. Operaciones elementales . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.2.3. Forma escalonada de una matriz . . . . . . . . . . . . . . . . . . . . 8 2.2.4. Forma escalonada reducida de una matriz . . . . . . . . . . . . . . . 8 2.2.5. Algoritmo de Gauss . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.6. Algoritmo de Gauss-Jordan . . . . . . . . . . . . . . . . . . . . . . . 9 2.3. Aplicaciones del algoritmo de Gauss-Jordan . . . . . . . . . . . . . . . . . . 10 2.3.1. Rango de una matriz . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.3.2. Determinante de una matriz . . . . . . . . . . . . . . . . . . . . . . . 11 2.3.3. Cálculo de inversa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.3.4. Discusión y resolución de sistemas de ecuaciones lineales . . . . . . . 13 2.3.4.1. Teorema de Rouché-Frobenius . . . . . . . . . . . . . . . . 13 2.3.5. Imagen (o col) de una matriz . . . . . . . . . . . . . . . . . . . . . . 14 2.3.6. Kernel (o null) de una matriz . . . . . . . . . . . . . . . . . . . . . . 14 3. Código 15 3.1. Librerías externas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 3.2. Código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2.1. algebra_lineal.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2.1.1. Clase Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.2.1.2. Funciones del módulo . . . . . . . . . . . . . . . . . . . . . 17 3.2.2. alglin_api.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.2.2.1. Llamadas de información . . . . . . . . . . . . . . . . . . . 19 3.2.2.2. Llamadas de cálculos . . . . . . . . . . . . . . . . . . . . . 19 i TABLA DE CONTENIDOS 4. Resultados y conclusiones 21 4.1. Funcionamiento de la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . 21 4.1.1. Operaciones con matrices . . . . . . . . . . . . . . . . . . . . . . . . 22 4.1.1.1. Operaciones para una matriz . . . . . . . . . . . . . . . . . 22 4.1.1.2. Operaciones para dos matrices . . . . . . . . . . . . . . . . 25 4.1.2. Gauss y Gauss-Jordan . . . . . . . . . . . . . . . . . . . . . . . . . . 26 4.1.3. Sistemas de ecuaciones lineales . . . . . . . . . . . . . . . . . . . . . 26 4.1.4. Col y null de una matriz . . . . . . . . . . . . . . . . . . . . . . . . . 29 4.2. Aplicaciones en el aula . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 4.3. Mejoras y extensiones del sistema . . . . . . . . . . . . . . . . . . . . . . . . 31 5. Impacto 33 5.1. Impacto personal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 5.2. Empresarial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.3. Social . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.4. Económico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.5. Medioambiental . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.6. Cultural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 ii Capítulo 1 Introducción Este TFG se enmarca dentro de la actividad del Grupo de Innovación Educativa ‘Desarrollo de Tecnologías en la Enseñanza de las Matemáticas’, y forma parte de un proyecto en el cual se pretende construir una aplicación didáctica donde vengan implementados la mayoría de los algoritmos que aparecen en las asignaturas de matemáticas del Grado en Matemáticas e Informática, con el fin de ayudar a los estudiantes en el aprendizaje. El objetivo de este TFG es la creación de un módulo escrito en el lenguaje de programación Python en el que se defina una clase de matrices, con sus operaciones elementales, y que use esta clase para realizar el algoritmo de Gauss-Jordan. Este algoritmo será el núcleo para resolver diversos problemas: cálculo de la forma escalonada reducida, resolución de sistemas de ecuaciones lineales, cálculo de rangos, cálculo de determinantes, cálculo de la matriz inversa. Además, si fuese posible, se crearía una clase para manejar espacios vectoriales y las operaciones básicas. Todos estos ítems están dirigidos bajo una visión didáctica, es decir, no se busca eficiencia computacional, sino que los algoritmos vendrán explicados paso por paso. Una vez que estos algoritmos y sus pasos estén listos, se procederá a la integración de este módulo con una página web donde los usuarios podrán introducir los datos de los problemas y podrán consultar el resultado y los pasos hasta llegar a él. Esta página web recogerá otros TFGs que resolverán diversos problemas y será una herramienta que ayude a los estudiantes a resolver los problemas de matemáticas del grado. 1 Capítulo 2 Marco teórico El concepto básico con el que se trabaja es el de las matrices. En torno al concepto de matrices existen muchos otros conceptos, como pueden ser el determinante o la inversa, al igual que infinidad de algoritmos que nos ayudan a resolver otros problemas. Al fin y al cabo las matrices son una forma de organizar datos. 2.1. Matrices Sea A una matriz, se dice que A tiene m filas y n columnas, A ∈ Mm×n(K) A = a11 a12 . . . a1n a21 a22 . . . a2n ... ... . . . ... am1 am2 . . . amn Se dice que el elemento aij ∈ K es el elemento de la fila i y columna j. 2.1.1. Matriz transpuesta La matriz transpuesta de la matriz A, denotada At , es la matriz cuyas filas son las columnas de A, y viceversa. At = a11 a21 . . . am1 a12 a22 . . . am2 ... ... . . . ... a1n a2n . . . amn 2.1.2. Matriz cuadrada Se dice que una matriz A ∈ Mn×n(K) es cuadrada si m = n. Se llama diagonal de una matriz cuadrada a los elementos aii , con i ∈ {1, . . . , n}. La matriz identidad de orden n, In ∈ Mn×n(K) es una matriz cuadrada cuyos elemen- tos son todos el elemento nulo excepto la diagonal, que son el elemento neutro del producto de K. 3 2.1. Matrices 2.1.3. Operaciones con matrices Las matrices, al igual que los número reales, tienen distintas operaciones. Sin embargo, las propiedades de estas operaciones no son las mismas. 2.1.3.1. Suma de matrices Se define la suma de dos matrices A, B ∈ Mm×n(K) componente a componente: a11 a12 . . . a1n a21 a22 . . . a2n ... ... . . . ... am1 am2 . . . amn + b11 b12 . . . b1n b21 b22 . . . b2n ... ... . . . ... bm1 bm2 .. . bmn = a11 + b11 a12 + b12 . . . a1n + b1n a21 + b21 a22 + a22 . . . a2n + b2n ... ... . . . ... am1 + bm1 am2 + bm2 . . . amn + bmn . La suma de las matrices hereda las propiedades de la suma del cuerpo base K: Asociativa: (A + B) + C = A + (B + C), para todo A, B, C ∈ Mm×n(K). Elemento neutro: 0 = 0 0 . . . 0 0 0 . . . 0 ... ... . . . ... 0 0 . . . 0 ∈ Mm×n(K), siendo 0 el elemento nulo de K. Elemento opuesto: para todo A ∈ Mm×n, existe B ∈ Mm×n tal que A + B = 0. Usualmente lo denotaremos por −A. Conmutativa: A + B = B + A, para todo A, B ∈ Mm×n. 2.1.3.2. Producto por escalar Sea λ ∈ K, se define el producto por escalar como la matriz resultante de multiplicar todos los elementos por el escalar. λA = λa11 λa12 . . . λa1n λa21 λa22 . . . λa2n ... ... . . . ... λam1 λam2 . . . λamn = Aλ Se tiene las siguientes propiedades: 1. Asociativa: (λ · µ)A = λ(µA) para todo λ, µ ∈ K y A ∈ Mm×n(K); 2. Distributiva: (λ + µ)A = λA + µA y λ(A + B) = λA + λB, para cualesquiera λ, µ ∈ K y A, B ∈ Mm×n(K); 3. 0 · A = 0 y 1 · A = A para cualquier A ∈ Mm×n(K); De estas propiedades se concluye que (Mm×n(K),+, ·) es un espacio vectorial, y se puede comprobar que es isomorfo a Km·n. 4 Marco teórico 2.1.3.3. Producto de matrices Sean A ∈ Mm×n(K), B ∈ Mn×p(K) matrices con A = a11 a12 . . . a1n a21 a22 . . . a2n ... ... . . . ... am1 am2 . . . amn , B = b11 b12 . . . b1p b21 b22 . . . b2p ... ... . . . ... bmn bn2 . . . bnp . Definimos el producto C = A · B como C = c11 c12 . . . c1n c21 c22 . . . c2n ... ... . . . ... cm1 cm2 . . . cmn , donde cij = ai1b1j+ai2b2j+. . .+ainbnj. Observa que el producto A ·B está definido solamente cuando el número de filas de A coincide con el número de filas de B. Las propiedades del producto de matrices son: Es asociativo, esto es, para todo A ∈ Mm×n(K), B ∈ Mn×p(K) y C ∈ Mp×q(M), se tiene que A · (B · C) = (A · B) · C. El producto de matrices no es conmutativo. En general, A · B no tiene que ser igual a B · A, y de hecho si las matrices no son cuadradas, es posible que una de las dos operaciones no sea posible. Si consideramos matrices cuadradas, entonces el producto tiene las siguientes propiedades 1. Es asociativo. 2. Existe elemento neutro I ∈ Mn×n(K) tal que A · I = I · A = A para todo A ∈ Mn×n(K). Dicho elemento neutro es la matriz identidad In. 3. No toda matriz A ∈ Mn×n(K) tiene elemento inverso (el opuesto para el producto), pero cuando existe esta se denota por A−1. 4. El producto no es conmutativo: los únicos elementos que conmutan con todos los demás son los múltiplos de la identidad. El conjunto de elementos invertibles forma el grupo lineal, que se denota por GL(n,K). Así, (GL(n,K), ·) es un grupo no conmutativo. El conjunto Mn×n(K) tiene dos operaciones suma y producto, y con ambas la tripleta (Mn×n(K),+, ·) es un anillo no conmutativo. 2.2. Algoritmo de Gauss-Jordan El algoritmo de Gauss-Jordan, llamado así por los matemáticos Carl Friedrich Gauss y Wilhelm Jordan, es un algoritmo que busca lo que se llama forma escalonada de una matriz (algoritmo de Gauss) y la forma escalonada reducida (algoritmo de Gauss-Jordan). Se podría decir que el algoritmo de Gauss-Jordan es una continuación del algoritmo de 5 2.2. Algoritmo de Gauss-Jordan Gauss para seguir reduciendo la matriz hasta obtener la forma escalonada reducida. Por este motivo se puede separar (y se debe separar para problemas como la obtención del determinante) en dos partes. Antes de definir la matriz escalonada, hay que conocer qué son las operaciones elementales y las matrices equivalentes por filas. 2.2.1. Matrices equivalentes por filas Dos matrices A, B ∈ Mm×n(K) son equivalentes por filas si existe P ∈ Mn×n(K) invertible tal que A = PB. También se puede definir con los subespacios generados por filas. Sea A ∈ Mm×n(K), el subespacio de Kn generado por sus filas es el subespacio generado considerando las filas como vectores de Kn. Con esto, podemos definir que dos matrices son equivalentes por filas de la siguiente forma: Dos matrices A, B ∈ Mm×n(K) son equivalentes por filas si el subespacio de Kn generado por sus filas es el mismo. Sean A y B equivalentes por filas. Entonces se cumple que si Ax = 0, entonces Bx = 0 (en efecto, B = PA para algún P, y Bx = 0 es PAx = 0, y por tanto si Ax = 0 entonces Bx = 0). 2.2.2. Operaciones elementales Las operaciones elementales son una serie de transformaciones que se realizan dentro de la propia matriz, utilizando filas o columnas según el caso, y que dan como resultado otra matriz. Estas operaciones cumplen una serie de propiedades que nos permitirán mantener algunas características importantes de la matriz inicial para luego resolver problemas como el cálculo de la inversa o discusión de sistemas de ecuaciones lineales. Todos los algoritmos desarrollados se basan en esto. Las operaciones son tres: Multiplicar una fila o columna por un escalar λ ∈ K, λ , 0 Sumar a una fila o columna otra fila o columna distinta multiplicada por un escalar. Intercambiar dos filas o columnas de posición. A partir de ahora solo se utilizarán las operaciones elementales por filas. Cada una de las operaciones elementales lleva asociada una matriz E. Más concretamente, si B es el resultado de aplicar una de las tres anteriores operaciones elementales a la matriz A ∈ Mm×n(K), entonces existe E ∈ Mm×m(K) matriz invertible tal que B = EA. La matriz E se la conoce como matriz elemental asociada a dicha operación elemental. De este modo, si a una matriz A le aplicamos r operaciones elementales, entonces B = ErEr−1 · · ·E2E1A, donde Ei es la matriz elemental asociada a la i-ésima operación elemental efectuada en A. Entonces al producto P = ErEr−1 · · ·E2E1 se denomina matriz de paso. La matriz elemental asociada a una operación elemental puede obtenerse mediante apli- cando la misma operación a la matriz identidad. Las matrices elementales son las siguientes: 6 Marco teórico 1. Intercambio de fila i por fila k: In = 1 . . . 0 . . . . . . . . . 0 ... . . . ... ... 0 . . . 1 ... ... . . . ... ... 1 . . . 0 ... ... . . . ... 0 . . . . . . . . . 0 . . . 1 fi←→fk−−−−−→ E = 1 . . . . . . . . . 0 . . . 0 ... . . . ... ... ... 0 . . . 1 . . . 0 ... ... . . . ... ... 0 . . . 1 . . . 0 ... ... ... . . . ... 0 . . . 0 . . . 0 . . . 1 2. Multiplicación de fila i por λ: In = 1 . . . 0 . . . . . . . . . 0 ... . . . ... ... 0 . . . 1 ... ... . . . ... ... 1 . . . 0 ... ... . . . ... 0 . . . . . . . . . 0 . . . 1 fi=λ·fi−−−−−→ E = 1 . . . 0 . . . . . . . . . 0 ... . . . ... ... 0 . . . λ ... ... . . . ... ... 1 . . . 0 ... ... . . . ... 0 . . . . . . . . . 0 . . . 1 3. Suma a la fila k la fila i multiplicada por λ: In = 1 . . . 0 . . . . . . . . . 0 ... . . . ... ... 0 . . . 1 ... ... . . . ... ... 1 . . . 0 ... ... . . . ... 0 . . . . . . . . . 0 . . . 1 fk=fk+λ·fi−−−−−−−−→ E = 1 . . . 0 . . . . . . . . . 0 ... . . . ... ... 0 . . . 1 ... ... ... . . . ... ... λ . . . 1 . . . 0 ... ... . . . ... 0 . . . . . . . . . 0 . . . 1 Ejemplos de matrices elementales correspondientes a cada operación elemental para la matriz I3: 1. Intercambio de fila 2 por fila 3: I3 = 1 0 00 1 0 0 0 1 f2←→f3−−−−−→E = 1 0 00 0 1 0 1 0 2. Multiplicación de fila 1 por −5: I3 = 1 0 00 1 0 0 0 1 f1=−5·f1−−−−−−→ E = −5 0 00 1 0 0 0 1 7 2.2. Algoritmo de Gauss-Jordan 3. Suma a la fila 3 la fila 1 multiplicada por 32 : I3 = 1 0 00 1 0 0 0 1 f3=f3+ 32 ·f1−−−−−−−−→ E = 1 0 00 1 03 2 0 1 2.2.3. Forma escalonada de una matriz Aplicando operaciones elementales podremos obtener matrices triangulares superiores, es decir, que tenga ceros formando un triángulo en la parte inferior izquierda; y obtener lo que llamamos forma escalonada de una matriz. Esta forma escalonada es precisamente lo que busca el algoritmo de Gauss, que se explica más adelante. Pongamos un ejemplo de forma escalonada de una matriz: Sea A ∈ M4×6(R) y aplicamos operaciones elementales hasta obtener una matriz B ∈ M4×6(R). A = 1 1 4 4 8 4 2 2 3 −2 1 1 3 3 1 −8 −7 1 2 2 −6 3 −3 39 , B = 1 1 4 4 8 4 0 0 −5 −10 −15 −7 0 0 0 2 2 225 0 0 0 0 0 0 B es una forma escalonada de A. Las formas escalonadas deben cumplir lo siguiente: El primer elemento no nulo de la fila i, llamado pivote, está a la izquierda del pivote de la fila i + 1. Es decir, si el pivote de la fila es el elemento aij y el pivote de la fila i + 1 es el elemento ai+1,k, se cumple que j < k. Esto se podría traducir en que por debajo de cada pivote solo hay ceros. Si una fila es todo ceros, toda fila por debajo son ceros. Es decir, si la fila i son elementos nulos, para todo k > i se tiene que la fila k es todo elemento nulo. 2.2.4. Forma escalonada reducida de una matriz La forma escalonada reducida de una matriz es una forma escalonada pero con las siguien- tes propiedades adicionales: Todos los pivotes son el elemento neutro. Si el elemento aij es pivote, se cumple que el elemento akj, k , i, k ∈ {1, . . . , m} es el elemento nulo. Esto se traduce en que además de que los elementos por debajo del pivote sean cero, los elementos por encima también. Mientras que las formas escalonadas de una matriz pueden ser múltiples, la forma escalo- nada reducida de una matriz es única. Utilizando el ejemplo anterior, la forma escalonada reducida de A es: 1 1 0 0 0 365 0 0 1 0 1 −3 0 0 0 1 1 115 0 0 0 0 0 0 Esta forma es el resultado de aplicar a una matriz el algoritmo de Gauss-Jordan. 8 Marco teórico 2.2.5. Algoritmo de Gauss El algoritmo de Gauss es la primera parte del algoritmo. Utiliza la operaciones elementales por filas de intercambio de filas y de sumas de filas, dejando de lado la operación de multiplicar una fila por un escalar. Esto es realmente útil para el cálculo del determinante, ya que el la suma de filas no cambia el determinante, mientras que el intercambio de filas solamente cambia el signo. El algoritmo es el siguiente: 1. Vamos a la primera fila y a la primera columna. 2. Si el elemento es cero y hay alguna fila con elemento distinto de cero en la misma columna, intercambiamos las filas. En caso contrario, pasamos a la siguiente columna y repetimos este paso. 3. El elemento en el que estamos es distinto de cero, así que podemos hacer ceros en las filas de abajo. Para esto, a cada fila inferior a la que estamos con elemento distinto de en la misma columna le sumamos la fila en la que estamos por un múltiplo para que el elemento sea cero. 4. Si todavía hay filas por debajo que no son todo cero, pasamos a la siguiente fila y la siguiente columna y vamos al paso 2. El pseudocódigo del algoritmo de Gauss sería el siguiente: i, j ← 1, 1 while i ≤ m & j ≤ n do if aij = 0 then if ∃k : aik , 0 then Fi , Fk ← Fk , Fi else j ← j + 1 end if else k ← i + 1 while k ≤ m do Fk ← Fk − akjaij Fi k ← k + 1 end while i ← i + 1 j ← j + 1 end if end while 2.2.6. Algoritmo de Gauss-Jordan El algoritmo de Gauss-Jordan es la continuación del algoritmo de Gauss. Después de obtener una matriz escalonada, lo próximo a conseguir es que todos los pivotes sean la identidad y hacer ceros por encima de éstos. Para eso, se divide cada fila por el elemento pivote y luego se realizan las operacoines elementales de suma de filas. La secuencia es la siguiente: 1. Vamos a la última fila con algún elemento no nulo. 9 2.3. Aplicaciones del algoritmo de Gauss-Jordan 2. Vamos a la columna del pivote. 3. Dividimos toda la fila por el pivote. Si estamos en la primera fila, ya hemos termi- nado. 4. Restamos a todas las filas superiores la fila en la que estamos por el elemento que está en la misma columna que el pivote. 5. Vamos a la fila superior y vamos al paso 2. El pseudocódigo, después de aplicar el algoritmo de Gauss, sería el siguiente: i ← m while i > 0 do if {k ∈ {1, . . . , n} & aik , 0} , ∅ then j ← mȷ́n{k ∈ {1, . . . , n} & aik , 0} Fi ← 1aij Fi if i > 1 then for k ← i − 1 to 1 do Fk ← Fk − aikFi end for end if end if i ← i − 1 end while 2.3. Aplicaciones del algoritmo de Gauss-Jordan El algoritmo de Gauss-Jordan tiene infinidad de aplicaciones. Entre ellas, destacaremos las que han sido desarrolladas en este trabajo para luego ser implementadas en la página web. 2.3.1. Rango de una matriz El rango de una matriz se define como el máximo número de filas (o columnas) que son linealmente independientes entre sí. Como realizar operaciones elementales por filas es hacer combinaciones lineales de las filas, el rango es el número de filas que no son todo cero en la forma escalonada de una matriz. Por ejemplo, sean A, B ∈ M4×6(R), siendo B una forma escalonada de A. A = 1 1 4 4 8 4 2 2 3 −2 1 1 3 3 1 −8 −7 1 2 2 −6 3 −3 39 , B = 1 1 4 4 8 4 0 0 −5 −10 −15 −7 0 0 0 2 2 225 0 0 0 0 0 0 Entonces el rango de A es el número de filas no nulas de B, que obtenemos aplicando el algoritmo de Gauss a A. rg(A) = 3 10 Marco teórico 2.3.2. Determinante de una matriz Si V es un espacio vectorial de dimensión n, y fijamos una base {v1, . . . , vn}. Se define el determinante como la única aplicación D : n︷ ︸︸ ︷ V × · · · × V → K tal que 1. D(v1, v2, . . . , vn) = 1; 2. para cualquier i = 1, . . . , n, D(w1, . . . , λwi , . . . , wn) = λD(w1, . . . , wi , . . . , wn) 3. para cualquier i = 1, . . . , n, D(w1, . . . , wi + w′i , . . . , wn) = D(w1, . . . , wi , . . . , wn) + D(w1, . . . , w′i , . . . , wn); 4. D(w1, . . . , wn) = 0 si wi = wj para algún 1 ≤ i < j ≤ n. En Kn se toma la base canónica para definir el determinante. El determinante de una matriz cuadrada n ×n es el determinante de los vectores columna (o vectores fila), tomados como elementos de Kn. Se denota como det(A) o simplemente |A|. Los determinantes tienen muchas propiedades y aplicaciones, pero no son necesarias para este trabajo. Destaca que si el rango de la matriz no es máximo, si determinante es 0, y no tiene inversa. El cálculo del determinante se puede hacer de muchas formas. Para una matriz cuadrada A, A ∈ M2×2(K) el cálculo es sencillo: |A| = a11a22 − a12a21. Para una matriz A ∈ M3×3(K) también existe una fórmula: |A| = a11a22a33 + a12a23a31 + a13a21a32 − a13a22a31 − a11a23a32 − a12a21a33 Sin embargo, el cálculo para matrices de orden superior es más complicado. Se puede calcular mediante el desarrollo por filas o por columnas. Si se tiene que A ∈ Mm×m(K), el determinante de A se calcula: |A| = m∑ i=1 aij · (−1)i+j · |Aij | Siendo Aij la matriz de una dimensión menor que se obtiene de eliminar la fila i y la colum- na j de la matriz A. Con esta fórmula el número de cálculos que hay que hacer aumenta exponencialmente según aumenta la dimensión de la matriz, lo que lo hace computacio- nalmente muy costoso. La solución a esto es utilizar la primera parte del algoritmo de Gauss. Esto es debido a que hacer combinaciones lineales de filas no cambia el determinante de la matriz. Lo único que cambia el determinante es el cambio de filas, que únicamente hace cambiar de signo. Ahora que tenemos una matriz escalonada,el cálculo es muy simple: basta con multiplicar los elementos de la diagonal y a su vez multiplicar por −1 elevado al número de cambios de fila. Por tanto, sea A ∈ Mm×m(K), sea B la matriz resultante de aplicar el algoritmo de Gauss, sea bij el elemento de la fila i y la columna j de la matriz B y sea n el número de intercambio de filas, se tiene que |A| = (−1)n |B| 11 2.3. Aplicaciones del algoritmo de Gauss-Jordan Ahora calculamos el determinante de B desarrollando por la primera columna: |B| = b11 · |B11| − 0 · |B21| + . . . + (−1)i+j · 0 · |Bm1| = b11 · |B11| Ahora calculando |B11| desarrollando igualmente por la primera columna vemos que: |B11| = b22 · |(B11)22| − 0 · |(B11)32| + . . . + (−1)i+j · 0 · |(B11)m2| = b22 · |(B11)22| Teniendo en cuenta que ∣∣∣∣(bmm)∣∣∣∣ = bmm Al final obtenemos |A| = (−1)nb11b22 . . . bmm De esta forma la complejidad computacional del cálculo del determinante se reduce hasta complejidad polinomial. Aplicando esto es fácil ver que si rg(A) < m entonces |A| = 0 y que |In | = 1. 2.3.3. Cálculo de inversa Para el cálculo de la inversa se utiliza la matriz de paso resultante de aplicar operaciones elementales. Si a una matriz cuadrada le aplicamos el algoritmo de Gauss-Jordan, obten- dremos su forma escalonada reducida, que será la matriz identidad si el rango es máximo. Así, podremos saber que EA = I y por tanto E = A−1. Para calcular la matriz de paso, se puede construir una matriz de la siguiente forma: Sea A ∈ Mn×n(K) A = a11 a12 . . . a1n a21 a22 . . . a2n ... ... . . . ... an1 an2 . . . ann Si construimos la siguiente matriz y le aplicamos el método de Gauss-Jordan a11 a12 . . . a1n a21 a22 . . . a2n ... ... . . . ... an1 an2 . . . ann 1 0 . . . 0 0 1 . . . 0 ... ... . . . ... 0 0 . . . 1 Si rg(A) = n, obtendremos una matriz del estilo: 1 0 . . . 0 0 1 . . . 0 ... ... . . . ... 0 0 . . . 1 b11 b12 . . . b1n b21 b22 . . . b2n ... ... . . . ... bn1 bn2 . . . bnn Siendo la parte de la derecha la matriz de paso y por tanto la inversa de A. En caso de que rg(A) < n, A no tendrá matriz inversa. Utilizando este método obtendremos tanto el rango como la inversa de la matriz, si la tiene, y por tanto el cálculo de la matriz inversa no necesita muchos más cálculos que comprobar si ésta existe. 12 Marco teórico 2.3.4. Discusión y resolución de sistemas de ecuaciones lineales Sea una sistema de ecuaciones lineales con m ecuaciones y n incógnitas. a11x1 + a12x2 + . . . + a1nxn = c1 a21x1 + a22x2 + . . . + a2nxn = c2 ... am1x1 + am2x2 + . . . + amnxn = cm El sistema se puede reescribir como sistema matricial de la siguiente forma: a11 a12 . . . a1n a21 a22 . . . a2n ... ... . . . ... am1 am2 . . . amn · x1 x2 ... xn = c1 c2 ... cm Denominaremos a la primera matriz A, la matriz de coeficientes; a la segunda x y a la tercera c. Por tanto el sistema es Ax = c. A la matriz (A|c) se denomina matriz ampliada. (A|c) = a11 a12 . . . a1n a21 a22 . . . a2n ... ... . . . ... am1 am2 . . . amn c1 c2 ... cm Según cuántas soluciones tiene un sistema de ecuaciones lineales se pueden clasificar en tres tipos: Sistema incompatible: el sistema no tiene solución. Sistema compatible determinado: el sistema tiene una única solución. Sistema incompatible indeterminado: el sistema tiene más de una solución. El método para obtener las soluciones del sistema consiste en aplicar el método de Gauss- Jordan a la matriz ampliada para obtener un sistema de ecuaciones equivalente al original, pero mucho más sencillo de resolver. 2.3.4.1. Teorema de Rouché-Frobenius Sea A la matriz de coeficientes de un sistema de ecuaciones lineales de m ecuaciones y n incógnitas, y sea (A|c) la matriz ampliada. Se tiene una de las tres situaciones: rg(A) = rg(A|c) = n si y solo si el sistema es compatible determinado. rg(A) = rg(A|c) < n si y solo si el sistema es compatible indeterminado. rg(A) < rg(A|c) si y solo si el sistema es incompatible. Sabiendo esto, aplicando el algoritmo de Gauss-Jordan podemos discutir el sistema a la vez que obtenemos sus soluciones. 13 2.3. Aplicaciones del algoritmo de Gauss-Jordan 2.3.5. Imagen (o col) de una matriz La imagen o col de una matriz es el espacio vectorial que forman las columnas de la matriz. Por tanto, el problema consiste en obtener las columnas de la matriz que son linealmente independientes. Para esto, se aplica el algoritmo de Gauss, y las columnas que tengan pivote serán columnas linealmente independientes, que formarán una base de la imagen de la matriz. 2.3.6. Kernel (o null) de una matriz El kernel o null de una matriz es el espacio vectorial que forman los vectores tales que al multiplicar la matriz por el vector da como resultado el vector nulo. Para resolver este problema, resolvemos el sistema homogéneo que representa la matriz ampliada (A|0) y resolvemos el sistema. De ahí sacaremos unas ecuaciones paramétricas de las que obten- dremos unos vectores, tantos como parámetros haya, que serán base del espacio. Si no hay parámetros y el sistema es compatible determinado, el kernel será el trivial. 14 Capítulo 3 Código El código desarrollado está separado en dos grandes partes: el módulo de álgebra lineal, en el que se desarrolla todo lo relativo a la clase que representa las matrices y los algoritmos desarrollados; y la API para la conexión con la página web. En esta parte se explica las librerías externas utilizadas para el desarrollo del código, así como las partes esenciales del código desarrollado junto con sus estructura. 3.1. Librerías externas Las librerías externas utilizadas para la parte del módulo de Álgebra Lineal son librerías estándar de Python . Éstas son: copy: Utilizada para crear una copia de una matriz. inspect: Es utilizada para saber si un elemento es comparable con > o < con otro elemento, ya que una matriz acepta cualquier tipo, incluso uno definido por el usuario. Se comprueba si es menor o mayor que el elemento cero del cuerpo en el que se trabaje para incluir o no incluir caracteres de “+” o “−”. Iterable: Utilizado para comprobar si se puede iterar por un elemento pasado como argumento al crear una matriz. Rational: Utilizada para comprobar si se puede representar un número mediante Fraction, que representa una fracción. Fraction: Utilizada en vez de la división “normal” en los métodos de Gauss y Gauss- Jordan, incluso con enteros. Esto es porque la división provoca errores de precisión, ya que los números máquina no tienen precisión infinita. Gracias a la representación de los números racionales mediante fracciones, se evita este problema (siempre que no se utilice el tipo float, aunque también mitiga errores en este caso). Se recomienda encarecidamente el uso de Fraction, Decimal o similares. También se incluye el uso de otros dos módulos creados para representar errores por el rango de la matriz, MatrixRangeError, y errores por el tamaño de la matriz, MatrixSizeError. Para el módulo para la conexión con la página web, aparte de Fraction se utiliza la librería Flask, que es el framework elegido para el Proyecto Calculadora. 15 3.2. Código 3.2. Código El código, como ya se ha comentado anteriormente, está dividido en dos módulos princi- pales, aparte de los utilizados para errores. Estos módulos son algebra_lineal y alglin_api. 3.2.1. algebra_lineal.py Este es el módulo principal. En él se crea la clase Matrix, que representa las matrices, y todas sus operaciones básicas y los algoritmos desarrollados. 3.2.1.1. Clase Matrix La matriz se inicia pasándole como argumentos al constructor las filas de la matriz. Por ejemplo, si queremos iniciar la matriz ( 1 2 3 4 5 6 ) utilizaremos Matrix([[1,2,3],[4,5,6]]) También podemos pasar dos listas en vez de una lista con dos listas:Matrix([1,2,3],[4,5,6]) Igualmente en vez de listas, se puede utilizar cualquier tipo que sea iterable, como por ejemplo tuplas. A la hora de crear la matriz se pueden pasar ciertos parámetros: fill_with: Si una o varias de las filas que se pasan es más corta que otra, ésta o éstas se completaran con este valor. El valor por defecto es 0. zero: Es el cero del cuerpo en el que esté definido la matriz. Será útil cuando se utilicen cuerpos distintos a R en los algoritmos de Gauss y Gauss-Jordan. identity: Similar a zero pero representa el elemento neutro. Así pues, si queremos crear una matriz de matrices, podemos hacer: >>> M1=Matrix([1,2],(3,),fill_with=4) >>> M2=Matrix([[5,6],(7,8)]) >>> M3=Matrix((1,0),[],fill_with=3) >>> M4=Matrix([[1,0],[0,1]]) >>> M=Matrix((M1,M2),(M3,), fill_with=M4, zero=Matrix([0,0],[0,0]), ... identity=Matrix([[1,0],[0,1]])) >>> print(M) ⎛ ⎛ 1 2 ⎞ ⎛ 5 6 ⎞ ⎞ ⎜ ⎝ 3 4 ⎠ ⎝ 7 8 ⎠ ⎟ ⎜ ⎛ 1 0 ⎞ ⎛ 1 0 ⎞ ⎟ ⎝ ⎝ 3 3 ⎠ ⎝ 0 1 ⎠ ⎠ La matriz M es ( 1 23 4 ) ( 5 67 8 )( 1 0 3 3 ) ( 1 0 0 1 ). Con estas matrices se pueden hacer las operaciones bási- cas de suma, resta, comparación de igualdad, negación, multiplicación y elevar con los operadores básicos de Python . También se puede pasar a tipo str, obtener una copia, obtener texto con el que se podría crear esa misma matriz, (repr(M)) y obtener o cambiar un elemento de la matriz accediendo a la posición como si fuese una lista de listas. Además de estos métodos especiales de Python , hay otros métodos para trabajar con ellas: 16 Código M.size(): devuelve una tupla con el tamaño de la matriz, es decir, la tupla (filas, columnas). M.tolist(): devuelve una lista de listas con los elementos de la matriz. M.transpose(): devuelve la matriz transpuesta. M.tolatex(): devuelve un string que representa la matriz en formato LaTEX. Si los elementos de la matriz tienen el método tolatex() utilizará esta función. En caso contrario, los pasará a texto. M.tostring(): devuelve otra representación distinta en texto. Es un método útil para la página web, pero no para su uso en Python . M.determinant(use_gauss=True): calcula el determinante de la matriz. Si no es cua- drada, saltará una excepción, MatrixSizeError. Si se pasa use_gauss=False, calculará el determinante mediante desarrollo por filas. M.inverse(): calcula la inversa de la matriz. Si la matriz no es cuadrada, salta la excepción MatrixSizeError, mientras que si es invertible, salta MatrixRangeError. Se hace mediante el método de Gauss-Jordan. 3.2.1.2. Funciones del módulo Además de la clase matriz, en el módulo de algebra_lineal se definen varias funciones que trabajan con matrices. Lo óptimo habría sido separar la clase Matrix de estas funciones; sin embargo, como los métodos para calcular el determinante y la inversa utilizan el método de Gauss, no se podían separar, ya que se poduciría una importación circular, en el que el módulo de matrices importa Gauss y el módulo de Gauss importa el de matrices. Las funciones que se definen en el módulo son de diversas naturalezas: desde cálculos más complejos como discutir y resolver un sistema de ecuaciones lineales hasta crear la matriz identidad de la dimensión dada. zeros(rows: int, cols: int, zero=0, identity=1): devuelve la matriz de ceros del tamaño rows×cols. Se pude pasar cuál es el elemento nulo y el neutro del cuerpo. Por defecto, el nulo será 0 y el neutro 1. ones(rows: int, cols: int, zero=0, identity=1): igual que zeros, pero los elementos de la matriz son el elemento neutro. identity_matrix(dim: int, identity=1, zero=0): devuelve la matriz identidad del tamaño indicado. gauss(matriz: Matrix, determinant=False, matriz_paso=False, elementary_matrixes=False, steps=None): aplica el método de Gauss y devuelve la matriz resultante. El parámetro steps sirve para escribir los pasos para la página web. El objeto pasado deberá tener el método append(str, str, str). Para los otros tres parámetros, si alguno de ellos es True, se pasará una tupla con la matriz resultante y los parámatros a True, en orden descrito en la llamada: primero determinant, luego matriz_paso y por último elementary_matrixes. • determinant: devuelve el número de cambio de filas realizado para calcular el determinante. 17 3.2. Código • matriz_paso: devuelve la matriz de paso que se obtiene al realizar las operaciones elementales. • elementary_matrixes: devuelve una lista ordenada con las matrices elementales asociadas a las operaciones elementales. gauss_jordan(matriz: Matrix, steps=None): aplica el método de Gauss-Jordan y de- vuelve la matriz resultante. El parámetro steps es similar al de gauss. rng(matrix: Matrix, steps=None): calcula el rango de la matriz. null(matrix: Matrix, steps=None): calcula el espacio nulo o kernel de la matriz y devuelve una lista de vectores generadores del espacio. Los vectores serán matrices con una columna. col(matrix: Matrix, steps=None): calcula el espacio columna o imagen de la matriz y devuelve una lista de vectores generadores. Al igual que para el espacio nulo, los vectores serán matrices con una columna. linear_system_sols(matrix: Matrix, latex=False, representation=False, steps=None, **kwargs): discute y resuelve el sistema de ecuaciones lineales que repre- senta la matriz pasada como argumento. La matriz será la matriz ampliada. Devol- verá una lista con las soluciones o saltará una excepción si el sistema es incompatible. Los parámetros de latex y representation sirven para saber si se quiere el resultado en formato LaTEX o para después utilizarlo con eval. Por ejemplo, si queremos resolver el sistema 2x + 3y −z = 9 x − 8y +4z = −3 −4x +z = 1 Realizaremos lo siguiente: >>> M=Matrix([[2,3,-1,9],[1,-8,4,-3],[-4,0,1,1]]) >>> linear_system_sols(M, vars=['x','y','z']) ['59/35', '156/35', '271/35'] Esto quiere decir que x = 5935 , y = 165 35 , z = 271 35 . Ahora pongamos un ejemplo de un sistema compatible indeterminado:2x + 3y −z = 9x − 8y +4z = −3 En esta ocasión devolverá ['-4/19*\\lambda_{3}+63/19', '9/19*\\lambda_{3}+15/19', '\\lambda_{3}'] que quiere decir x = − 419λ3 + 63 19 , y = 9 19λ3 + 15 19 y la tercera variable es libre. Si pasamos latex=True, devolverá ['-\\frac{4}{19}\\lambda_{3}+\\frac{63}{19}', '\\frac{9}{19}\\lambda_{3}+\\frac{15}{19}', '\\lambda_{3}'] 18 Código En cambio, si pasamos el parámetro representation=True, devolverá ['+Fraction(-4, 19)*\\lambda_{3}+Fraction(63, 19)', '+Fraction(9, 19)*\\lambda_{3}+Fraction(15, 19)', '\\lambda_{3}'] Esta representación del resultado permite que si luego reemplazamos cada parámetro λ por un valor y aplicamos la función eval, obtengamos el valor de la operación. Por ejemplo, si sustituimos λ3 por 2, podemos obtener lo siguiente: >>> res=linear_system_sols(M, vars=['x','y','z'], ... representation=True) >>> res=[exp.replace('\\lambda_{3}','2') for exp in res] >>> res=list(map(eval,res)) >>> print(res) [Fraction(55, 19), Fraction(33, 19), 2] Los valores de la lista final ya no son cadenas de caracteres, sino que son números y por tanto se podría operar con ellos. 3.2.2. alglin_api.py Este módulo es el módulo necesario para realizar la conexión entre la página web y el mó- dulo de algebra_lineal. Principalmente hay dos tipos de llamadas: las que dan información de título, descripción y algoritmo para las cuatro páginas creadas, y las que calculan y devuelven los pasos. 3.2.2.1. Llamadas de información Son cuatro, una para cada página, y devuelven un JSON con la estructura { "titulo": "string", "descripcion": "string", "algoritmo": "string" } /alglin/matrix/info: para la página de operaciones con matrices. /alglin/gauss-jordan/info: para la página de los métodos de Gauss y Gauss-Jordan. /alglin/linear_system/info: para la página de resolución de sistemas de ecuaciones lineales. /alglin/null-col/info: para la página de null o kernel y col o imagen de una matriz. 3.2.2.2. Llamadas de cálculos Son llamadas más complejos que las anteriores, pero el formato del JSON que deuelven es el mismopara todas: { "pasos": [ 19 3.2. Código { "paso": "string", "pasoLatex": "string", "descripcion": "string" } ] } Estas llamadas se pueden clasificar según la página para la que se ha diseñado. Igualmen- te, cuando el parámetro es una matriz será un string con formato [[a,b],[c,d]], que representa ( a bc d ). Las llamados son: /alglin/matrix/add/<path:mat1>&<path:mat2>:: suma de matrices. /alglin/matrix/sub/<path:mat1>&<path:mat2>: resta de matrices. /alglin/matrix/mul/<path:mat1>&<path:mat2>: multiplicación de matrices. /alglin/matrix/mul_esc/<path:mat>&<path:esc>: multiplicación de una matriz por escalar. /alglin/matrix/det/<path:mat1>: determinante de una matriz. /alglin/matrix/inv/<path:mat1>: inversa de una matriz. /alglin/matrix/trasp/<path:mat1>: transpuesta de una matriz. /alglin/matrix/rng/<path:mat1>: rango de una matriz. /alglin/gauss/<path:mat>: método de Gauss a una matriz. /alglin/gauss_jordan/<path:mat>: método de Gauss-Jordan a una matriz. /alglin/null/<path:mat>: espacio nulo o kernel de una matriz /alglin/col/<path:mat>: espacio columna o imagen de una matriz. /alglin/linear_system/<path:mat>&<vars>: solución de sistema de ecuaciones linea- les. La matriz pasada tiene que ser la matriz ampliada. El parámetro de vars es opcional. Si no se pasa, las variables serán x1, x2, . . . , xn. 20 Capítulo 4 Resultados y conclusiones A continuación se va a mostrar el funcionamiento de la aplicación, los distintos inputs que se pueden dar para cada problema y los distintos outputs. También se propondrán algunas aplicaciones del sistema en el aula y posibles mejoras del sistema y extensiones. 4.1. Funcionamiento de la aplicación Los contenidos desarrollados estarán, como es obvio, en la asignatura de Álgebra Lineal, y dentro de la asignatura en el apartado de Cálculo de matrices y Gauss-Jordan. Las imágenes que se muestran a continuación son de fecha 22 de mayo de 2023, así que es posible que el contenido sea visualmente diferente. Figura 4.1: Página de Álgebra Lineal, apartado de Cálculo de matrices y Gauss-Jordan Para este trabajo se han diseñado cuatro páginas propias en las que se resuelven los proble- mas tratados anteriormente. Están divididos según si son operaciones básicas o problemas similares. Las cuatro páginas son: Operaciones con matrices, Sistemas de ecuaciones linea- les, Gauss y Gauss-Jordan y Kernel y Col. 21 4.1. Funcionamiento de la aplicación 4.1.1. Operaciones con matrices En esta página se implementan las operaciones básicas de matrices con las que se puede trabajar. Estas son sumas, restas y multiplicaciones, si involucran dos matrices, y determi- nante, rango, transpuesta e inversa, para una única matriz. Para introducir las matrices se han diseñado tres formatos: 1. Formato “lineal”: Es la representación de la matriz en forma de lista de listas, como se escribiría en un lenguaje de programación. No es un formato amigable para usuarios con poca experiencia con ordenadores, pero permite copiar y pegar matrices dentro del sistema y además llevarte las matrices a programas propios. 2. Formato “celdas”: Es la representación por filas y columnas, como se representan las matrices. Es un formato mucho más amigable y visual para los usuarios, pero no permite copiar la matriz. Para elegir el tamaño de la matriz hay un input para filas y otro para columnas y según se van cambiando estos valores se va modificando la matriz donde se introducen los elementos de la matriz. 3. Formato “csv”: Es la representación de la matriz en un archivo de texto con el formato de valores separados por coma. Permite trabajar con matrices muy grandes y prácticamente inmanejables con los otros dos formatos. Estas formas de introducir las matrices se utilizará en las demás páginas de este trabajo para introducir matrices. Para realizar el cálculo deseado, bastará con introducir la matriz y dar al botón correspondiente. Admitirá números enteros, decimales separados por puntos y fracciones divididas por el símbolo “/”. Una vez se ha calculado, se mostrará el resultado por debajo de esta parte de inputs. 4.1.1.1. Operaciones para una matriz Figura 4.2: Inputs de una matriz en la página de Operaciones de matrices 22 Resultados y conclusiones Según sea el tipo de resultado, se mostrará un número (determinante y rango) o una matriz (producto por escalar, transpuesta e inversa) junto con un mensaje explicativo. Además, se podrá copiar el resultado en dos formatos, el formato lineal explicado antes y formato LaTEX, y además descargar el resultado en los formatos de LaTEX y csv. Por último, se podrá ver los pasos seguidos para obtener el resultado. Figura 4.3: Ejemplo de solución de obtener la matriz transpuesta Figura 4.4: Ejemplo de solución de rango de una matriz Si desplegamos los pasos seguidos, veremos una lista de pasos que detallan el proceso hasta obtener la solución. Para la transpuesta o el producto por escalar no habrá una gran explicación; sin embargo, para el rango o la inversa, que necesitan el algoritmo de Gauss, se mostrarán los pasos con su mensaje correspondiente. 23 4.1. Funcionamiento de la aplicación Figura 4.5: Ejemplo de pasos para el cálculo de matriz inversa 24 Resultados y conclusiones 4.1.1.2. Operaciones para dos matrices Figura 4.6: Inputs de dos matrices en la página de Operaciones de matrices El funcionamiento de operaciones que involucran dos matrices es similar al anterior, pero introduciendo las dos matrices. Las operaciones de dos matrices son básicas y no necesitan una lista de pasos para explicar el algoritmo, pero sí que se puede descargar y copiar el resultado. Figura 4.7: Solución de multiplicación de dos matrices 25 4.1. Funcionamiento de la aplicación 4.1.2. Gauss y Gauss-Jordan El diseño de la página para calcular matrices escalonadas con el algoritmo de Gauss o Gauss-Jordan es igual que el anterior, con la diferencia de que como solo se necesita un matriz, solo se puede introducir una matriz, como cabría esperar. Además, solo hay dos botones, el de Reducción de Gauss y el de Reducción de Gauss-Jordan. Figura 4.8: Input de matriz para reducción de Gauss-Jordan El estilo de los pasos relacionados con el método de Gauss son comunes con las demás páginas. Así, los usuarios podrán entender los pasos mejor, e identificarlos fácilmente, además de poder saltarlos en caso de que le interesen otros que se sitúan después de estos. 4.1.3. Sistemas de ecuaciones lineales Esta página es la que más dista de las otras en cuanto a su diseño. También se introduce una matriz, que es la matriz ampliada. Las columnas de la primera hasta la penúltima es la matriz de coeficientes, y la última la matriz de términos independientes. Opcionalmente se puede introducir las variables del sistema: x, y, z, . . .. En caso de no introducirlas, las variables por defecto son x1, x2, x3, . . . 26 Resultados y conclusiones Figura 4.9: Pasos para reducción de Gauss-Jordan 27 4.1. Funcionamiento de la aplicación Figura 4.10: Input de sistemas de ecuaciones lineales Según el sistema sea compatible o incompatible, la solución se mostrará de diferente forma. En caso de que sea compatible indeterminado, se añadirán parámetros (λ) y se represen- tarán las soluciones del sistema con unas ecuaciones paramétricas. En caso de que el sistema sea incompatible, simplemente se mostrará el mensaje de que el sistema no tiene solución. Figura 4.12: Solución de sistema incompatible 28 Resultados y conclusiones Figura 4.11: Solución de sistema compatible indeterminado En cualquier caso, hay un paso en el que aplicando el teorema de Rouché-Frobenius se explica el por qué del tipo de sistema que es: Figura 4.13: Discusión de un sistema 4.1.4. Col y null de una matriz En esta página se calcula la imagen o espacio columna y el kernel o espacio nulo de una matriz. Como el input es básicamente el mismo que en las demás páginas, no hay diferencias significativas con las demás páginas. Lo que cambia es cómo se muestra el resultado. Comolo que se calcula son dos espacios vectoriales, la solución es un grupo de vectores generadores del espacio deseado. Por ejemplo, para la matriz 0 −2 4 1 2 12 −6 2 −4 1 3 −5 29 4.2. Aplicaciones en el aula obtenemos los siguientes resultados: (a) Solución de null de una matriz (b) Solución de col de una matriz Figura 4.14: Soluciones de col y null de una matriz 4.2. Aplicaciones en el aula El Proyecto Calculadora está pensado desde una visión didáctica para ayudar a los es- tudiantes del grado en el aprendizaje de los contenidos, en este caso de la asignatura de Álgebra Lineal. Su utilización puede ir desde reforzar los conocimientos poniendo ejem- plos, hacer pruebas con matrices de distintos tamaño para ver qué ocurre o incluso para resolver ejercicios. Esto último no supone un problema, en el sentido que por mucho que se obtenga un resultado lo importante no es obtener el resultado correcto, sino comprender el por qué se obtiene lo que se obtiene y entender los procesos internos de los algoritmos. Alguna aplicaciones posibles pueden ser: Cálculos con matrices. Los cálculos con matrices no son complicados, pero pueden ser largos y la probabilidad de cometer errores a la hora de operar son altas, sobretodo cuanto más grandes son las matrices. Gracias a este sistema se podrían comprobar resultado rápidamente y fácilmente, sin necesidad de revisar todos los cálculos rea- lizados. Además si se trabaja con matrices de dimensiones considerablemente altas, el sistema permite guardarlas en un fichero descargable para su reutilización más adelante. Comprobación de resultados. Gracias a este sistema la comprobación de si un resul- tado es el correcto es simple, y además gracias a explicitar los pasos, es posible ver dónde está el fallo o los fallos cometidos. Cálculo de ker e imagen de una aplicación lineal. Si tenemos la matriz asociada a un aplicación lineal, podemos calcular el ker y la imagen de la aplicación. Resolución de sistemas de ecuaciones lineales. Tanto para resolver un ejercicio que sea obtener las soluciones del sistema como para obtener las soluciones en un ejercicio 30 Resultados y conclusiones en el que el sistema sea un paso, la aplicación puede servir para ayudar al ahora de hacer cálculos. Obtener la matriz en LaTEX. Escribir una matriz en LaTEX, sobretodo si es grande, puede ser un trabajo pesado y tedioso, un trabajo que puede ser automatizado gracias a la aplicación si se multiplica la matriz por el escalar 1. 4.3. Mejoras y extensiones del sistema Como todo sistema informático, el producto final no es perfecto. Por tanto, hay que realizar un análisis sobre los aspectos que podrían mejorar, posibles extensiones y nuevas funcio- nalidades que fueren útiles y además hay que mantener un seguimiento por los fallos del sistema para ponerles solución. Entre las posibles mejoras podemos destacar los siguientes aspectos: El código del módulo de algebra_lineal es difícil de entender, sobre todo los métodos de Gauss y el de resolver sistemas de ecuaciones lineales. Hay demasiados bloques de condicionales y bucles anidados, lo que dificulta la legibilidad. La razón de esto es poder incluir los pasos junto con su descripción y crear las cadenas de caracteres bien formadas, sin el caracter “+” al principio ni multiplicando 1 a una variable, por ejemplo. Igualmente, se podría haber mejorado creando más funciones auxiliares, incluso es posible que se evite tener código repetido. El diseño de la página de sistemas de ecuaciones lineales no cambia con respecto a las demás páginas. El input sigue siendo una matriz, cuando en realidad se están introduciendo las ecuaciones y no los elementos de la matriz. Para usuarios que no saben cómo funciona bien quizás no entiendan o no sepan lo que es la matriz ampliada. Habría que dar una vuelta al diseño para que visualmente sea lo más similar a un sistema de ecuaciones escrito, es decir, con este formato: a11x1 + a12x2 + . . . + a1nxn = c1 a21x1 + a22x2 + . . . + a2nxn = c2 ... am1x1 + am2x2 + . . . + amnxn = cm Los elementos admitidos para introducir la matriz son solo los números racionales. Aunque ya es un punto de partida bastante bueno, faltan los números irracionales más usados como π, e, etc. Igualmente faltan las operaciones de suma o multiplica- ción para poder así introducir por ejemplo 1+2π, o raíces y logaritmos e incluir más números irracionales como √ 2, que también es bastante usado. En cuanto a las extensiones que se pueden considerar útiles se encuentran las siguientes: Matriz de cambio de base. Sea V un espacio vectorial de dimensión n y sean B = {e⃗1, . . . , e⃗n} y B′ = {e⃗′1, . . . , e⃗′n} dos bases de V , y x⃗, ⃗x ′ ∈ V vectores respecto de B y B′ respectivamente. Entonces el problema consiste en encontrar la matriz C, matriz de cambio de base de B a B′, tal que x⃗ ′ = C · x⃗ 31 4.3. Mejoras y extensiones del sistema Parámetros en la matriz. El problema consiste en introducir parámetros en un sis- tema de ecuaciones lineales y discutir y resolver el sistema en función del valor del parámetro. Para esto sería necesario la creación de una clase que represente los polinomios y definir las operaciones en Python de suma, resta, multiplicación y di- visión. También es posible que sea necesario definir el método __repr__ para poder recoger el resultado y transformarlo de la cadena de caracteres a polinomio. Diagonalización de matrices. Si se implementa lo anterior explicado, sería posible calcular el polinomio característico, y si se implementa la resolución de ecuaciones de grado superior se obtendrían los autovalores, y así poder diagonalizar. 32 Capítulo 5 Impacto En este capítulo se realizará un análisis del impacto potencial de los resultados obtenidos durante la realización del TFG en diferentes contextos: Personal Empresarial Social Económico Medioambiental Cultural 5.1. Impacto personal Este TFG tiene impacto personal significativo en lo referido al desarrollo académico. Gra- cias a diseñar y escribir módulos en Python implementando la clase de matrices y algo- ritmos relacionados con ellas, se ha adquirido un conjuntos de habilidades y conocimientos con un posible impacto positivo en el desarrollo personal. Para empezar, el trabajo ha permitido profundizar en los conocimientos de programación en el lenguaje Python , sobre todo en lo referente a los llamados métodos especiales como pueden ser __add__, __mul__, etc. que permiten la utilización de operadores como “+”, “*”, etc. igual que si se trabajase con números, haciendo que el código sea menos lioso, más corto y más entendible. Además de esto, también ha fortalecido las competencias en el manejo de cadenas de caracteres, tanto para las explicaciones de los pasos como para crear los resultados. Esto incluye los métodos de __str__, __repr__ y las funciones de linear_system_sols y por tanto null. Más allá del desarrollo y de la implementación de los módulos, este trabajo ha permitido una comprensión de los conceptos matemáticos más profunda, aunque la teoría ya fuera bien conocida. Asimismo, se ha adquirido la habilidad de poder escribir los resultados matemáticos en un documento de LaTEX. 33 5.2. Empresarial 5.2. Empresarial En cuanto al ámbito empresarial, este trabajo no tendrá un gran impacto. Ya existen módulos en Python mucho más eficientes, mucho más testados y con muchas más fun- cionalidades que este. El principal objetivo del trabajo es didáctico y por tanto todo se ha centrado en ese apartado. Aún así, es posible que en ámbitos educativos se utilice esta herramienta para complementar los contenidos de la clase. Además, si ayuda a los estu- diantes a consolidar los conocimientos, puede provocar una mayor tasa de aprobados, y así los alumnos no tendrán que pagar segundas matrículas, que también pueden suponer un gasto importante según la situación económica de cada uno. 5.3. Social Aunque en el apartado empresarial no vaya a ser muy relevante, en el apartado social elimpacto será mayor. En primer lugar, y el más importante, tendrá un impacto educativo. Se ha diseñado como una herramienta para utilizarse en entornos educativos, como ins- tituciones académicas o distintas plataforma de aprendizaje. Al proporcionar una forma accesible de comprender y resolver problemas matemáticos, el TFG puede ayudar a los estudiantes a mejorar en su comprensión y quizás fomentar su interés en esta área. Aparte de ser práctico para estudiantes, a su vez puede ser beneficioso para otras personas que estén interesadas en otras áreas que utilicen matrices y sistemas de ecuaciones lineales, como por ejemplo en ingenierías, física o economía. Al facilitar el cálculo de operaciones simples pero largas de hacer, puede tener un impacto en el avance del conocimiento e innovación en diversas disciplinas. En el contexto social, también puede ser relevante para organizaciones que trabajen en la promoción de la educación. Estas entidades podrían usar la página web y por tanto los módulos como herramientas educativas y así reducir la brecha educativa y promover la igualdad de oportunidades. 5.4. Económico En cuanto al impacto económico, el presente TFG junto con los de mis compañeros pue- den tiene un potencial impacto a nivel individual al ofrecer herramientas gratuitas a los estudiantes que pueden causar el ahorro en otras herramientas no gratuitas y que suponen un coste elevado (como pueden ser clases particulares o plataformas online). 5.5. Medioambiental El impacto medioambiental será prácticamente nulo. Si bien es cierto que la implementa- ción está pensada para ser lo más eficiente posible, al no ofrecer algoritmos extremada- mente eficientes indirectamente tampoco supondrá la reducción del consumo de recursos computacionales. Al fin y al cabo éste no es el objetivo principal del TFG. 34 Impacto 5.6. Cultural En lo relacionado al apartado cultural, quizás el impacto no sea el más significativo de todos. De todas formas, puede contribuir de varias formas al enriquecimiento cultural de la sociedad. Para empezar, puede promover el interés por las matemáticas, que son un bien cultural universal. Al tratar conceptos fundamentales y ofrecer herramientas prácticas y accesibles puede ayudar a eliminar la percepción negativa de las matemáticas y fomentar una visión más positiva. Además, la aplicación permite a las personas la exploración y la experimenta- ción de manera interactiva. Esto puede suponer la estimulación de un pensamiento crítico y creativo en relación con las matemáticas. 35 Este documento esta firmado por Firmante CN=tfgm.fi.upm.es, OU=CCFI, O=ETS Ingenieros Informaticos - UPM, C=ES Fecha/Hora Wed May 31 17:24:52 CEST 2023 Emisor del Certificado EMAILADDRESS=camanager@etsiinf.upm.es, CN=CA ETS Ingenieros Informaticos, O=ETS Ingenieros Informaticos - UPM, C=ES Numero de Serie 561 Metodo urn:adobe.com:Adobe.PPKLite:adbe.pkcs7.sha1 (Adobe Signature) Introducción Marco teórico Matrices Matriz transpuesta Matriz cuadrada Operaciones con matrices Suma de matrices Producto por escalar Producto de matrices Algoritmo de Gauss-Jordan Matrices equivalentes por filas Operaciones elementales Forma escalonada de una matriz Forma escalonada reducida de una matriz Algoritmo de Gauss Algoritmo de Gauss-Jordan Aplicaciones del algoritmo de Gauss-Jordan Rango de una matriz Determinante de una matriz Cálculo de inversa Discusión y resolución de sistemas de ecuaciones lineales Teorema de Rouché-Frobenius Imagen (o col) de una matriz Kernel (o null) de una matriz Código Librerías externas Código algebra_lineal.py Clase Matrix Funciones del módulo alglin_api.py Llamadas de información Llamadas de cálculos Resultados y conclusiones Funcionamiento de la aplicación Operaciones con matrices Operaciones para una matriz Operaciones para dos matrices Gauss y Gauss-Jordan Sistemas de ecuaciones lineales Col y null de una matriz Aplicaciones en el aula Mejoras y extensiones del sistema Impacto Impacto personal Empresarial Social Económico Medioambiental Cultural 2023-05-31T17:24:52+0200 tfgm.fi.upm.es
Compartir