Factorizacion QR
Factorizacion QR
Factorizacion QR
4. La Factorización QR
Dada una matriz cuadrada y nosingular A de orden n x n, entonces existe una
matriz ortogonal Q y una matriz triangular superior R tal que
A=QR
esta es llamada la factorización QR de A.
⎛R ⎞
A = QR = ⎜⎜ 1 ⎟⎟
⎝O⎠
donde R1 es una matriz triangular superior de orden n x n y 0 es una matriz de ceros de
orden (m-n) x n.
Si la matriz A es de orden m x n con m menor que n entonces
A = QR = (R1 S )
donde S es un matriz de orden (n-m) por m.
uu '
H = I −2
u' u
es llamada una matriz Householder, donde I es la matriz identidad y u es un vector no
nulo.
Propiedades de la matriz H:
La importancia de las matrices Householder es que ellas pueden ser usadas para crear
ceros en un vector y por lo tanto pueden dar lugar a matrices triangulares.
Consideremos el vector elemental e1=(1,0,…,0) ‘. Entonces para todo vector no nulo
x≠e1 existe siempre una matriz Householder H tal que Hx es un múltiplo de e1.
Edgar Acuña/ESMA 6665 Lecc4-5 25
1) m=max{|xi|), i=1,2….n
2) ui=xi/m, i=1,2….n
3) σ=sign(u1) u12 + u 22 + ..... + u n2
4) u1=u1+σ
5) σ=-m*σ
[m,n] = size(x);
mm = max(abs(x));
x = x/mm;
s = sign(x(1));
if s == 0
s = 1;
end;
sigma = s * norm(x,2);
u = x + sigma * eye(m,1);
sigma = -mm * sigma;
» x=[3;4;9]
x=
3
4
9
Edgar Acuña/ESMA 6665 Lecc4-5 26
» addpath c:\matlab\acuna
» [u,sigma]=housecero(x)
u=
1.4773
0.4444
1.0000
sigma =
-10.2956
» u1=2*u*u'/(u'*u)
u1 =
» % matriz Householder
» H=eye(3)-u1
H=
» H*H
ans =
1.0000 0 0.0000
0 1.0000 0
0.0000 0 1.0000
»
El vector transformado sera Hx=(-10.2956,0,0)’.
uu '
Hx=(I- 2 )x=x-βu(u’x) donde β=2/(u’u).
u' u
function A = housemult(A,u)
[m1,n] = size(A);
beta = 2/(u'*u);
for i = 1 : m1
s = 0;
s = s + u(1:n) * A(i,1:n);
s = beta * s;
A(i,1:n) = A(i,1:n) - (s*u(1:n))';
end;
end;
Edgar Acuña/ESMA 6665 Lecc4-5 28
Paso 1: Construir una matriz Householder H1 tal que H1A tenga zeros debajo de la
entrada (1,1) en la primera columna. Es decir,
⎡ * * .... *⎤
⎢0 * .... *⎥⎥
H1A= ⎢
⎢.... ..... ..... .... ⎥
⎢ ⎥
⎣0 * * *⎦
⎛ a11 ⎞ ⎛ * ⎞
⎜ ⎟ ⎜ ⎟
⎜a ⎟ ⎜ 0 ⎟
H1 ⎜ 21 ⎟ = ⎜ ⎟
.... ....
⎜ ⎟ ⎜ ⎟
⎜a ⎟ ⎜ ⎟
⎝ n1 ⎠ ⎝ 0 ⎠
Paso 2: Construir una matriz Householder H2 tal que H2A(1) tenga zeros debajo de la
entrada (2,2) en la segunda columna y que los ceros que ya se crearon en la primera
columna de matriz A(1) no cambien. Es decir,
⎡* * * ... *⎤
⎢0 * * ... * ⎥⎥
⎢
A(2)=H2A(1)= ⎢ 0 0 * ... *⎥
⎢ ⎥
⎢... ... ... ... ...⎥
⎢⎣ 0 0 * ... * ⎥⎦
H2 puede ser construido como sigue: primero construir una matriz Householder
~
H 2 = I n −1 − 2u n −1u n' −1 /(u n' −1u n −1 ) de orden n-1 tal que
Edgar Acuña/ESMA 6665 Lecc4-5 29
⎛ a 22 ⎞ ⎛ * ⎞
⎜ ⎟ ⎜ ⎟
⎜ a 32 ⎟ ⎜ 0 ⎟
H 2 ⎜ ... ⎟ = ⎜ ...⎟
~
⎜ ⎟ ⎜ ⎟
⎜ ... ⎟ ⎜ ...⎟
⎜a ⎟ ⎜ ⎟
⎝ n2 ⎠ ⎝ 0 ⎠
y luego definir,
⎛ 1 0 ... 0⎞
⎜ ⎟
⎜0 ⎟
H2 = ⎜ ~ ⎟
... H2
⎜ ⎟
⎜0 ⎟
⎝ ⎠
Paso k: Construir una matriz Householder Hk tal que HkA(k-1) tenga zeros debajo de la
entrada (k,k) en la k-ésima columna y que los ceros que ya se crearon en los pasos
anteriores no cambien. Hk puede ser construido como sigue: primero construir una
~
matriz Householder H 2 = I n − k +1 − 2u n − k +1u n' − k +1 /(u n' + k +1u n − k +1 ) de orden n-k+1 tal que
⎛ a kk ⎞ ⎛ * ⎞
⎜ ⎟ ⎜ ⎟
⎜ a kk +1 ⎟ ⎜ 0 ⎟
H k ⎜ ... ⎟ = ⎜ 0 ⎟
~
⎜ ⎟ ⎜ ⎟
⎜ ... ⎟ ⎜ ...⎟
⎜ a ⎟ ⎜ ⎟
⎝ kn ⎠ ⎝ 0 ⎠
y luego definir,
⎛I 0 ⎞
H 2 = ⎜⎜ k −1 ~ ⎟⎟
⎝ 0 Hk ⎠
Calcular A =HkA . Superponer A por A(k).
(k) (k-1)
R=A(n-1)=Hn-1A(n-2)=Hn-1Hn-2A(n-3)=….=Hn-1Hn-2…H2H1A
Hacer,
Edgar Acuña/ESMA 6665 Lecc4-5 30
Q’=Hn-1Hn-2…….H2H1
Como cada matriz Hk es orthogonal tambien lo es Q’. Así que R=Q’A o A=QR.
⎛ a kk ⎞ ⎛ σ ⎞
⎜ ⎟ ⎜ ⎟
⎜ a k +1k ⎟ ⎜ 0 ⎟
H k ⎜ ... ⎟ = ⎜ ... ⎟
~
⎜ ⎟ ⎜ ⎟
⎜ ... ⎟ ⎜ ... ⎟
⎜ ⎟ ⎜ ⎟
⎝ a nk ⎠ ⎝ 0 ⎠
(Usar Housecero)
aik≡uik, I=k+1,…..,n
vk≡ukk
Paso 5. Modificar las entradas de la submatriz A que contiene las filas k hasta n y las
columnas k+1 hasta n.
For j=k+1,….n do
Edgar Acuña/ESMA 6665 Lecc4-5 31
n
1. s=β ∑ u ik aij
i=k
2. aij=aij-suik (i=k,k+1,….,n)
[m,n] = size(A);
S= min(n,m-1);
Q = eye(m,m);
for k = 1 : S
[x,sigma] = housecero(A(k:m,k));
Q(1:m,k:m) = housemult(Q(1:m,k:m),x);
A(k,k) = sigma ;
s1 = size(x);
A(k+1:m,k) = x(2:s1);
v(k) = x(1);
beta = 2/(x'*x);
for j = k+1:n
s = 0;
s = s + x(1:m-k+1)' * A(k:m,j);
s = beta * s;
A(k:m,j) = A(k:m,j) - s * x(1:m-k+1);
end;
end;
R = triu(A);
end;
⎛ 4 2 5⎞
⎜ ⎟
A= ⎜ 8 6 7 ⎟
⎜ 1 9 5⎟
⎝ ⎠
Edgar Acuña/ESMA 6665 Lecc4-5 32
⎛4 5 7⎞
⎜ ⎟
⎜3 2 2⎟
B= ⎜
1 7 0⎟
⎜ ⎟
⎜5 −1 4 ⎟⎠
⎝
Usando Matlab y R.
Solución:
En R,
> A=rbind(c(4,2,5),c(8,6,7),c(1,9,5))
> A
[,1] [,2] [,3]
[1,] 4 2 5
[2,] 8 6 7
[3,] 1 9 5
> rqa=qr(A)
> qr.Q(rqa)
[,1] [,2] [,3]
[1,] -0.4444444 0.14582171 0.8838581
[2,] -0.8888889 0.05059121 -0.4553208
[3,] -0.1111111 -0.98801648 0.1071343
> qr.R(rqa)
[,1] [,2] [,3]
[1,] -9 -7.222222 -9.000000
[2,] 0 -8.296958 -3.856835
[3,] 0 0.000000 1.767716
>
> B=rbind(c(4, 5, 7),c(3, 2, 2),c(1, 7, 0),c( 5, -1, 4))
> B
[,1] [,2] [,3]
[1,] 4 5 7
[2,] 3 2 2
[3,] 1 7 0
[4,] 5 -1 4
> qrb=qr(B)
> qr.Q(qrb)
[,1] [,2] [,3]
[1,] -0.560112 0.35151479 0.7498522
[2,] -0.420084 0.04424662 -0.3576556
[3,] -0.140028 0.80872982 -0.4748942
[4,] -0.700140 -0.46950576 -0.2903096
> qr.R(qrb)
[,1] [,2] [,3]
[1,] -7.141428 -3.920784 -7.5615125
[2,] 0.000000 7.976682 0.6710737
[3,] 0.000000 0.000000 3.3724160
>
En Matlab
» addpath c:\matlab\acuna
» A=[4 2 5;8 6 7;1 9 5]
A =
Edgar Acuña/ESMA 6665 Lecc4-5 33
4 2 5
8 6 7
1 9 5
» [q,r]=houseqr(A)
q =
r =
B =
4 5 7
3 2 2
1 7 0
5 -1 4
» [q,r]=houseqr(B)
q =
r =