Logo Studenta

TFG_JAIME_JIMENEZ_JIMENEZ

¡Este material tiene más páginas!

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

Continuar navegando

Contenido elegido para ti

426 pag.
algebralineal2

User badge image

carolainstefania zambra paredes

56 pag.
MATRICES Y DETERMINANTES

User badge image

JOSE ANTONIO VELIT KUOMAN

Otros materiales