Académique Documents
Professionnel Documents
Culture Documents
Curso 2010-11
1. M etodo de Gram-Schmidt cl asico
Vamos a implementar en MATLAB el algoritmo de Gram-Schmidt cl asico tal y como se ha visto en clase, con la u nica salvedad de ir normalizando los vectores ortogonales seg un se van obteniendo para minimizar en lo posible las operaciones. M as concretamente, dada una matriz A = [a1 . . . an ] con columnas linealmente independientes, encontraremos una base ortonormal de dicho espacio columna, que almacenaremos por columnas en la matriz Q = [q1 . . . qn ]. Los coecientes necesarios para realizar dicha ortonormalizaci on se almacenar an en la matriz R, de manera que r11 = a1 , y para k = 2, . . . , n, qk = q k /rkk , donde rjk =< ak , qj >, j = 1, . . . , k 1, rkk = q k . Ejercicio 1. Implementa con dos bucles FOR dicho programa, que denominaremos function [q r]=gramsc(a). Ejercicio 2. Ejecuta el programa anterior con la matriz
.
q1 = a1 /r11 ,
con
q k = ak
k 1 j =1
rjk qj ,
A=
2 3 1 1 2 1 2 2
1 1 4 1
Escribe en la ventana de comandos >> q r >> q q eye(3) para comprobar que el algoritmo est a bien implementado. 1
Notemos que, para la implementaci on, no es necesario introducir una nueva variable Q sino que se puede aprovechar Q para ir metiendo los valores . Por otro lado, se puede realizar la implementaci que corresponder an a Q on con s olo un bucle FOR para k, realizando el resto de operaciones de forma matricial, con la facilidad que ofrece MATLAB de referirse a distintas las o columnas de la matriz con :. Por ejemplo, la matriz formada por las primeras k 1 columnas de A ser a A(:, 1 : k 1). El algoritmo quedar a as escrito: function [q,r]=gramscb(a) [m n]=size(a); r=zeros(n); q=zeros(m,n); r(1,1)=norm(a(:,1)); q(:,1)=a(:,1)/r(1,1); for k=2:n r(1:k-1,k)=q(:,1:k-1)*a(:,k); q(:,k)=a(:,k)-q(:,1:k-1)*r(1:k-1,k); r(k,k)=norm(q(:,k)); q(:,k)=q(:,k)/r(k,k); end Ejercicio 3. Vuelve a repetir el ejercicio 2 con este programa.
Notemos que ahora estar amos sobreescribiendo sobre A las columnas que vamos haciendo ortonormales, con lo cual al nal Q ser a la A del programa. De nuevo, en el programa bastar a utilizar un u nico bucle FOR, correspondiente ahora al ndice j . El programa queda como sigue: function [q,r]=gramsm(a) [m n]=size(a); for j=1:n r(j,j)=norm(a(:,j)); a(:,j)=a(:,j)/r(j,j); r(j,j+1:n)=a(:,j)*a(:,j+1:n); a(:,j+1:n)=a(:,j+1:n)-a(:,j)*r(j,j+1:n); end q=a; Ejercicio 4. Realiza las mismas comprobaciones que en el ejercicio 3 con el nuevo algoritmo. Despu es haz las mismas comprobaciones con uno y otro algoritmo utilizando la matriz
A=
1 0 0
1 0 0
1 0 0
= 109 .
Como ver as, el algoritmo modicado es m as estable cuando las columnas de A est an cerca de ser linealmente dependientes.