Una introducción básica a Matlab/Octave PARA LA DIDÁCTICA ...€¦ · estándar para las...
Transcript of Una introducción básica a Matlab/Octave PARA LA DIDÁCTICA ...€¦ · estándar para las...
1
Una introducción básica
a Matlab/Octave PARA
LA DIDÁCTICA del
Álgebra Lineal
Hernán Darío Toro Agudelo
2019-02-06
Justificación
Parte importante de un curso moderno de Álgebra Lineal son los métodos de solución de sistemas
de ecuaciones lineales por medio de operaciones fila sobre matrices que los representan. Al
abordarse este tema en clase, se ha generado una censura autoimpuesta por docentes quienes, por
agilizar las ilustraciones en clase y no perder tiempo en operatividad, favorecen problemas de
dimensión trivialmente baja, lo que aleja al estudiante de las aplicaciones cotidianas de la
ingeniería que involucran centenares o miles de ecuaciones en un número comparable de
variables.
El uso del lenguaje Matlab y su clon Octave presenta una sintaxis muy intuitiva y ágil que permite
al estudiante efectuar operaciones fila sobre matrices para reducir y eliminar de forma “manual”
a la matriz que represente al sistema de ecuaciones. Al enseñar estos procesos, esta estrategia de
utilizar un sistema de cómputo de forma “manual” tiene la ventaja de que permite al estudiante
concentrarse en la asimilación de los conceptos y procesos y lo ejercita en el uso de matrices de
dimensiones más realistas respecto a las aplicaciones frecuentes de ingeniería. Este enfoque es
más pertinente que los dos extremos viciosos, a saber, uno: usar matrices minúsculas que alejan
de las aplicaciones de la ingeniería, y dos: usar comandos automáticos para reducción de matrices,
que ocultan el proceso de solución al estudiante.
Dadas las diferencias en competencias computacionales entre estudiantes y docentes de diferentes
generaciones, en esta breve introducción se partirá por completo desde cero, y sólo se enseñarán
los elementos necesarios de la sintaxis para reducir matrices manualmente ayudados por el
computador. Como esta funcionalidad se encuentra de sobra en el servidor gratuito octave-
online.net en la opción sin cuenta inscrita, se dejará para entregas posteriores los aspectos de
descarga e instalación de tales lenguajes en el computador local.
Por último, este tutorial estará completamente intercalado de sugerencias simples para ejercitarse
sobre lo visto, casi que sobre la misma marcha. A pesar de que la mayoría de las sugerencias de
ejercicio puedan ser vistas como algo casi trivial, se recomienda encarecidamente al lector para
que las lleve a cabo. Matlab/Octave es un lenguaje, y cualquier experto en didáctica de los
lenguajes sabe que, a diferencia de otras funciones humanas, el obtener fluidez en un lenguaje
REQUIERE IRREMISIBLEMENTE LA REPETICIÓN CONTINUA. De lo contrario, se olvida.
Reciba usted una cordial bienvenida a este camino de aprendizaje.
2
Contenido
0. Entrada a Octave Online.
1. Octave como calculadora.
2. Entrada de variables.
3. Creación de vectores y matrices.
4. Matrices fundamentales.
5. Indexación elemental de matrices.
6. Operaciones por fila en matrices.
7. Reducción manual de matrices con fines didácticos.
8. Redución automática de matrices con el comando rref.
9. Creación de matrices por bloques.
10. Álgebra básica de matrices.
0. Entrada a Octave Online
Octave es un lenguaje de programación interpretado de alto nivel que surgió como alternativa
gratuita a Matlab. Aunque se puede descargar un instalador en la dirección
https://www.gnu.org/software/octave/ , el objetivo para este documento es tan básico que no es
necesario instalarlo. Los comandos que se usarán para explicar Álgebra Lineal con Octave se
pueden efectuar en la página http://octave-online.net , a la cual se puede acceder dando un clic
en el enlace, o ingresando esa página en el campo de dirección URL de su explorador de
internet. Por ejemplo, en Google Chrome se haría así:
Eso nos lleva a la ventana de bienvenida de Octave Online. Se puede comenzar a usar la interfaz
de usuario para hacer cálculos después de cerrar la imagen de bienvenida dando click en la ×
señalada en la imagen a continuación:
3
1. Octave como calculadora
La interfaz de usuario de Octave permite efectuar cálculos interactivos usando la notación
estándar para las operaciones matemáticas básicas. Basta ingresar los comandos que se quieran
efectuar en la casilla de entrada de comandos que se señala en la imagen siguiente, seguida de la
tecla intro (enter, o return) que en adelante representaremos con el signo ↵.
Se sugiere encarecidamente que, en adelante, el lector tenga una ventana de explorador abierta
con ese sitio web, para que vaya haciendo las operaciones sugeridas en la interfaz web de
Octave.
Por ejemplo, si se quiere sumar 𝜋 + 𝑒, bastaría teclear:
pi + e ↵
La salida que se obtiene es la siguiente:
ans = 5.8599
Octave siempre almacena el último cálculo realizado en una variable temporal llamada “ans”
(del inglés “answer”, respuesta). Al realizar cualquier otro cálculo directo el último resultado
será el que se almacene en esa variable. Por ejemplo, si se quiere obtener el seno de 𝜋/7, se
escribe en la casilla de comandos
sin(pi/7) ↵
se obtiene:
ans = 0.43388
Para recordar el valor del último cálculo realizado basta escribir:
4
ans ↵
Octave le recordará cuál fue el último valor calculado, en nuestro caso,
ans = 0.43388
Otro aspecto importante de Matlab/Octave es que se puede acceder al historial de comandos
introducidos por el usuario presionando la flecha hacia arriba (para ir hacia los más antiguos) y
flecha hacia abajo (para devolverse hacia los más recientes). Se insta al lector a que verifique lo
anterior. Una vez localizado un comando previamente introducido que quiera volverse a
realizar, basta presionar ↵
Por ejemplo, si se quisiera repetir el primer comando que usamos en este documento, la suma de
𝜋 con 𝑒, el usuario sólo tendría que presionar la siguiente secuencia de teclas:
↑ ↑ ↑ ↵
Lo que arrojaría:
ans = 5.8599
Vale la pena mencionar que para borrar todas las variables almacenadas en memoria antes de
comenzar un nuevo trabajo, se puede usar la orden: clear all ↵ mientras que, para borrar
la pantalla de la consola, sin borrar ninguna variable almacenada, se usa el comando clc
↵ (del inglés, “clear console” ).
Recuerde también que ante cualquier duda en cualquier comando, puede usar la orden
help
seguida del nombre del comando del cual tenga duda. No olvide presionar la tecla “enter”, para
obtener una descripción detallada de cada comando y sus variantes en la sintaxis para usarlo.
(Espacio intencionalmente en blanco)
Calistenia:
Hacer la siguiente secuencia de cálculos:
La tangente de 𝜋/7, luego la suma de los siete primeros números primos, luego el volumen
de un paralelepípedo de lados 3, 7 y 9, luego el cuadrado de 27 ( usando el símbolo ^ para
expresar la potencia dos), luego la raíz cuadrada de 2 (usando el comando sqrt( ) del inglés
“SQuare RooT” que significa “Raíz Cuadrada”). Por último, haga la suma de los ocho
primeros números primos devolviéndose con flecha arriba ↑ hasta la suma de los siete
primeros primos, y editando ese comando para agregar el octavo número primo.
5
2. Entrada de variables
Más poderoso que hacer cálculos directos en Octave/Matlab es utilizar variables para almacenar
datos y luego usarlas para calcular otros valores. Los nombres de variables en Octave pueden
mezclar letras, números y guiones bajos “_”, pero todo nombre de variable debe comenzar por
una letra (no puede iniciar con un número). Además, para Octave, una letra mayúscula y otra
minúscula representan dos variables diferentes.
Por ejemplo, todos estos son nombres válidos Y DIFERENTES de variables en Octave:
A, a, a1, pepito, Pepito, PEPITO, Indice03, ...
Son nombres inválidos, los siguientes:
1Z, 10juan, índice, variable?, niño, ...
Para asignar valores a variables se usa el símbolo “=” que en Octave/Matlab no significa
igualdad matemática, sino ASIGNACIÓN DE VALOR. Para usar el signo de “=” en Octave
con el fin de asignar un valor a una variable, en el lado izquierdo del signo “=” se escribe el
nombre de la variable que se quiera usar, y en el lado derecho, se pone el valor que se quiera
almacenar. Por ejemplo, si un paralelepípedo tiene ancho 3, largo 7 y altura 5, podríamos
asignar variables para esas medidas así:
a = 3 ↵
l = 7 ↵
h = 5 ↵
Después de cada presión de la tecla “Enter/Return/Intro” ↵ , irán apareciendo intercaladas las
respuestas, que se conocen como el “eco” y son la confirmación de que Octave entendió el
cálculo o asignación solicitada por el usuario. La pantalla debe mostrar algo así:
Con esos datos en memoria, se podría calcular fácilmente el volumen del paralelepípedo como:
V = a*l*h ↵
Se encontraría esta respuesta:
6
Si no se quiere que Octave haga eco (o confirmación) después de cada asignación de variable o
cada cálculo, basta poner un punto y coma (;) después de cada comando, antes de presionar ↵ .
Por ejemplo, si un cilindro tiene radio 4 y altura 10, se pudo calcular su volumen, sin hacer eco
al definir sus propiedades, de esta manera:
R = 4 ;↵
H = 10 ;↵
Vol = H*pi*R^2 ↵
Los comandos previos hubieran arrojado la siguiente salida:
Nótese que en este caso no hubo eco después de los dos primeros comandos, pero sí hubo eco
en el último, porque a éste no se le puso el “;” al final.
El punto y coma “;” no sólo sirve para evitar el eco en la consola de Octave. También sirve para
separar comandos en una misma línea. Por ejemplo, se pudo calcular el área lateral del
paralelepípedo en una sola línea, así:
a = 3; l = 7; h = 5; AL = 2*(a*l + a*h + l*h) ↵
Lo que arroja:
Nótese en este caso, que Octave sólo dio el eco de la última cantidad calculada, porque no se le
puso el punto y coma. Si lo hubiéramos escrito con punto y coma al final después del comando
para AL, no hubiera presentado la respuesta. Para poderla ver, hubiéramos tenido que pedirle a
Octave que nos mostrara el valor de esa variable luego de calculada, justo como habíamos
pedido que nos recordara la última respuesta llamando a la variable “ans”.
Más calistenia:
Dado que hay tres tipos de lados en un paralelepípedo, y que esos lados aparecen por
duplicado (adelante-atrás, arriba-abajo, izquierda-derecha), asigne a una variable A el área
lateral total del paralelepípedo.
Si un tronco de cono circular recto tiene una altura 15 desde la base hasta el vértice, y un
radio de 10 de la base, adjudique esos dos valores a dos nombres de variables que usted
prefiera y, llamando a esas variables, calcular el área que encierra completamente al tronco
de cono, y su volumen total.
7
En este caso, tendríamos que haber pedido recordar a la variable AL, tecleando:
AL ↵
Eso nos hubiera dado como respuesta el valor del área lateral calculado, como se muestra aquí:
(Espacio intencionalmente en blanco)
8
3. Creación de vectores y matrices
Las variables que dan poder a Matlab/Octave son las matrices. De hecho, para estos lenguajes,
todas las variables numéricas son matrices:
Un escalar es una matriz 1 por 1
Un vector fila es una matriz 1 por n
Un vector columna es una matriz n por 1
Dado que ya tratamos la entrada de escalares (matrices 1 por 1) en la sección anterior,
procedamos con los que nos queda faltando.
3.1. Entrada de vectores fila Para ingresar directamente un vector fila, se utiliza el mismo signo “=” de asignación, sólo que
ahora, en miembro derecho de esa asignación, se usan corchetes para agrupar las componentes
del vector; dentro del corchete, los elementos se separan con comas. Por ejemplo, para ingresar
el vector �⃑� = (10,−5, 7), bastaría introducir el siguiente comando:
v = [10, -5, 7] ↵
La respuesta de la consola es la siguiente:
Cuando las componentes del vector son números o variables aisladas, basta usar espacios para
separar las componentes en una fila. Por ejemplo:
x=1; y=2; z=3; ↵
radar = [x y z] ↵
entrega la siguiente salida en la consola:
No obstante, cuando hay operaciones involucradas, se sugiere usar las comas. Por ejemplo, para
definir un vector que dependiera de las variables x, y, z , ya en memoria, se procede así:
F = [ x – y , y + x , z ] ↵
Ahí los espacios no tendrán función de separación de componentes; sólo de dar claridad al
lector del código. El resultado es el siguiente.
9
3.2. Entrada de vectores columna Para ingresar directamente un vector columna, la única diferencia es que la separación entre
componentes se hace con punto y coma “;”. Por ejemplo, para ingresar el vector columna
𝑐 = (𝑥𝑦𝑧)
basta teclear lo siguiente:
c=[x;y;z] ↵
La salida de la consola muestra la diferencia.
Más ejercicios para fijar el lenguaje:
Asigne los valores 3.7189432, 7.23245 y 9.8765468 a tres variables. Luego, llamándolas,
cree un vector fila que en su primera componente contenga el promedio de los tres números,
en la segunda componente un promedio ponderado de los tres números, según su posición
(el primer número vale 1, el segundo vale 2, y el tercero vale 3). En la tercera componente
debe ir la suma total de los números.
Si el radio de una esfera, el radio de la base y la altura de un cono, y el radio de la base y la
altura de un cilindro, son todos iguales a 1, cree un vector fila con los volúmenes de dichos
sólidos en su orden.
Más ejercicios para fijar el lenguaje:
Asigne e los valores 3.7189432, 7.23245 y 9.8765468 a las variables x,y,z. Cree un vector
columna cuyas componentes incluyan, en ese orden: promedio de las variables, promedio de
las dos primeras, promedio de las dos últimas, promedio de la primera y la última, y
producto de las tres variables.
10
3.3. Entrada de matrices
Entrar matrices es extremadamente simple. Los elementos se introducen manualmente en forma
de filas, separando cada elemento con coma (o espacios, si es pertinente). Al llegar al final de
cada fila, se salta al siguiente renglón, usando punto y coma. De cierta forma, es como si la
matriz se ingresara como una columna de filas:
𝐴 = (
𝑎11 𝑎12
𝑎21 𝑎22
𝑎31 𝑎32
) = (
(𝑎11 𝑎12)(𝑎21 𝑎22)(𝑎31 𝑎32)
) ,
Así, para entrar la matriz
𝐴 = (1 23 45 6
) = (
(1,2)(3,4)(5,6)
) ,
basta ingresar el siguiente comando, prestando atención a los signos de separación: la coma
separa componentes en una fila, y el punto y coma separa una fila de la siguiente:
A=[1,2;3,4;5,6] ↵
La consola devuelve el siguiente eco:
Una matriz también se puede entrar como una fila de columnas, pero esto implica agrupar cada
columna entre corchetes. Sería lo equivalente a hacer:
𝐴 = (
𝑎11 𝑎12
𝑎21 𝑎22
𝑎31 𝑎32
) = ((
𝑎11
𝑎21
𝑎31
) , (
𝑎12
𝑎22
𝑎32
)) .
Por ejemplo, para ingresar la misma matriz
𝐴 = (
𝑎11 𝑎12
𝑎21 𝑎22
𝑎31 𝑎32
) = ((135) , (
246)) ,
se usaría el comando que sigue:
A=[[1;3;5],[2;3;4]] ↵
11
El resultado es exactamente el mismo que en el caso anterior. Nótese bien cómo se usaron las
comas y los punto y comas en cada caso.
En caso de que quede una duda del tamaño de una matriz, siempre está la opción del comando
“size” (del inglés, “tamaño”), que daría la dimensión de la matriz en número de filas y número
de columnas, almacenados en un vector fila de dos componentes. Así, si después de ingresar la
matriz anterior, se teclea
size(A) ↵
Ese comando entrega la dimensión de la matriz que definimos previamente, que es 3 por 2 (o
sea de 3 filas y 2 columnas):
4. Matrices fundamentales
Resultaría francamente absurdo y eterno ingresar manualmente una matriz como la siguiente:
𝐴 =
(
0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
Para eso existen comandos que pueden entregar una matriz de ceros del tamaño que se requiera.
12
Por ejemplo, al ingresar
B=zeros(6,15) ↵
Octave definirá la matriz de ceros arriba mostrada, y la almacenará en una variable B para usarla
en lo que necesitemos. Octave muestra la matriz por bloques de columnas:
También podríamos crear otra matriz de ceros, del mismo tamaño de la matriz A previamente
definida, usando el comando
C=zeros(size(A)) ↵
Ese comando básicamente dice: “Almacene en la variable C una matriz de ceros del mismo
tamaño de la matriz A”. El resultado es obvio:
Si lo que se quiere es definir una matriz de unos del mismo tamaño de la enorme matriz B
repleta de ceros que definimos arriba, bastaría usar una orden análoga, pero apta para llenar de
unos cualquier matriz; la orden ones (del inglés, “unos”)
D=ones(size(B)) ↵
13
El resultado es el esperado:
Otra matriz que sería tremendamente tediosa de llenar es una matriz diagonal. Sería una pérdida
innecesaria la entrada de ceros a los lados de la diagonal principal, si el tamaño de la matriz es
grande. En ese caso se usa la orden diag, para crear una matriz con elementos sólo en la
diagonal, los cuales se especifican de forma ordenada dentro de un vector en corchetes que va
dentro de los paréntesis del argumento de la función diag:
d=diag([1,2,3,4,5,6,7,8,9,10]) ↵
Resultado:
Note que conocer estas órdenes es fundamental. De tener que ingresar 100 componentes de una
matriz, pudimos definirla definiendo solamente las 10 componentes diagonales que nos
interesaban. El ahorro de tiempo es de 90%.
Si se quiere crear una matriz diagonal no cuadrada; con una dimensión rectangular dada, se
puede modificar la orden previa para generar la matriz, agregando después del vector con las
14
componentes de la diagonal, una pareja de números que representan, respectivamente, el
número de filas y columnas que se desean en la matriz resultante.
Por ejemplo para crear una matriz diagonal de 10 por 20 cuyos primeros 5 componentes de la
diagonal principal fueran 2, 4, 6, 8 y 10, basta teclear:
E=diag([2,4,6,8,10], 10,20) ↵
El eco muestra nuestra matriz deseada:
Nótese que, manualmente, habríamos tenido que meter 200 números, mientras que sólo
terminamos definiendo manualmente 5 de las componentes y los dos números que definen la
dimensión de la matriz resultante. El ahorro en tiempo fue cercano al 96.5%, pues sólo se tardó
un 3.5% del tiempo que hubiera tomado definir manualmente esa matriz. Todos los elementos
que no determinamos en el comando, son rellenados automáticamente con ceros por la consola
de Octave.
Otra matriz importantísima en el álgebra de matrices es la matriz identidad (cuadrada) de orden
n (su dimensión es n por n). En este caso, el comando para crearla es “eye” (así se pronuncia en
inglés la letra “I” que es la que representa a esa matriz universalmente).
Así, si se quiere definir una matriz identidad de 20 por 20, basta escribir
I20=eye(20) ↵
15
Ese comando almacenará esa matriz identidad de orden 20 en la variable I20. El resultado
esperado es:
El ahorro de tiempo es extraordinario. Si hubiéramos tenido que meter a mano esa matriz,
hubiéramos tardado más de 400 veces el tiempo para entrar el comando ilustrado.
Otro tipo de matrices fundamentales se pueden consultar en la documentación respectiva del
lenguaje.
(Espacio intencionalmente en blanco)
Más ejercicios para fijar el lenguaje:
Ilustre todas y cada una de las formas de definir matrices con ejemplos variados de las
dimensiones que se le antoje. Es crucial que practique.
16
5. Indexación elemental de matrices
La indexación de matrices se refiere a la posibilidad de referirse a elementos específicos dentro
de la matriz, sean elementos, filas, o columnas, sin tener que manipular todas las componentes
de la matriz simultáneamente. Es el equivalente a llamar por su nombre a un individuo o un
grupo de individuos entre una multitud.
5.1. Indexación de componentes individuales de matrices
Aunque lo normal en la notación matemática universal es reservar letras mayúsculas para el
nombre de las matrices y las letras minúsculas respectivas para referirse a sus componentes, no
pasa lo mismo en Octave/Matlab.
Por ejemplo, en notación matemática, para referirse al elemento en la posición 𝑖, 𝑗 de la matriz
𝐴, se usa el símbolo 𝑎𝑖,𝑗 = 𝑎𝑖𝑗.
En Matlab y Octave NO SE SIGUE ESA CONVENCIÓN: en estos lenguajes, el símbolo que
representa a una matriz y el símbolo que representa a sus componentes debe ser el mismo, sólo
que se agrega un paréntesis con los índices fila y columna separados por una coma al referirse a
una componente.
Por ejemplo si la matriz que vamos a manipular se llama A (con mayúscula) entonces su
componente de la fila i y la columna j se llama A(i,j).
Note la diferencia con la notación matemática estándar: En Matlab HAY QUE USAR EL
MISMO SÍMBOLO DE LA MATRIZ PARA REFERIRSE A SUS COMPONENTES:
Objeto matemático Notación
matemática
Notación en
Matlab/Octave
Matriz “A” 𝐴 A
Componente 𝑖, 𝑗 de la matriz “A” 𝑎𝑖𝑗 A(i,j)
Matriz “TablaDatos” ¿𝑇𝑎𝑏𝑙𝑎𝐷𝑎𝑡𝑜𝑠? TablaDatos
Componente 3,7 de la matriz “TablaDatos” ¿𝑇𝑎𝑏𝑙𝑎𝐷𝑎𝑡𝑜𝑠3 7? TablaDatos(3,7)
La indexación es medular a la hora de manipular componentes específicas de matrices. Por
ejemplo, resultaría francamente absurdo introducir a mano la siguiente matriz en Octave:
𝐵 =
(
0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 55 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 4.8 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 371)
Es claro que, con base en una matriz de ceros de dimensión 6 × 15, como la matriz 𝐴 que
habíamos definido en la sección 3.4, sólo habría que cambiar tres elementos. Eso sugeriría crear
primero la matriz de ceros, con la orden “zeros” ya vista, y luego modificar las tres entradas
necesarias como se explica a continuación. Pero ni siquiera es necesario el primer paso.
Basta definir de entrada la última componente de la matriz 𝐵.
17
Para hacerlo, hay que crear una componente en la fila 6, columna 15, de la matriz B,
asignándole su valor de 371 así:
B(6,15)=371 ↵
Como respuesta, Octave automáticamente creará espacio suficiente en memoria para una matriz
que pueda albergar una componente de valor 371 en la posición (6, 15) y el resto de la matriz la
llenará de ceros:
Note que nos ahorramos crear primero la matriz de ceros. Ahora sólo basta modificar las
componentes restantes: la (2, 13) con su valor de 55, y la (4, 4) con su valor de 4.8, con la línea
siguiente:
B(2,13)=55; B(4,4)=4.8 ↵
(Recuerde que se pueden hacer varios comandos en una misma línea de texto, separados con
“;”)
18
La salida de la consola muestra la matriz deseada:
Más ejercicio para asimilar el lenguaje:
Introduzca la siguientes matrices en Octave:
𝑀1 =
[ 1 1 1 1 1 1 1 1 1 1 1 121 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 −33 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10𝜋1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 144 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ]
Sugerencia: cree una matriz de unos con la orden ones y luego modifique las 4
componentes necesarias como ya se vio.
𝐷𝑎𝑡𝑜𝑠 =
(
50 0 0 0 0 0 0 0 0 0 0 1880 40 0 0 0 0 0 0 0 0 0 00 0 30 0 0 0 0 0 0 0 0 00 0 0 20 0 0 0 0 0 0 0 00 0 0 0 10 0 0 0 0 0 0 00 99 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 −555)
Sugerencia: cree una matriz diagonal 7 por 11 cuya diagonal principal tenga los cinco
primeros múltiplos de 10 en orden descendente, y luego modifique las tres componentes
restantes.
Invéntese las matrices que quiera e introdúzcalas en Octave usando indexación.
19
Hasta ahora, hemos aprendido a introducir matrices indexando. El proceso se puede hacer en
sentido inverso para leer las matrices. Por ejemplo, si queremos leer un valor específico de la
matriz 𝐵, por decir algo, el elemento (2, 13), bastaría ingresar a Octave la siguiente línea, que
básicamente le pide que nos “recuerde” el valor de esa componente.
También podemos usar la indexación para tomar algún valor de la matriz y asignarlo a otra
variable distinta. Por ejemplo, podríamos querer almacenar la posición (6, 15) de la matriz B en
la variable “ultima_comp” (escogemos ese nombre porque es la última componente de la matriz,
aunque la pudo llamar como hubiera preferido, incluso “pepito”). Eso se haría con la línea:
ultima_comp=B(6,15) ↵
La respuesta sería:
Puede usar indexación para leer y asignar valores en una misma expresión. Por ejemplo, si
quiero tomar los únicos valores atípicos en la matriz B, que son los de las posiciones (4, 4),
(13, 2) y (6,15), para asignarlos en un vector llamado “Atip”, entonces podría hacerlo con la
siguiente secuencia de órdenes (que también se podrían poner en una sola línea, separadas por
punto y coma):
Atip(1)=B(4,4) ↵
Atip(2)=B(2,13) ↵
Atip(3)=B(6,15) ↵
Esto crea un vector fila llamado “Atip” con dichos valores atípicos en cada una de sus
componentes.
Según lo anterior, note que la indexación de vectores requiere sólo un índice por componente, a
diferencia de la indexación de matrices, que requiere dos índices, uno fila y otro, columna.
20
5.2. Indexación de filas y columnas de matrices
A veces es menester acceder a una matriz por filas o por columnas, leyendo o modificando todo
un renglón o una columna de datos a la vez. Por ejemplo, cuando se va a hacer un proceso de
reducción o eliminación. En ese caso, la forma como se le dice a Octave/Matlab, que se va a
usar toda una fila o una columna, es con el índice dos puntos “:”.
Para esta sección, supongamos que ingresamos a Matlab la matriz
𝐴 =
(
1 2 34 5 67 8 919 11 1213 14 15)
Si que queremos acceder a la fila 4 de la matriz 𝐴 , nos referiríamos a ella como A(4,:). Al
poner en el índice fila de A el número 4, indicamos que queremos seleccionar elementos de la
fila 4. Al poner el signo “:” en el índice columna de A, significa que tomaremos los elementos
de todas las columnas (que están en la fila 4 ya mencionada).
Si damos la orden A(4,:) ↵
La consola nos recordará cuánto vale la fila 4 de A :
Más ejercicio para asimilar el lenguaje
Almacene en un vector V (mayúscula) los elementos atípicos de la matriz M1, y en un
vector W (mayúscula) los de la matriz Datos, ambas definidas en el ejercicio previo.
Invéntese las matrices que quiera e introdúzcalas en Octave usando indexación.
21
Obviamente, lo que se lea de esa matriz usando indexación por filas, se puede almacenar en
cualquier variable vectorial. Por ejemplo, podemos almacenar la quinta fila de 𝐴 en un vector
V5 con el siguiente comando:
V5=A(5,:) ↵
En este caso, todos los elementos de la fila 5 de 𝐴 quedarán almacenados en el vector V5:
Con ese tipo de indexación también se puede modificar por filas los componentes de la matriz.
Si, por ejemplo, se quiere cambiar la tercera fila de 𝐴 por la fila [10, 20, 30], bastaría asignar a
dicha fila de 𝐴 ese vector, así:
A(3,:)=[10,20,30] ↵
El resultado será:
Nótese que la fila 3 de 𝐴 ya incluye el vector que queríamos: [10, 20, 30].
El símbolo “:” también sirve para hacer indexación por columnas. Simplemente, en lugar de
ponerse en la posición del índice de columnas, se pone en la posición del índice de filas.
Por ejemplo, si se quiere asignar al vector columna 𝑏 la tercera columna de la matriz 𝐴, se
podría usar el siguiente comando de asignación:
b=A(:,3) ↵
En este caso, al poner el 3 en el índice de columnas, estamos indicando que estamos interesados
en los contenidos de la tercera columna de 𝐴. Por otro lado, al poner el símbolo “:” en el índice
fila, estamos indicando que queremos los contenidos de todas las filas (que estén en la columna
3).
Más ejercicio para automatizar el lenguaje
Almacene en los vectores a, b, c, d, g, las filas 5, 3, 1, 4, 2 de 𝐴, respectivamente, usando
indexación por filas sobre nuestra matriz de ejemplo.
Usando indexación por filas, cambie las filas 2, 5 y 1 de 𝐴, por los vectores [10, -10, 10],
[5,7,-9] y [1,0,0], RESPECTIVAMENTE, en el orden pedido (primero cambie la fila dos,
luego la cinco y por último la 1).
22
La respuesta de la consola así lo confirma:
También se puede asignar cualquier vector a cualquier columna de 𝐴 usando indexación por
columnas. Si se quiere, por decir algo, llenar la columna 1 de 𝐴 con el vector columna
𝑐 =
(
54321)
,
previamente creado con la orden c=[5;4;3;2;1] ↵ bastaría con hacer el comando
A(:,1)=c ↵
23
Nótese que buena parte de las operaciones elementales sobre una matriz se pueden realizar
usando indexación por filas.
Por ejemplo, suponga que se tiene la matriz inicial de nuestro ejemplo
𝐴 =
(
1 2 34 5 67 8 919 11 1213 14 15)
Suponga que se quiere sumar a la fila 2 de 𝐴, (-4) veces su fila 1.
El comando sería facilísimo:
A(2,:)=A(2,:)+(-4)*A(1,:) ↵
o, si lo prefiere,
A(2,:)=A(2,:)-4*A(1,:) ↵
Lo que está diciendo esa orden es que a la la fila 2 de 𝐴 se le restará 4 veces la fila 1 de 𝐴, y el
resultado se almacenará en la fila 2 de 𝐴.
Al ejecutar el comando se llega a:
Más ejercicio para automatizar el lenguaje
Almacene en los vectores columna a, b, c, las columnas 3, 2 y 1 de 𝐴, respectivamente,
usando indexación por columnas sobre nuestra matriz de ejemplo.
Usando indexación por columnas, cambie las columnas 2, 3 y 1 de 𝐴, por los vectores
[ 12345]
,
[ 1020304050]
,
[ 7711374315]
,
RESPECTIVAMENTE, en el orden pedido (primero cambie la columna dos, luego la tres y
por último la 1).
24
Nótese que eso hace que, debajo del “1” de la primera fila, quede un “0” en la segunda fila. Eso
es un paso típico en la eliminación de matrices para llegar a la forma escalonada. Por ejemplo,
para lograr un “0” en la primera posición de la tercera fila (que empieza con un “7”) bastaría
restar a la fila tres, 7 veces la fila 1. Esto se lograría con una orden similar:
A(3,:)=A(3,:)-7*A(1,:) ↵
Las operaciones equivalentes por filas son similares. Si partimos de la matriz inicial 𝐴,
podríamos multiplicar por ejemplo, toda la columna 3 por (1/3). El resultado se lograría con la
orden:
A(:,3)=A(:,3)*(1/3) ↵
o, lo que es lo mismo,
A(:,3)=A(:,3)/3 ↵
Más alimento para el pensamiento:
¿Cómo haría para eliminar el “10” de la primera posición de la fila 4, y el “13” de la primera
posición de la fila 5, sumando o restando un múltiplo de la primera fila? Compruebe su
respuesta con Octave.
¿Por qué número multiplicaría la segunda fila de la matriz resultante para obtener un “1” en
lugar del “-3” que se encuentra en su segunda columna? (Comentario: a esos “1” en las
primeras posiciones no nulas de cada fila, se les llama “pivotes”.
¿Después de obtener el pivote “1” en la posición (2,2) de la matriz, cómo haría para eliminar
el “-6”, y las demás componentes no nulas debajo de aquel?
Nótese que lo logrado al final de continuar este proceso, es llevar la matriz a la forma
escalonada por filas.
25
El resultado sería:
Si, sobre esa matriz resultante, se le quisiera sumar 10 veces la columna 3 a la columna 2, la
orden sería similar, otra vez, intercambiando la posición del “:” con respecto a la que usábamos
por filas:
Más alimento para el pensamiento:
Invéntese una matriz de 7 por 11, y multiplique las filas y columnas que usted quiera por los
números que prefiera. Sume múltiplos de cualesquiera filas a cualquiera otras filas. Hágalo
también por columnas.
JUEGUE CON LA MATRIZ. PIÉRDALE EL MIEDO A OPERAR POR FILAS Y
COLUMNAS USANDO LA INDEXACIÓN Y EL SÍMBOLO DE “:” .
26
5.3. Indexación vectorial de filas y columnas de matrices
Si mira detenidamente, verá que hasta el momento se ha explicado cómo hacer 2 de las tres
operaciones elementales fila que se usan para resolver sistemas de ecuaciones representados
matricialmente. Se nos escapa aún una operación: intercambiar de posición dos filas o dos
columnas. Para eso explicaremos la indexación vectorial de matrices.
Suponga que de la matriz
𝐴 =
(
1 2 34 5 67 8 919 11 1213 14 15)
,
quiere almacenar en una matriz 𝐵 las filas 3 y 5 de la Matriz 𝐴. Para esto, bastaría poner en
lugar del índice fila no sólo un número de fila por leer, sino un vector con los números de fila
por leer, en este caso, el vector [3,5]. En la posición del índice columna, bastaría poner el
símbolo “:” para indicar que se tomarán los elementos de todas las columnas de esas filas.
Entonces, para leer esas filas y asignarlas a la matriz 𝐵, bastaría escribir:
B=A([3,5],:) ↵
Examine bien esa orden. Se tomarán de las filas 3 y 5, los elementos de todas las columnas. El
resultado es el esperado:
Nótese que el orden de las componentes en el vector es de índices filas es fundamental. Si se
intercala el orden, las filas en la matriz 𝐵 quedarán trocadas:
27
Ese tipo de indexación no sólo sirve para leer matrices, sino para modificarlas: suponga que
quiere llenar la cuarta fila de 𝐴 con el vector [9, 29, 39], y la primera fila con el vector [2, 4, 8].
La orden sería igual de sencilla:
A([4,1],:)=[9,29,39;2,4,8] ↵
Note que la fila 4 de 𝐴 quedó con la primera fila de la matriz que usamos para la asignación, y
la fila 1 quedó con la segunda fila. No olvide que esa no era una fila con seis componentes; era
una matriz con dos filas de tres componentes, lo que es evidenciado por el signo de punto y
coma entre el “39” y el “2”.
Como verá, este método de indexación vectorial por filas permite hacer la última operación
elemental que nos quedaba por hacer: el intercambio de filas.
Por ejemplo, si en la matriz resultante se quiere cambiar la fila 5 por la 3 y viceversa, basta
decir:
A([5,3],:)= A([3,5],:)↵
Básicamente lo que acabamos de decir es que la fila 5 de A se llenará con lo que se encuentre en
la fila 3, y la fila tres se llenará con los elementos de la fila 5. El resultado es el esperado:
Lo anterior puede generalizarse para operaciones columnas indexadas vectorialmente.
28
Hasta aquí basta para la primera parte de un curso de Álgebra Lineal, dedicado a la reducción
solución de sistemas de ecuaciones lineales representados por matrices, usando operaciones
elementales fila, para efectuar eliminación gaussiana o reducción de Gauss-Jordan.
(Espacio en blanco intencional)
Más alimento para el pensamiento
Con la matriz que se inventó en el alimento previo, ilustre los mismos conceptos de
indexación vectorial por filas y por columnas. Juegue libremente con su matriz, leyéndola y
modificándola por filas y por columnas, con indexación vectorial.
Use la matriz inventada en el ejemplo previo para escalonarla y reducirla por filas, usando el
método de Gauss-Jordan que puede consultar en Wikipedia EN INGLÉS.
Más alimento para el pensamiento
Resuelva sistemas de ecuaciones lineales representados matricialmente llevándolos a la
forma escalonada reducida de Gauss Jordan. Puede sacar los problemas de su libro preferido
de Álgebra Lineal.
29
6. Operaciones por fila en matrices. Desde el Álgebra Lineal, se sabe que hay tres tipos de operaciones “elementales” por fila que se
pueden efectuar sobre una matriz. La sintaxis de Octave/Matlab para esos tipos de operación se
explicó en la sección anterior y aquí se recapitula.
6.1. Multiplicación de una fila por un escalar. Si se quiere multiplicar la fila 𝑖 de la matriz 𝐴 por el escalar 𝑟, el comando correspondiente es:
A(i,:)=r*A(i,:) ↵
6.2. Suma de un múltiplo de una fila a otra fila. Si en la matriz 𝐴 se quiere sumar a la fila 𝑘 un número 𝑟 de veces la fila 𝑗 , el comando a
introducir es:
A(k,:)= A(k,:)+r*A(j,:) ↵
6.3. Intercambio de filas. Si se quiere intercambiar la fila 𝑗 y la fila 𝑘 de la matriz 𝐴 se usa indexación vectorial así:
A([j,k],:)= A([k,j],:) ↵
Lo anterior se ilustra por completo en la consola de Octave, en el ejercicio de hacer una
reducción por fila de una matriz de tamaño mediano, en la siguiente sección.
(Espacio en blanco intencional)
30
7. Reducción manual de matrices con fines didácticos.
En el siguiente ejemplo se hace el proceso de reducción de Gauss-Jordan sobre una matriz
usando las operaciones elementales filas recapituladas en la sección anterior. El lector debe
tratar de entender el cómo y el por qué del comando ingresado a la consola en cada paso.
Recuerde que en el método estándard moderno de Gauss-Jordan se suelen intercambiar filas de
forma que los pivotes se saquen de los coeficientes que inicialmente tengan mayor módulo.
Ejemplo:
Reducir la matriz siguiente, almacenándola en una matriz auxiliar B para hacer el proceso de
Gauss-Jordan.
Este primer par de órdenes determinan la matriz a reducir, y establecen que el formato de la
respuesta, en lugar de ser decimal, sea en fraccionarios.
Ahora, se procede a reducir. La primera fase de la reducción consiste en intercambiar filas para
que el primer elemento no nulo de la primera fila, sea el mayor posible. Luego se divide entre
este elemento toda la fila para lograr un pivote (“1”) en la primera posición de la primera fila.
Después se usa este elemento para eliminar todos los otros elementos en la misma columna.
31
La fase siguiente consiste en cambiar filas para que el pivote de la fila 2 sea el correspondiente
al mayor número posible. Luego se divide toda la segunda fila por ese valor, y se eliminan todos
los demás elementos de ella.
Después de que está reducida la segunda columna se procede igual con la tercera.
32
En la siguiente fase no hay que intercambiar filas, porque el primer elemento no nulo de la
tercera fila es el más grande de la tercera columna. Se obtiene un pivote “1” en la posición (3,3)
y se usa para eliminar a los demás elementos de la misma columna:
La fase final, con la cuarta columna se hace de forma análoga a las tres anteriores.
33
Con Esto se termina el proceso de reducción y escalonamiento de Gauss-Jordan.
Más alimento para el pensamiento:
Utilice el método de Gauss-Jordan de escalonamiento y reducción de matrices para resolver
algunos ejercicios de su libro favorito de álgebra lineal.
34
8. Reducción automática de matrices con el comando rref
Octave/Matlab tiene un comando automático para llevar una matriz a la forma escalonada
reducida: es el comando “rref”.
Su sintaxis es elemental.
Si se quiere obtener la forma escalonada reducida de una matriz 𝑀, basta escribir en la consola
rref(M) ↵
Si se quiere almacenar la forma escalonada reducida de esa matriz en otra, por ejemplo 𝐸, la
sintaxis es:
E=rref(M) ↵
Por ejemplo, para hacer todo el proceso de Gauss-Jordan que se hizo manualmente en la sección
anterior, el comando equivalente sería:
R=rref(A) ↵
Si compara la matriz 𝐵 reducida manualmente, con la reducida automáticamente con
R=rref(A), notará que son exactamente iguales.
Es obvio que este comando sólo se debe usar en los últimos capítulos del curso. En los
primeros, cuando se están aprendiendo los algoritmos de eliminación y reducción, se deben
hacer manualmente, como en la sección previa.
35
9. Creación de matrices por bloques
En muchas aplicaciones, la estructura de una matriz tiene formas reconocibles. Por ejemplo:
𝑀 =
[ 2 0 0 0 0 0 00 4 0 0 0 0 00 0 6 0 0 0 00 0 0 8 0 0 01 1 1 1 10 10 101 1 1 1 10 10 10]
Nótese que 𝑀 se puede ver de la siguiente forma:
𝑀 = [𝐴 𝐵𝐶 𝐷
],
de forma tal que 𝐴 es una matriz diagonal con elementos (2,4,6,8):
𝐴 = [
2 0 0 00 4 0 00 0 6 00 0 0 8
] ;
𝐵 es una matriz de ceros de dimensión 4 por 3:
𝐵 = [
0 0 00 0 00 0 00 0 0
] ;
𝐶 es una matriz de unos de dimensión 2 por 4:
𝐶 = [1 1 1 11 1 1 1
],
y por último, 𝐷 es una matriz de dieces, de dimensión 2 por 3:
𝐷 = [10 10 1010 10 10
].
36
Cada una de esas matrices se puede crear fácilmente con las órdenes vistas previamente:
A=diag([2,4,6,8]) ↵
B=zeros(4,3) ↵
C=ones(2,4) ↵
D=10*ones(2,3) ↵
El resultado se muestra a continuación:
37
Como en este caso las dimensiones coinciden para que se pueda armar la matriz por bloques, se
puede definir a 𝑀 exactamente igual que si fuera por componentes, sólo que en este caso las
componentes son matriciales: dos filas de matrices separadas por punto y coma, con los
elementos de cada fila separados por coma:
Mientras las matrices sean conformables por bloques, se puede hacer este proceso de definición
sin ningún problema.
(Espacio en blanco intencional)
Más alimento para el pensamiento:
Defina por bloques la siguiente matriz:
𝑅 =
[
3 3 3 0 0 0 0 1 0 03 3 3 0 0 0 0 0 1 03 3 3 0 0 0 0 0 0 150 0 0 1 1 1 1 2 0 00 70 0 1 1 1 1 0 2 06 0 0 8 8 8 8 0 0 00 6 0 8 8 8 8 0 0 00 0 6 8 8 8 8 0 0 0
100 200 300 −1 −2 −3 −4 1 1 1]
Pista: 𝑅 se puede ver como una matriz de bloques de 4 por 3, cada bloque con sus
respectivas dimensiones específicas.
38
10. Álgebra básica de matrices
La mayor parte de las operaciones entre matrices tienen una simbología natural en Matlab.
Por ejemplo, para almacenar en la matriz 𝐶 la suma de dos matrices 𝐴 y 𝐵, la sintaxis es la
obvia:
C=A+B ↵
La resta es similar:
C=A-B ↵
La multiplicación de una matriz 𝐴 por un escalar 𝑘 usa el símbolo casi universal en informática
para la multiplicación; el asterisco (*) :
C=k*B ↵
Para la multiplicación de matrices conformables, se usa también el asterisco (*) ; el tipo de
operandos aclara a cuál de las dos se refiere:
C=A*B ↵
Las potencias de una matriz cuadrada se realizan con el símbolo casi universal informático para
la exponenciación; el acento circunflejo o “gorro” (^):
C=A^n ↵
La inversa matricial se simboliza de forma consecuente con la anterior ( 𝐴−1 ) :
C=A^-1 ↵
La transpuesta de una matriz se representa con un operador doble: el punto (.) seguido de un
apóstrofe o comilla simple (’):
C=A.’ ↵
Si se quiere calcular la transpuesta conjugada o “adjunta” de una matriz, el operador es el
apóstrofe (’):
C=A’
Cuando todas las componentes de la matriz son reales, la “adjunta” y la transpuesta son la
misma, por tanto, es común el malentendido de creer que la transpuesta se representa con
apóstrofe... el lector no se imagina los dolores de cabeza que eso da cuando se comienza a
trabajar con matrices complejas.
Octave y Matlab tienen literamente cientos de órdenes para trabajar con matrices, las cuales se
salen del alcance de esta breve introducción didáctica. Para una introducción propiamente dicha
al lenguaje de Octave, se recomienda este sitio web:
https://octaveintro.readthedocs.io/en/latest/index.html
39
(Espacio en blanco intencional)
Último alimento para el pensamiento:
Ilustre todas las operaciones mencionadas en esta sección con las matrices que el lector
prefiera.
Estudie más sobre este apasionante y práctico lenguaje de Programación.