Download Document
Document related concepts
Transcript
Arreglos Arreglos Bidimensionales. ● Análogo a una matriz. Una lista de listas o mejor aún un vector de vectores. ● Ya no es suficiente especificar un elemento de una matriz sino que es necesario 2 índices. El primer elemento es el renglón y el segundo elemento es la columna. A=[[1,2],[3,4],[5,6]] para indicar el elemento A[0][0], A[1][0] ● Generar un arreglo de 3x2, donde cada elemento es 4 A=[[0,0],[0,0],[0,0]] for i in range(3): for j in range(2): A[i][j]=4 ● Hacer un arreglo de 3x4 con puros ceros, empezando con una lista vacía. A=[ ] for i in range(3): A.append([0]*4) ● Llenar la matriz A con valores dados por el usuario. for i in range(m): for j in range(n): A[i][j]=float(raw_input('da la componente (%d,%d)'% (i,j))) Cuadrados mágicos ● Consiste en una distribución de números en filas y columnas, formando un cuadrado. Tal que los números de una fila y/o columna suman lo mismo. 6 1 8 7 5 3 2 9 4 ● Cuadros mágicos tienen su origen en China. Según cuenta una leyenda, el primer cuadrado mágico fue revelado al emperador Yu (siglo XII A.C) por una tortuga divina que apareció en el río Lu, la cual lo llevaba en su caparazón. ● El primer cuadrado mágico documentado en Europa aparece en el grabado Melancolía de Alberto Durero Propiedades de los cuadrados mágicos ● Sumar un escalar (c) y obtener otro cuadrado mágico (N'=N+o·c), donde o es el orden del cuadrado mágico. Lo mismo para la resta de un escalar (N'=N-o·c), multiplicación (N'=(o·c)N) y división (N'=N/(c·o)) 7 2 3 0 4 8 5 6 1 +2 = 9 4 5 2 6 10 7 8 3 ● Suma y Resta de cuadrados mágicos regresa otro cuadrado mágico. N1+N2=N3 (12+36=48) 7 2 3 0 4 8 5 6 1 + 15 0 21 18 12 6 3 24 9 = 22 2 24 18 16 14 8 30 10 Se pueden intercambiar entre sí 2 filas junto con 2 columnas simétricas en bloque. Ejemplo: Intercambio de la primera fila con la cuarta, junto con la primera y cuarta columna. 8 4 3 15 6 10 13 1 1 10 13 6 5 9 2 14 5 9 2 14 14 9 2 5 11 7 12 0 11 7 12 0 0 7 12 11 6 10 13 1 8 4 3 15 15 4 3 8 Para los cuadrados mágicos de 4x4, casillas en vértices de rectángulos concéntricos paralelos al cuadrado suman N. 8 4 3 15 8 - - 15 - - - - - - - - - 4 3 - 5 9 2 14 - - - - - 9 2 - 5 - - 14 - - - - 11 7 12 0 - - - - - 7 12 - 11 - - 0 - - - - 6 10 13 1 6 1 - - - - - - - - - 10 13 - ● Determinar el valor de la casilla central sólo conociendo el valor N. a b c K d e f a+b+c=N; a+K+f=N; b+k+e=N; c+K+d=N: d+e+f=N Sumando las ecuaciones que tienen K (a+b+c) + 3K+(d+e+f) = 3N N+3K+N=3N K=N/3 Una posible forma para construir cuadrados mágicos de orden 3 a+b a-(b+c) a+c a-(b-c) a a+b(b-c) a-c a+(b+c) a-b Con a, b, y c números enteros cualesquiera. Dando N y 2 casillas se puede determinar cualquier cuadrado mágico. No existen métodos generales para construir cuadrados mágicos, sobre todo para los de orden par. Hacer el código en Python para el cuadrado mágico con n=15 6 1 8 7 5 3 2 9 4 Código en Python n=float(raw_input('Cual es el valor de n')) casilla11=float(raw_input('da la casilla 1,1')) casilla23=float(raw_input('da la casilla 2,3')) a=n/3.0 b=casilla11-a c=a+b-casilla23 cuadro_magico=[[a+b,a-(b+c),a+c],[a-(b-c),a,a+(b-c)],[a-c,a+ (b+c),a-b]] print cuadro_magico Probar con el cuadrado mágico n=5.1 2.6 1.1 1.4 0.5 1.7 2.9 2 2.3 0.8 Matrices ● Dos matrices de m x n, se definen iguales si y sólo si sus elementos correspondientes son iguales Aij=Bij ● Al conjunto de todas las matrices de m x n, se puede definir las siguientes operaciones ○ La suma de dos matrices da como resultado una tercera matriz. (A+B)ij=Aij+Bij ○ Un escalar por una matriz regresa otra matriz. (cAij)=cAij ● Para saber el número de renglones de un arreglo, se puede usar len(A) ● Para conocer el número de columnas de un arreglo, le pregunto a Python cuantos elementos tiene el primer elemento de la lista len(A[0]) ● Para hacer la suma de 2 matrices dadas, se puede utilizar el pedazo de código for i in range(len(A)): for j in range(len(A[0])): suma[i][j]=A[i][j]-B[i][j] ● Multiplicar un escalar a un matrices: for i in range(len(A)): for j in range(len(A[0])): C[i][j]=5.*A[i][j] ● Multiplicación entre matrices. Sólo se pueden multiplicar matrices si el número de columnas de la primera es igual al número de renglones de la segunda. Cij=AikBkj a11 a12 a13 a21 a22 a23 b11 b12 b21 b22 b31 b32 = a11b11+a12b21+a13b31 a11b12+a12b22+a13b32 a21b11+a22b21+a23b32 a21b12+a22b22+a23b32 for i in range(m): for j in range(p): s=0.0 for k in range(n): s+=A[i][k]*B[k][j] C[i][j]=s m= renglones primera matriz n=columnas de la primera. matriz y renglones de la segunda. p=número de columnas de segunda matriz Módulo Numpy ● Librería de Python que facilita la creación de arreglos multidimensionales. ● Acrónimo de Python numérico ● Existe la función array, que recibe una lista de listas y la regresa como arreglo. a=array([[1,2,3],[4,5,6],[7,8,9]],float) ● Puedo generar un arreglo consecutivo de números con la función arange b=arange(0.1,1,0.1) print b [0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9] ● Los argumentos de la función arange(origen, final, tamaño del paso). El default del tamaño del paso es 1 y del origen es cero. ● Se puede definir arreglos de puros ceros y unos. b=zeros(10).reshape(2.5) print b array([[0., 0. , 0., 0., 0.] [0., 0., 0., 0., 0.]) b=ones(10) print b array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) ● También puedo decir la forma del arreglo sin usar reshape c=ones([5,7]) Diversas funciones de Numpy ● b.ndim Regresa las dimensiones del arreglo ● b.size Indica el número de elementos que contiene el arreglo ● b.shape Regresa un tuple con el número de renglones y columnas. ● b.transpose() Da la transpuesta del arreglo b. ● b.ravel() Reordena el arreglo en una sola fila. ● linspace(start,stop,num=50,endpoint=True, retstep=False) Regresa una muestra de números igualmente espaciados en un intervalo específico. Num indica el número de muestras a generarse, el default=50. El endpoint es booleano (opcional), si False no se incluye el número final y el paso serán más uniformes.Si retsteo=True me imprime el tamaño de paso usado. Algebra lineal con Numpy Importar la librería linalg, que está en numpy ● dot(a,b) Regresa el producto de dos matrices, siempre y cuando se cumpla la condición para que exista la multiplicación. Si a y b son vectores, regresa el producto punto. ● inv(A) Regresa la matriz inversa de A. Si A no es una matriz cuadrada o es singular regresa un error. ● trace(A) Regresa la traza de una matriz (La suma de los elementos en la diagonal principal). c=array([[1,2],[3,4]]) linalg.inv(c) array([[-2. , 1. ], [ 1.5, -0.5]]) ● Calcular los eigen-cosas de algo. Regresa los eigen-valores y luego los eigen-vectores. linalg.eig(c) (array([-0.37228132, 5.37228132]), array([[-0.82456484, -0.41597356], [ 0.56576746, -0.90937671]])) Solución de un sistema de Ecuaciones Lineales. La ecuación matricial AX=B es una manera abreviada de expresar un sistema de ecuaciones lineales. Ejemplo, sea el sistema de 3 ecuaciones lineales con 3 incógnitas 36w+51y+13z=3 52w+34y+74z=45 7y+1.1z=33 En forma matricial se representa. 36 51 13 w 52 34 74 y 45 0 7 1.1 z 33 = 3 En el módulo numpy.linalg, la función solve resuelve este sistema de ecuaciones y entrega la solución de los valores w, y, z a partir de la matriz A y B. a=array([[36,51,13],[52,34,74],[0,7,1.1]],float) b=array([3.,45.,33.]) x=solve(a,b) print x array([-7.10829222, 4.13213834, 3.70457422]) Para comprobar, multiplicamos la matriz A por el vector x encontrado. Con esta multiplicación obtendremos el vector B. dot(a,x) array([ 3., 45., 33.]) print b array([ 3., 45., 33.])