Listas y tablas vs matrices y vectores Autor José Luis Gómez Muñoz http://homepage.cem.itesm.mx/jose.luis.gomez Listas Aquí creamos una lista y la guardamos en la variable "miLista". Nótese que en el nombre de la variable estamos usando mayúsculas, pero que no le pusimos mayúscula a la primera letra. Esto es una buena idea para distinguir los nombres que el usuario define de los nombres que ya tiene Mathematica definidos, ya que estos últimos siempre comienzan con mayúsculas: In[1]:= Out[1]= miLista = Table@2 ^ i, 8i, 10<D 82, 4, 8, 16, 32, 64, 128, 256, 512, 1024< Aquí obtenemos el quinto elemento de la lista: In[2]:= Out[2]= miLista@@5DD 32 Otra vez obtenemos el quinto elemento de la lista: In[3]:= Out[3]= Part@miLista, 5D 32 Aquí obtenemos el quinto y el octavo elementos de la lista In[4]:= Out[4]= miLista@@85, 8<DD 832, 256< Aquí obtenemos el quinto, sexto, séptimo y octavo elementos de la lista In[5]:= Out[5]= miLista@@5 ;; 8DD 832, 64, 128, 256< Otra vez obtenemos el quinto, sexto, séptimo y octavo elementos de la lista In[6]:= Out[6]= Take@miLista, 85, 8<D 832, 64, 128, 256< Aquí obtenemos los tres primeros elementos de la lista: 2 FEM00250matrices.nb In[7]:= Out[7]= Take@miLista, 3D 82, 4, 8< Ahora creamos una lista cuyos elementos son listas: In[8]:= Out[8]= listaDeListas = 88a, b, c<, 8d, e<, 8f, g, h<, 8i, j<< 88a, b, c<, 8d, e<, 8f, g, h<, 8i, j<< Aquí obtenemos el tercer elemento: In[9]:= Out[9]= listaDeListas@@3DD 8f, g, h< Aquí obtenemos el primer elemento del tercer elemento de la lista: In[10]:= Out[10]= listaDeListas@@3, 1DD f Aquí obtenemos los segundos elementos de todos los elementos de la lista In[11]:= Out[11]= listaDeListas@@All, 2DD 8b, e, g, j< Aquí desplegamos la lista en forma tabular: In[12]:= TableForm@listaDeListasD Out[12]//TableForm= a d f i b e g j c h Aquí desplegamos la lista en forma de Grid: In[13]:= Out[13]= Grid@listaDeListas, Dividers → AllD a d f i b c e g h j Aquí formamos una grid con los primeros dos renglones y las primeras dos columnas FEM00250matrices.nb In[14]:= Out[14]= 3 Grid@Take@listaDeListas, 2, 2D, Dividers → AllD a b d e Aquí formamos una tabla con todos los renglones y las primeras dos columnas In[15]:= Out[15]= Grid@Take@listaDeListas, All, 2D, Dividers → AllD a d f i b e g j Aquí creamos una nueva lista, que consiste en añadir a listaDeListas el renglón {x,y,z} In[16]:= Out[16]= nuevaLista = Append@listaDeListas, 8x, y, z<D 88a, b, c<, 8d, e<, 8f, g, h<, 8i, j<, 8x, y, z<< Aquí desplegamos la nuevaLista en forma de Grid In[17]:= Out[17]= Grid@nuevaLista , Dividers → AllD a d f i x b c e g h j y z Si usamos nuevaLista como argumento de la función Cos[ ], entonces se genera una nueva lista con los cosenos de cada elemento: In[18]:= Out[18]= In[19]:= Out[19]= cosLista = Cos@nuevaListaD 88Cos@aD, Cos@bD, Cos@cD<, 8Cos@dD, Cos@eD<, 8Cos@fD, Cos@gD, Cos@hD<, 8Cos@iD, Cos@jD<, 8Cos@xD, Cos@yD, Cos@zD<< Grid@cosLista, Dividers → AllD Cos@aD Cos@dD Cos@fD Cos@iD Cos@xD Cos@bD Cos@cD Cos@eD Cos@gD Cos@hD Cos@jD Cos@yD Cos@zD Operaciones con listas y tablas 4 FEM00250matrices.nb Operaciones con listas y tablas Aquí creamos una lista de listas a la que llamamos tabla1. Nótese el uso de paréntesis para forzar que primero se lleve a cabo la asignación y despues el formateo (Grid). Si no los hubieramos usado, entonces tabla1 sería igual al formato (Grid), en lugar de ser igual a la lista de listas. In[20]:= Out[20]= Grid@tabla1 = 88a, b, c<, 8d, e, f<, 8f, g, h<< , Dividers → AllD a b c d e f f g h Aquí creamos otra lista de listas a la que llamamos tabla2. In[21]:= Out[21]= Grid@tabla2 = 88x, y, z<, 8u, v, w<, 8r, s, t<< , Dividers → AllD x y z u v w r s t Aquí multiplicamos la tabla1 por la tabla2. Nótese que NO es la multiplicación de dos matrices. Por el contrario, simplemente se multiplican elemento por elemento. In[22]:= Out[22]= Grid@tabla1 ∗ tabla2 , Dividers → AllD ax by cz du ev fw fr gs ht Aquí sumamos un número a la tabla, lo cual se traduce en sumar el número a cada elemento de la tabla. In[23]:= Out[23]= Grid@tabla1 + 7 , Dividers → AllD 7+a 7+b 7+c 7+d 7+e 7+f 7+f 7+g 7+h Aquí elevamos a la cuarta potencia cada elemento de la tabla In[24]:= Out[24]= Grid@tabla1 ^ 4, Dividers → AllD a4 b4 c4 d4 e4 f4 f4 g4 h4 Listas como matrices Vamos a utilizar las tablas que definimos en la sección anterior como matrices. Para mostrar una tabla FEM00250matrices.nb 5 Vamos a utilizar las tablas que definimos en la sección anterior como matrices. Para mostrar una tabla como una matriz utilizamos la "envoltura" (wrapper) MatrixForm. Esto NO cambia el contenido de tabla1, sólo lo muestra como matriz. In[25]:= MatrixForm@tabla1 D Out[25]//MatrixForm= a b c d e f f g h Tabla1 sigue siendo una lista de listas. El desplegarla como matriz NO la cambió. In[26]:= Out[26]= tabla1 88a, b, c<, 8d, e, f<, 8f, g, h<< Para multiplicar dos matrices, debemos escribir entre ellas un punto en lugar de un asterisco: In[27]:= Out[27]= tabla1.tabla2 88c r + b u + a x, c s + b v + a y, c t + b w + a z<, 8f r + e u + d x, f s + e v + d y, f t + e w + d z<, 8h r + g u + f x, h s + g v + f y, h t + g w + f z<< Aquí está otra vez el producto de matrices, usando un punto en lugar de un asterisco, y desplegando el resultado en forma de matriz: In[28]:= [email protected] D Out[28]//MatrixForm= c r+b u+a x c s+b v+a y c t+b w+a z f r+e u+d x f s+e v+d y f t+e w+d z h r+g u+f x h s+g v+f y h t+g w+f z Aquí definimos un vector. In[29]:= Out[29]= vector = 8m, n, p< 8m, n, p< Aquí multiplicamos la matriz tabla1por el vector. Nótese que usamos punto en lugar de asterisco: In[30]:= [email protected] Out[30]//MatrixForm= a m+b n+c p d m+e n+f p f m+g n+h p Nótese que si usamos el asterísco, entonces NO es la multiplicación de matriz por vector, sino una multiplicación de elementos de tablas: 6 FEM00250matrices.nb In[31]:= MatrixForm@tabla1 ∗ vectorD Out[31]//MatrixForm= am bm cm dn en fn fp gp hp Aquí hay una tercera matriz, ahora con números: In[32]:= Out[32]= tabla3 = 881, 2, 3<, 84, 5, 6<, 87, 8, 9<< 881, 2, 3<, 84, 5, 6<, 87, 8, 9<< Para elevar una MATRIZ a la potencia 4 usamos MatrixPower. Este es el resultado de hacer tabla3.tabla3.tabla3.tabla3 con puntos. In[33]:= MatrixForm@MatrixPower@tabla3, 4D D Out[33]//MatrixForm= 7560 9288 11 016 17 118 21 033 24 948 26 676 32 778 38 880 Elevar una TABLA a la cuarta potencia es como hace tabla3*tabla3*tabla3*tabla3. Esta NO es una operación de matrices, por el contrario, es una operación elemento por elemento: In[34]:= MatrixForm@tabla3 ^ 4D Out[34]//MatrixForm= 1 16 81 256 625 1296 2401 4096 6561 Uso de la opción "Table/Matrix" del menú Insert Utiliza el menu Insert, opción Table/Matrix, New, para crear la siguiente matriz en 10 segundos: FEM00250matrices.nb In[35]:= Out[35]= miMatriz = 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 7 0 0 0 0 0 0 0 0 0 1 881, 0, 0, 0, 0, 0, 0, 0, 0, 0<, 80, 1, 0, 0, 0, 0, 0, 0, 0, 0<, 80, 0, 1, 0, 0, 0, 0, 0, 0, 0<, 80, 0, 0, 1, 0, 0, 0, 0, 0, 0<, 80, 0, 0, 0, 1, 0, 0, 0, 0, 0<, 80, 0, 0, 0, 0, 1, 0, 0, 0, 0<, 80, 0, 0, 0, 0, 0, 1, 0, 0, 0<, 80, 0, 0, 0, 0, 0, 0, 1, 0, 0<, 80, 0, 0, 0, 0, 0, 0, 0, 1, 0<, 80, 0, 0, 0, 0, 0, 0, 0, 0, 1<< Un tipo de suma que no está definido Aquí tenemos una lista de vectores 2D In[36]:= Out[36]= listaDeVectores = 880, 0<, 81, 3<, 82, 3<, 82, 1<< 880, 0<, 81, 3<, 82, 3<, 82, 1<< Aquí tenemos un vector: In[37]:= Out[37]= miVector = 810, 20< 810, 20< Ahora quisieramos sumar miVector a cada vector de la listaDeVectores. Pero Mathematica nos responde con un mensaje de error y no realiza la operación que queremos In[38]:= listaDeVectores + miVector Thread::tdlen : Objects of unequal length in 880, 0<, 81, 3<, 82, 3<, 82, 1<< + 810, 20< cannot be combined. à Out[38]= 810, 20< + 880, 0<, 81, 3<, 82, 3<, 82, 1<< Abajo se muestra una forma de realizar la operación deseada. El comando MAP aplica a cada elemento de listaDeVectores la función. In[40]:= Out[40]= Map@Function@m, m + miVectorD, listaDeVectoresD 8810, 20<, 811, 23<, 812, 23<, 812, 21<< Abajo se muestra una forma de realizar la operación deseada. El comando MAP aplica a cada elemento de listaDeVectores el comando #+miVector&. En este último comando, el & indica que el comando es una función y el # corresponde al elemento que se está usando como argumento de esa 8 FEM00250matrices.nb función In[41]:= Out[41]= Map@ + miVector &, listaDeVectoresD 8810, 20<, 811, 23<, 812, 23<, 812, 21<< Ejemplo de uso de matrices Aquí tenemos una colección de puntos en 2D In[42]:= Out[42]= misPuntos = 880, 0<, 81, 2.5<, 81, 1<, 82, 1<< 880, 0<, 81, 2.5<, 81, 1<, 82, 1<< Aquí graficamos el polígono que se forma al unir los puntos: In[43]:= Graphics@Polygon@misPuntosD, Axes → True, AspectRatio → AutomaticD 2.5 2.0 1.5 Out[43]= 1.0 0.5 0.5 1.0 1.5 2.0 Ahora definimos una matriz de rotación. Los elementos de esta matriz son función del parámetro q In[44]:= matrizRotacion@θ_D := K Cos@θD − Sin@θD O Sin@θD Cos@θD Este es un ejemplo del uso de la matriz. Al multiplicar el vector {1,2.5}, obtenemos otro vector que es FEM00250matrices.nb 9 Este es un ejemplo del uso de la matriz. Al multiplicar el vector {1,2.5}, obtenemos otro vector que es de hecho el resultado de rotar el vector alrededor del origen un ángulo q. In[45]:= Out[45]= matrizRotacion@45 °D.81, 2.5< 8− 1.06066, 2.47487< Utilizando el comando MAP como en la sección anterior, podemos aplicar la matriz de rotación a cada uno de los vectores en la lista misPuntos. La lista resultante se guarda en la variable nuevosPuntos: In[46]:= Out[46]= nuevosPuntos = Map@ matrizRotacion@45 °D. &, misPuntosD :80, 0<, 8− 1.06066, 2.47487<, 90, 2 =, :− 1 2 + 1 2 , 2 + 2 >> Al dibujar el polígono de los nuevosPuntos se obtiene el mismo polígono que con misPuntos pero rotado 45° alrededor del origen: In[47]:= Graphics@Polygon@nuevosPuntosD, Axes → True, AspectRatio → AutomaticD 2.5 2.0 1.5 Out[47]= 1.0 0.5 -1.0 -0.5 0.5 10 FEM00250matrices.nb Animación usando matrices In[48]:= misPuntos = 880, 0<, 81, 2.5<, 81, 1<, 82, 1<<; Cos@θD − Sin@θD matrizRotacion@θ_D := K O; Sin@θD Cos@θD Manipulate@ nuevosPuntos = Map@ matrizRotacion@anguloD. &, misPuntosD ; Graphics@Polygon@nuevosPuntosD, Axes → True, AspectRatio → Automatic, PlotRange → 88− 3, 3<, 8− 3, 3<<D, 8angulo, 0 °, 360 °< D angulo 3 2 1 Out[50]= -3 -2 -1 1 2 3 -1 -2 -3 Ejercicios y Preguntas 1.- De un sólo comando multiplica cada elemento de la lista {2,3,4} por cada elemento de la lista {1,0,3} (la respuesta que debes obtener es la lista {2,0,12}) 2.- De un sólo comando calcula el producto punto del vector {2,3,4} por el vector {1,0,3} (la respuesta que debes obtener es el número 14) 3.- Explica completa y claramente como es x[4] diferente de x[[4]]. FEM00250matrices.nb m[3,5]? 5.- ¿Que signfica m[[3,5]]? 6.- ¿Que signfica m[[3]][[5]]? 7.- ¿Que signfica Part[m,3,5]? 8.- ¿Que signfica Part[ Part[m,3], 5]? 4.- ¿Que signfica Autor José Luis Gómez Muñoz http://homepage.cem.itesm.mx/jose.luis.gomez In[51]:= Out[51]= In[52]:= Out[52]= $Version 9.0 for Microsoft Windows H64−bitL HNovember 20, 2012L DateString@D Fri 17 May 2013 18:54:29 11