Está en la página 1de 2

Práctica 9: Algoritmo de Gram-Schmidt y

factorización QR

1. Introducción
Recuerde que una manera de obtener la factorización QR de una matriz
A ∈ Rn×m de rango m,
A = QR,
consiste en aplicar el conocido método de ortogonalización de Gram-Schmidt
a las columnas de la matriz A. Si a1 ,. . . , am son las columnas de A, y q1 ,. . . ,
qm son las columnas de Q, tenemos las fórmulas y1 = a1 ,
k
X hyi , ak+1 i yk
yk+1 = ak+1 − yi , qk = , k = 1, . . . , m − 1,
hyi , yi i kyk k2
i=1

donde ha, bi = AT b es el producto escalar estándar en Rn .


Matricialmente, si denotamos por Qk = (q1 | . . . |qk ), se tiene

P1 = I , Pk+1 = Im − Qk QTk , k = 1, . . . , m − 1 , (1)

y
yk
yk = Pk ak , qk = , k = 1, . . . , m . (2)
kyk k2
Vimos que este método adolece de problemas de estabilidad, que provocan
que ya para valores no muy grandes de m los vectores qk obtenidos no sean
ortogonales.
MATLAB permite calcular directamente la factorización QR por medio
de la función qr. Ası́, [Q,R]=qr(A) nos devuelve la factorización QR com-
pleta de A. La implementación interna de esta factorización usa algoritmos
mucho más estables que el Gram-Schmidt clásico, lo que vamos a comprobar
a continuación.

2. Trabajo de laboratorio
1. Vamos a crear la función gs( ) que implemente la factorización Gram-
Schmidt según las fórmulas (1) y (2).
Práctica de ordenador IX 2

a) La función, cuyo encabezado será


function [A]=gs(A)

va a sobreescribir las columnas de la matriz de entrada A con


las recién creadas columnas qk . Como primer paso obtenga la
cantidad de columnas de A por medio de la función size( ). La
función debe incluir también la comprobación de que el rango de
la matriz A es maximal. Para ello puede utilizar el comando rank
de MATLAB.
b) Recuerde que para referirnos en MATLAB a toda la columna
k-ésima de A podemos usar la sintaxis A(:, k). Análogamente, el
menor constituido por las k primeras columnas de A y todas sus
filas es A(:, 1 : k).

2. Vamos a probar la función gs( ) construida con las matrices de Hilbert.


Para ello:

a) En un ciclo con el contador k = 2 : 25, tome como matriz


A=hilb(k) (matriz de Hilbert k × k) y calcule su factor Q=gs(A).
De ser el resultado totalmente preciso, deberı́amos tener QQT =
Ik . Para medir la precisión de nuestro algoritmo, calcule el va-
lor er gs(k)=kIk − QQT k. Al salir del ciclo debe tener todos los
valores del error almacenados en el vector er gs.
b) Realice lo mismo pero esta vez usando la función qr( ) de MA-
TLAB. Al salir del ciclo debe tener todos los valores del error
almacenados en el vector er qr.
c) Vamos a reflejar gráficamente los resultados. Por medio del co-
mando
plot(2:25,er_gs,’o’,2:25,er_qr,’x’);

dibujamos los errores dados por la función gs( ) (con pequeños


cı́rculos) y los errores dados por la función qr( ) (con pequeñas
cruces). Para mayor claridad, por medio del comando
legend(’Error de gs( )’,’Error de qr( )’,0);

podemos agregar una leyenda al gráfico. Interprete los resultados


obtenidos.

Andrei Martı́nez Finkelshtein

También podría gustarte