Вы находитесь на странице: 1из 15

DIRECCIONAMIENTO DE VECTORES Y MATRICES A PARTIR DE VECTORES Los elementos de un vector x se pueden direccionar a partir de los de otro vector v.

En este caso, x(v) equivale al vector x(v(1)), x(v(2)), ... Considrese el siguiente ejemplo: >> v=[1 3 4] v= 134 >> x=rand(1,6) x= 0.5899 0.4987 0.7351 0.9231 0.1449 0.9719 >> x(v) ans = 0.5899 0.7351 0.9231 De forma anloga, los elementos de una matriz A pueden direccionarse a partir de los elementos de dos vectores f y c. Vase por ejemplo: >> f=[2 4]; c=[1 2]; >> A=magic(4) A= 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 >> A(f,c) ans = 5 11 4 14 El siguiente ejemplo continuacin del anterior permite comprobar cmo los elementos de una matriz se pueden direccionar con un slo ndice, considerando que las columnas de la matriz estn una a continuacin de otra formando un vector: >> f=[1 3 5 7];

>> A(f), A(5), A(6) ans = 16 9 2 7 ans = 2 ans = 11 Ms adelante se ver que esta forma de extraer elementos de un vector y/o de una matriz tiene abundantes aplicaciones, por ejemplo la de modificar selectivamente esos elementos. 3.5.4. OPERADOR DOS PUNTOS (:) Este operador es muy importante en MATLAB y puede usarse de varias formas. Se sugiere al lector que practique mucho sobre los ejemplos contenidos en este apartado, introduciendo todas las modificaciones que se le ocurran y haciendo pruebas abundantes (Probar es la mejor forma de aprender!). Para empezar, defnase un vector x con el siguiente comando: >> x=1:10 x= 1 2 3 4 5 6 7 8 9 10 Captulo 3: Operaciones con matrices y vectores pgina 33 En cierta forma se podra decir que el operador (:) representa un rango: en este caso, los nmeros enteros entre el 1 y el 10. Por defecto el incremento es 1, pero este operador puede tambin utilizarse con otros valores enteros y reales, positivos o negativos. En este caso el incremento va entre el valor inferior y el superior, en las formas que se muestran a continuacin: >> x=1:2:10 x= 13579 >> x=1:1.5:10 x= 1.0000 2.5000 4.0000 5.5000 7.0000 8.5000 10.0000 >> x=10:-1:1

x= 10 9 8 7 6 5 4 3 2 1 Puede verse que, por defecto, este operador produce vectores fila. Si se desea obtener un vector columna basta trasponer el resultado. El siguiente ejemplo genera una tabla de funciones seno y coseno. Ejectese y obsrvese el resultado (recurdese que con (;) despus de un comando el resultado no aparece en pantalla). >> x=[0.0:pi/50:2*pi]'; >> y=sin(x); z=cos(x); >> [x y z] El operador dos puntos (:) es an ms til y potente y tambin ms complicado con matrices. A continuacin se va a definir una matriz A de tamao 66 y despus se realizarn diversas operaciones sobre ella con el operador (:). >> A=magic(6) A= 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 Recurdese que MATLAB accede a los elementos de una matriz por medio de los ndices de fila y de columna encerrados entre parntesis y separados por una coma. Por ejemplo: >> A(2,3) ans = 7 El siguiente comando extrae los 4 primeros elementos de la 6 fila: >> A(6, 1:4) ans = 4 36 29 13 Los dos puntos aislados representan "todos los elementos". Por ejemplo, el siguiente comando

extrae todos los elementos de la 3 fila: >> A(3, :) ans = 31 9 2 22 27 20 Para acceder a la ltima fila o columna puede utilizarse la palabra end, en lugar del nmero correspondiente. Por ejemplo, para extraer la sexta fila (la ltima) de la matriz: >> A(end, :) ans = 4 36 29 13 18 11 Aprenda Matlab 6.5 como si estuviera en Primero pgina 34 El siguiente comando extrae todos los elementos de las filas 3, 4 y 5: >> A(3:5,:) ans = 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 Se pueden extraer conjuntos disjuntos de filas utilizando corchetes [ ]. Por ejemplo, el siguiente comando extrae las filas 1, 2 y 5: >> A([1 2 5],:) ans = 35 1 6 26 19 24 3 32 7 21 23 25 30 5 34 12 14 16 En los ejemplos anteriores se han extrado filas y no columnas por motivos del espacio ocupado por el resultado en la hoja de papel. Es evidente que todo lo que se dice para filas vale para columnas y viceversa: basta cambiar el orden de los ndices. El operador dos puntos (:) puede utilizarse en ambos lados del operador (=). Por ejemplo, a continuacin se va a definir una matriz identidad B de tamao 66 y se van a reemplazar filas de B por filas de A. Obsrvese que la siguiente secuencia de comandos sustituye las filas 2, 4 y 5 de B por las filas 1, 2 y 3 de A,

>> B=eye(size(A)); >> B([2 4 5],:)=A(1:3,:) B= 100000 35 1 6 26 19 24 001000 3 32 7 21 23 25 31 9 2 22 27 20 000001 Se pueden realizar operaciones an ms complicadas, tales como la siguiente8 : >> B=eye(size(A)); >> B(1:2,:)=[0 1; 1 0]*B(1:2,:) Como nuevo ejemplo, se va a ver la forma de invertir el orden de los elementos de un vector: >> x=rand(1,5) x= 0.9103 0.7622 0.2625 0.0475 0.7361 >> x=x(5:-1:1) x= 0.7361 0.0475 0.2625 0.7622 0.9103 Obsrvese que por haber utilizado parntesis en vez de corchetes los valores generados por el operador (:) afectan a los ndices del vector y no al valor de sus elementos. Para invertir el orden de las columnas de una matriz se puede hacer lo siguiente: >> A=magic(3) A= 816 357 4928 Se sustituyen las dos primeras filas de B por el producto de dichas filas por una matriz de permutacin. Captulo 3: Operaciones con matrices y vectores pgina 35 >> A(:,3:-1:1) ans = 6 1 8 7 5 3 2 9 4

aunque hubiera sido ms fcil utilizar la funcin fliplr(A), que es especfica para ello. Finalmente, hay que decir que A(:) representa un vector columna con las columnas de A una detrs de otra. public void MetodoLu(){ int i,j; double Y1,Y2,Y3,X1,X2,X3; double A[][] = new double [3][3]; double L[][] = new double [3][3]; double U[][] = new double [3][3]; double B[] = new double [3]; System.out.println("\t\t\t\"METODO DE LU 3 ECUACIONES\""); System.out.println("Ingrese coeficientes d"); for(i=0;i<3;i++) { System.out.println("Renglon "+(i+1)); for(j=0;j<3;j++) { System.out.println(" Ingrese a "+(i+1)+" "+(j+1)); A[i][j]=lee(); } } System.out.println("Ingrese los terminos independientes"); for(i=0;i<3;i++){ System.out.println("Termino "+(i+1)); B[i]=lee(); } for(i=0;i<3;i++){ L[i][0]=A[i][0]; U[i][i]=1;

} U[0][1]=A[0][1]/L[0][0]; L[1][1]=A[1][1]-L[1][0]*U[0][1]; L[2][1]=A[2][1]-L[2][0]*U[0][1]; U[0][2]=A[0][2]/L[0][0]; U[1][2]=(A[1][2]-L[1][0]*U[0][2])/L[1][1]; L[2][2]=A[2][2]-L[2][0]*U[0][2]-L[2][1]*U[1][2]; Y1=B[0]/L[0][0]; Y2=(B[1]-L[1][0]*Y1)/L[1][1]; Y3=(B[2]-L[2][0]*Y1-L[2][1]*Y2)/L[2][2]; X3=Y3; X2=Y2-U[1][2]*X3; X1=Y1-U[0][1]*X2-U[0][2]*X3; System.out.println("El resultado es:\nx0= "+X1+" \nx1= " +X2+" \nx2= " +X3); }

Este creo qe ya venia en las hojas qe te pase solo qe explica ah qe para aumentar a mas matrices se le agregan los valores nada mas Este es medio diferente Ejemplo: En este ejemplo se trata de efectuar el proceso de eliminacin Gaussiana sobre una matriz 4x4, definiendo todas las matrices Li , por las que hay que multiplicar a izquierda a la matriz A para conseguir hacer ceros por debajo de la diagonal. A={{10,7,8,7},{7,5,6,5},{8,6,10,9},{7,5,9,10}}; Aoriginal=A; A//MatrixForm i k jjjjjjjjjjjj

10 7 8 7 756 5 8 6 10 9 7 5 9 10 y { zzzzzzzzzzzz L1=IdentityMatrix[4]; For[i=2,i<=4,i++,L1[[i,1]]=-A[[i,1]]/A[[1,1]]] MatrixForm[L1] A=L1.A; MatrixForm[A] (* construccion de la primera matriz L1 *) i k jjjjjjjjjjjjjjjj 1 000 7 cccccc 10 100 4 cccc5 010 7 cccccc 10 001 y { zzzzzzzzzzzzzzzz i

k jjjjjjjjjjjjjjjj 10 7 8 7 0 1 cccccc 10 2 cccc5 1 cccccc 10 0 2 cccc5 18 cccccc 5 17 cccccc 5 0 1 cccccc 10 17 cccccc 5 51 cccccc 10 y { zzzzzzzzzzzzzzzz L2=IdentityMatrix[4]; For[i=3,i<=4,i++,L2[[i,2]]=-A[[i,2]]/A[[2,2]]]

MatrixForm[L2] A=L2.A; MatrixForm[A] (* construccion de la segunda matriz L2 *) i k jjjjjjjjjjjj 1 0 00 0 1 00 0 410 0 101 y { zzzzzzzzzzzz i k jjjjjjjjjjjjj 10 7 8 7 0 1 cccccc 10 2 cccc5 1 cccccc 10 0023 0035 y { zzzzzzzzzzzzz prac1.nb 6L3=IdentityMatrix[4];

For[i=4,i<=4,i++,L3[[i,3]]=-A[[i,3]]/A[[3,3]]] MatrixForm[L3] A=L3.A; MatrixForm[A] (* construccion de la tercera matriz L3 *) i k jjjjjjjjjjjjj 10 0 0 01 0 0 00 1 0 00 3 cccc2 1 y { zzzzzzzzzzzzz i k jjjjjjjjjjjjjjj 10 7 8 7 0 1 cccccc 10 2 cccc5 1 cccccc 10 0023 000 1

cccc2 y { zzzzzzzzzzzzzzz U=A; L=Inverse[L3.L2.L1]; MatrixForm[L]; (* como las modificaciones las hemos realizado sobre la matriz A, al final del proceso es triangular superior, y la llamamos U *) Aoriginal==L.U True Resolveremos ahora el sistema lineal con vector independiente {32,23,33,31} con la orden LinearSolve[] y con la implementacin directa de la frmula para comprobar que da la misma solucin b={32,23,33,31}; LinearSolve[Aoriginal,b] bb=L3.L2.L1.b; dim=4; x={0,0,0,0}; For[i=dim,i>=1,i--, x[[i]]=(bb[[i]]Sum[A[[i,j]]*x[[j]],{j,i+1,dim}])/A[[i,i]] ] Print[x] 81, 1, 1, 1< 81, 1, 1, 1< A continuacin se trata de resolver un sistema lineal ligeramente modificado en el vector independiente y ver lo que ocurre. prac1.nb 7b={32.1,22.9,33.1,30.9}; LinearSolve[Aoriginal,b]

bb=L3.L2.L1.b; dim=4; x={0,0,0,0}; For[i=dim,i>=1,i--, x[[i]]=(bb[[i]]Sum[A[[i,j]]*x[[j]],{j,i+1,dim}])/A[[i,i]] ] Print[x] 89.2, 12.6, 4.5, 1.1< 89.2, 12.6, 4.5, 1.1< Ejercicio: Hacer lo mismo con la matriz de Hilbert 4x4 y vector independiente b={4,163/60, 21/10, 241/140} utilizando 4 decimales. Ejercicio: Comprobar que la matriz A={{ 5, 1, 2},{1,8,3},{2,3,8}} es simtrica y puede factorizarse en la forma LDLT En este ejemplo vamos a ver cmo el no efectuar pivotaje lleva a una solucin bastante mala. prac1.nb 8Clear[b,A,boriginal,Aoriginal,p] b={1,1,1,1,1,1}; A={{p,-1,0,0,0,0},{0,p,-1,0,0,0},{0,0,p,-1,0,0}, {0,0,0,p,-1,0},{0,0,0,0,p,-1},{1,1,1,1,1,1}}; Aoriginal=A; boriginal=b; A//MatrixForm p=10.^(-10); i k jjjjjjjjjjjjjjjjjjjjjj p 10 0 0 0 0 p 10 0 0 00 p 10 0

00 0 p 1 0 00 0 0 p 1 11 1 1 1 1 y { zzzzzzzzzzzzzzzzzzzzzz El proceso de multiplicar a izquierda por las matrices Li para realizar la factorizacin LU de una matriz puede implementarse muy facilmente en Mathematica de la forma siguiente: dim=6; For[i=1,i<=dim,i++, For[j=i+1,j<=dim,j++, piv = -A[[j,i]]/A[[i,i]]; A[[j]] = A[[j]] + piv*A[[i]]; b[[j]] = b[[j]] + piv*b[[i]]; ] ] proceso de resolucin un sistema lineal con matriz triangular superior x = Table@0, 8i, dim<D; For@i = dim, i >= 1, i, x@@iDD = Hb@@iDD Sum@A@@i, kDDx@@kDD, 8k, i + 1, dim<DL A@@i, iDD D Print@N@xDD 88.264041032 , 8.264041022 , 8.264041012 , 827.404, 1., 1.< Ahora vemos cmo de bien satisface la solucin calculada el sistema lineal

N[Aoriginal.x-boriginal] 81., 0.000976563, 0., 0., 0., 8.264041032 < Si lo hacemos con la orden LinearSolve, que s que hace pivote, el resultado es bastante diferente prac1.nb 9y=N[LinearSolve[Aoriginal,boriginal]] Aoriginal.y-boriginal 86., 1., 1., 1., 1., 1.< 80., 0., 0., 0., 0., 0.<

Вам также может понравиться