Professional Documents
Culture Documents
Índice
El problema y consideraciones teóricas
Pivotación
Algoritmo
Número de operaciones
Método de Gauss-Jordan
Condicionamiento de sistemas de ecuaciones lineales
Factorización LU
Solución de sistemas modificados
Refinamiento iterativo
Hay que obtener el valor del vector x D Œx1; : : : ; xnT que hace que se cumplan
simultáneamente todas las igualdades.
Los números aij son los coeficientes del sistema y b D Œb1; : : : ; bmT el término
independiente.
4/128
Ax D b:
m=n · = m=n
rango(A) = m = n
m=n · = m=n · =
rango(A) = m = n rango(A) < m = n
· = · =
rango(A) = m = n rango(A) < m = n
1a 1b
1a 1b
m>n · = m>n · =
m>n · = m>n · =
rango(A) = n < m rango(A) < n < m
m>n · = m>n · =
rango(A) = n < m rango(A) < n < m
2a 2b
2a 2b
m<n m<n
m<n · = m<n · =
rango(A) = m < n · = rango(A) < m < n · =
m<n m<n
rango(A) = m < n = rango(A) < m < n =
· ·
rango(A) = m < n rango(A) < m < n
3a 3b 5/101
3a 3b
6/128
Physicaladoptamos
Simplificadamente, Model: el modelo físico Mathematical
y matemático deModel:
la figura en el
que se esquematiza un tiristor o un transistor montado en una placa disipadora
de calor.
aire
Q1 Q2
c Τp Τw
Qc
R2
Q3 R3 Q4 R4 Q5 R5
Tp
Tw
Τa Τa Τa
temperatura exterior Ta
9/128
R1 Q1 Tc C T9 D0
R2 Q2 Tp C Tw D0
R3 Q3 Tc D Ta
R4 Q4 Tp D Ta
R5 Q2 Tw D Ta
Q1 C Q3 D Qc
Q1 Q2 Q4 D 0:
A =
100 0 0 0 -1 1 0
0 200 0 0 0 -1 1
0 0 50 0 -1 0 0
0 0 0 100 0 -1 0
0 300 0 0 0 0 -1
1 0 1 0 0 0 0
1 -1 0 -1 0 0 0
» b=[0;0;-50;-50;-50;25;0]
b =
0
0
-50
-50
-50
25
0
>> x=A\b
x =
1.0e+003 *
0.00535714285714
0.00089285714286
0.01964285714286
0.00446428571429
1.03214285714286
0.49642857142857
0.31785714285714
12/128
Analicemos geométricamente el problema de resolver un sistema de dos
ecuaciones lineales con dos incógnitas:
a11x1 C a12x2 D b1
a21x1 C a22x2 D b2:
Cada una de las ecuaciones que componen el sistema representa una recta
en el espacio euclídeo de dimensión dos.
x2
a11 x 1 + a12 x 2 = b1
a21 x 1 + a22 x 2 = b2
x1
7KHZRUNLVHVVHQWLDOO\GRQH ,WVKRZVWKD
.29; 16; 3/ +RZHYHU VLQFHWKHUHDUHVRPDQ
WRFKHFNWKHZRUN 7RYHULI\WKDW .29; 16;
WKHOHIWVLGHRIWKHRULJLQDOV\VWHP DQGFRP
b1
b2
a11
a21
a12
a22
Índice
El problema; consideraciones teóricas
Factorización LU
Refinamiento iterativo
El más clásico es el debido a Gauss, quien lo aplicó por primera vez en 1809 con
motivo de unos estudios sobre órbitas de cuerpos celestes.
9
u11x1 C u12x2 C C u1nxn D b10 =
b20
U x D b0:
u22x2 C C u2nxn D
;
::: :::
0
unnxn D bn;
19/128
ui i ¤ 0; i D 1; : : : ; n;
Etapa 1
aO i1
ri D ; i D 2; : : : ; n:
aO 11
aO ij aO ij ri aO 1j ; i D 2; : : : ; nI j D 2; : : : ; n C 1:
2 1 0 4 2
b1 D 60
40
0 3 1 57
25
A
1 2 0
:
0 3 12 1 2
2 32 3 2 3
1 0 0 0 2 1 0 4 2 2 1 0 4 2
6 2 07 6 97 6 0 57
L1b
1 0 4 2 3 7 0 3 1
AD4
05 4 25 4 0 25
En efecto, 2 0 1 4 1 2 8
D
1 2 0
.
0 0 0 1 0 3 12 1 2 0 3 12 1 2
26/128
Su inversa es 2 3
1000
6 7
6 2 1 0 07
L1 1 D6 7:
4 2 0 1 05
0001
La única diferencia con L1 es el signo de los coeficientes de la primera columna
debajo de la diagonal principal.
b 1 D L1 A.
En resumen, A b
27/128
Etapa 2
1
Al tratar de hacerlo, vemos que el coeficiente pivote aO 22 es cero, lo que nos
impide proceder como en la etapa anterior.
1
Comprobemos si algún coeficiente de la columna 2 por debajo de aO 22 no es 0:
Si no hay ninguno, esta columna es combinación lineal de la primera y por
tanto la matriz es singular.
Si hay varios, escojamos el de mayor valor absoluto e intercambiemos la fila
de ese coeficiente con la segunda.
28/128
b 1 por la permutación
Esto mismo se obtiene premultiplicando A
2 3
1000
6 7
60 0 0 17
P1 D 6 7:
40 0 1 05
0100
29/128
b 0 , es:
Recapitulemos: la matriz con la que vamos a operar a continuación, A 1
b 0 D P 1 L1 A:
A b
1
b 0 resultante:
Los nuevos coeficientes de la matriz A 1
en la 3a fila:
0
1
aO 32 0
10 10 0
1 1
aO 33 aO 33 r3 aO 23 D 2C 3
12 D 2
10 10 10 1
aO 34 aO 34 r3 aO 24 D 0C 3
1 D 1=3
10 10 10 1
aO 35 aO 35 r3 aO 25 D 2 3
2 D 8=3I
en la 4a fila:
0
1
aO 42 0
10 10 0
1
aO 43 aO 43 r4 aO 23 D 3 0 12 D 3
10 10 10
aO 44 aO 44 r4 aO 24 D 1 01 D 1
10 10 10
aO 45 aO 45 r4 aO 25 D 5 02 D 5:
Al ser r4 D 0, los cálculos para adaptar la cuarta fila podrían haberse evitado.
31/128
Etapa 3
2
El coeficiente de la diagonal principal aO 33 es distinto de cero, luego procedemos
a calcular el multiplicador r4:
2 2
r4 D aO 43 =aO 33 D 3=2:
aO ij2 aO ij2 2
ri aO 3j ; i D 4I j D 4; 5:
33/128
b una serie
A este resultado se ha llegado después de aplicar a la matriz inicial A
de transformaciones; concretamente:
b 3 D L3 L2 P 1 L1 A;
A b
donde 2 3
10 0 0
6 7
60 1 0 07
L3 D 6 7:
40 0 1 05
0 0 3=2 1
U x D b0
En el ejemplo, 2 32 3 2 3
2 1 0 4 x1 2
6 76 7 6 7
60 3 12 17 6x27 6 27
6 76 7 D 6 7:
40 0 2 1=35 4x35 4 8=35
0 0 0 1=2 x4 1
36/128
x4 D 2;
Pivotación
en una máquina teórica con sólo tres dígitos significativos que redondea.
Para el caso de este último ejemplo, en la primera etapa en vez de operar sobre
la matriz anterior, como el valor absoluto del coeficiente a21 es mayor que el del
a11, se intercambiaría la fila 1 con la 2, obteniéndose
1 1 2
A0 D y b0
D :
10 4 1 1
x1 1
D :
x2 1
0,9998
Solución mucho mejor que la anterior, pues la real es x2 D D 0,99989999
0,9999
x1 D 1,00010001:
Su por qué radica en la aritmética de precisión finita con la que trabajan todos
los ordenadores y en el hecho de que los factores o multiplicadores antes
introducidos son inversamente proporcionales al coeficiente pivote: si éste es
demasiado pequeño puede amplificar los errores de redondeo a lo largo del
proceso de solución y favorecer la dominancia que se ha descrito.
Una segunda estrategia de pivotación es la pivotación total. Consiste en buscar
Full Pivoting 43/128
To avoid division by zero, swap the row having the zero pivot
en una etapa i with
noonesólo elrows
of the coeficiente
below it. de mayor valor absoluto en esa columna
sino en todo lo que queda de la submatriz activa: mKaxikn; ij n jakj j.
Rows completed in Rows completed in
forward elimination. forward elimination.
0 Row with zero pivot 0element * Row with zero pivot element
Algoritmo
Resolución de Ax D b
Transformación de la Matriz Aumentada ŒAjb
for i D 1 to n 1
Determinar índice p 2 fi; i C 1; : : : ; ng tal que ja.p; i /j D mKaxi j n ja.j; i /j.
Intercambiar filas p e i .
for j D i C 1 to n
D a.j; i /=a.i; i /
for k D i C 1 to n C 1
a.j; k/ a.j; k/ a.i; k/
end
end
end
Sustitución Inversa.
for j D n to01 1
X
n
x.j / @b.j / a.j; k/ x.k/A a.j; j /
kDj C1
end
En código de Matlab, para cualquier sistema. 45/128
function [x]=Gauss(A,b)
% Solución de Ax=b mediante eliminación de Gauss
n=size(A,1); x=zeros(n,1);
for i=1:n-1 % Transformación matriz A en n-1 etapas
[p,maxk]=max(abs(A(i:n,i)));
maxk=maxk+i-1;
if i~=maxk
A([i maxk],:) = A([maxk i],:);
b([i maxk]) = b([maxk i]);
end
j=i+1:n;
A(j,i) = A(j,i)/A(i,i);
A(j,j) = A(j,j)-A(j,i)*A(i,j);
b(j) = b(j)-b(i)*A(j,i);
end
for i=n:-1:1 % Sustitución inversa
x(i)=(b(i)-A(i,i+1:n)*x(i+1:n))/A(i,i);
end
end
>> A=randn(4000);
>> x=ones(4000,1);
>> A=[2 1 0 4;-4 -2 3 -7;4 1 -2 8;0 -3 -12 -1]; >> b=A*x;
>> Gauss(A,b) >> tic,norm(x-Gauss(A,b)),toc
información que definen los multiplicadores asociados a cada fila de cada etapa.
Los i 1 multiplicadores se pueden guardar en los lugares vacíos —o mejor
dicho, que se hacen cero— que provocan las transformaciones que definen:
en la etapa i , debajo de la diagonal principal en la columna i .
En el ejemplo, con esta idea, al final del proceso:
2 3
2 1 0 4
6 7
6 2 3 12 17
AD6 7:
4 2 1=3 2 1=35
0 0 3=2 1=2
0 2222
:: :: :: :: :: ! :: :: :: :: ::
0 2222
0 2222
.n i / C .n i /.n i C 1/ D .n i /.n i C 2/
multiplicaciones y divisiones y
.n i /.n i C 1/
sumas y restas.
En n 1 etapas de que consta el proceso, se harán 53/128
X
n 1 X
n 1 X
n 1 X
n 1
.n i /.n 2
i C 2/ D .n C 2n/ 1 2.n C 1/ iC i2
i D1 i D1 i D1 i D1
.n 1/n
D .n2 C 2n/.n 1/ 2.n C 1/
2
.n
1/n.2n 1/
C
6
2n3 C 3n2 5n
D
6
multiplicaciones y divisiones y
X
n 1 X
n 1 X
n 1 X
n 1
.n i /.n 2
i C 1/ D .n C n/ 1 .2n C 1/ iC i2
i D1 i D1 iD1 i D1
.n 1/n
D .n2 C n/.n 1/ .2n C 1/
2
.n 1/n.2n 1/
C
6
n3 n
D
3
sumas y restas.
54/128
El comportamiento de estos valores para n grande tiende a
1 3
n.
3
multiplicaciones y divisiones y
X
n 1
n2 n
..n i 1/ C 1/ D
i D1
2
sumas y restas.
55/128
1 3
n O.n3=3/
3
Li D I ˛i e Ti ;
donde 2 3 2 3
0 0
6 :: 7 6 ::: 7
6 : 7 6 7
6 i i 7 6 7
˛i D 6ai C1 i =ai i 7 fila i C 1 y e i D 617 fila i :
6 :: 7 6:7
4 : 5 4 :: 5
i
ani =aii i 0
58/128
Ti D I ˛i e Ti ;
donde 2 i
3 2 3
a1i =aii i 0
6 ::: 7 6 ::: 7
6 7 6 7
6 i 7 6 7
˛i D 6 1=ai i 7 fila i y e i D 617 fila i :
6 : 7 6:7
4 :: 5 4 :: 5
i
ani =aii i 0
Tn 1 T 2T 1A D I;
1
y por tanto A D Tn 1 T 2T 1:
.A C A/x D b C b:
Por lo que respecta al vector solución, ese cambio relativo en la norma euclídea
es q
kxk2 .1 0;993/2 C .1 0;9968/2
D q 0;0054:
kxk2 2 2
1 C1
x2 x2
x1 x1
A.x C x/ D b C b
con la de
Ax D b:
De las igualdades
A.x C x/ D b C b y Ax D b;
x D A 1b:
Definición Sea kk una norma matricial consistente con una norma vectorial. Asociado
a esa norma, el número de condición de una matriz invertible A, .A/, es:
.A/ D kAk kA 1 k:
σ2 σ1
x Ax
70/128
Estudiemos ahora la sensibilidad a pequeñas perturbaciones en los coeficientes
de A. Comparemos la solución de
Ax D b y .A C A/.x C x/ D b:
Así pues el error relativo que resulta de perturbar ligeramente los coeficientes de
la matriz del sistema Ax D b está también acotado en términos del número de
condición de la matriz A.
Teorema Para toda matriz A de rango completo: 71/128
6. 2 .A T A/ D 22 .A/.
7. Su número 2 .A/ D 1 si la matriz es la identidad o se trata de una matriz ortogonal.
8. Su número de condición 2 .A/ es invariante frente a transformaciones ortogonales.
Los distintos números de condición de una matriz A 2 Rnn asociados con las
normas matriciales más habituales cumplen que:
2 .A/=n 1 .A/ n 2 .A/I
1 .A/=n 2 .A/ n 1 .A/I
1 .A/=n2 1 .A/ n2 1 .A/:
Volvamos al ejemplo que utilizábamos para concretar estos conceptos. La 72/128
matriz
8 5
AD ;
4 10
cuya inversa es
1 0;10 0;05
A D ;
0;04 0;08
tiene un número de condición 1.A/ D kAk1 kA 1k1 D 15 0,14 D 2,1.
El de
bD 0,66 3,34
A ;
1,99 10,01
cuya inversa es
b 1 250,25 83,5
A D ;
49,75 16,5
b D kAk
es 1.A/ b 1 kA
b 1 k1 D 13,35 300 D 4.005: tres órdenes de magnitud
superior.
73/128
2 3
12
6 12 7
6 7
6 1 2 7
6 7:
6 ::: :::
7
4 1 25
1
Su inversa es 2 3
1 2 4 . 2/n 1
6 1 2 . 2/n 2
7
6 :: 7
6 1 : 7:
4 ::: ::
:
5
1
x1 C x2 D 2
1;0001x1 C x2 D 2;0001
cuya solución es Œ1; 1T , y queremos calcular los errores hacia atras y hacia
delante de la solución aproximada Œ 1; 3;0001, se tendrá que,
78/128
Figure 2.2 helps to clarify how there can be a small backward error and large forward
error at the same time. Even though the “approximate root’’ (−1, 3.0001) is relatively far
from the exact root (1, 1), it nearly lies on both lines. This is possible because the two lines
are almost parallel. If the lines are far from parallel, the forward and backward errors will
La figura aclara cómo puede haber un error pequeño hacia atrás y uno grande
be closer in magnitude.
hacia delante al mismo tiempo.
y
3
2
x
–1 1
Figure 2.2 The geometry behind Example 2.11. System (2.17) is represented by
the lines x2 = 2 – x1 and x2 = 2.0001 – 1.0001x1 , which intersect at (1,1). The point
( –1, 3.0001) nearly misses lying on both lines and being a solution. The differences
El punto Œ 1; 3;0001 está relativamente lejos de la solución, pero cerca de
between the lines is exaggerated in the figure—they are actually much closer.
Para el sistema anterior, con normas infinito, el error relativo hacia atrás es
0;0001
0;00005 D 0;005 %
2;0001
y el error relativo hacia adelante
2;0001
D 2;0001 200 %:
1
80/128
Índice
El problema; consideraciones teóricas
Eliminación de Gauss
Refinamiento iterativo
Factorización LU
Ux D y y Ly D b:
Teorema Sea A una matriz cuadrada regular de orden n. Existe una matriz de per-
mutación P y dos matrices, una triangular inferior y otra triangular superior, L y U ,
respectivamente, tales que
PA D LU :
La matriz L tiene todos los coeficientes de la diagonal principal igual a 1.
11 12 13 11 12 13
a21 a22 a23 D l21 l22 0 0 1 u23 ;
a31 a32 a33 l31 l32 l33 0 0 1
function [L U]=LUCrout(a)
% Factorización LU por Crout
n=size(a,1); L=zeros(n); U=eye(n);
En Matlab: for k=1:n
i=k:n; L(i,k)=a(i,k)-L(i,1:k-1)*U(1:k-1,k);
i=k+1:n; U(k,i)=(a(k,i)-L(k,1:k-1)*U(1:k-1,i))/L(k,k);
end
end
Ahora bien, como apuntábamos en la eliminación de Gauss, se puede aprovechar 90/128
2 3
0,001 2,000 3,000
A D 4-1,000 3,712 4,6235
-2,000 1,072 5,643
¡Ojo! que el cálculo de l33 conlleva la pérdida de tres dígitos por redondeo: el
valor que debería dar es 5,922.
92/128
Pivotación
for k D 1 to n
for i D k to n
X1
k
l.i; k/ a.i; k/ l.i; p/u.p; k/
pD1
end
Determinar índice p 2 fk; k C 1; : : : ; ng tal que ja.p; i /j D mKaxi j n ja.j; i /j.
Intercambiar filas p y k.
for i D k C 1 0to n 1
X1
k
u.k; i / @ a.k; i / l.k; p/u.p; i / A l.k; k/
pD1
end
end
function [L U p]=CroutP(a)
% Factorización LU por Crout con pivotación
n=size(a,1); p=1:n;
for k=1:n
i=k:n; a(i,k)=a(i,k)-a(i,1:k-1)*a(1:k-1,k);
[r,m]=max(abs(a(k:n,k))); m=m+k-1;
if a(m,k)==0, continue, end
if k~=m, a([k m],:)=a([m k],:); p([k m])=p([m k]); end
i=k+1:n; a(k,i)=(a(k,i)-a(k,1:k-1)*a(1:k-1,i))/a(k,k);
end
L=tril(a,0); U=triu(a,1)+eye(n,n);
end
10 10 20 94/128
El algoritmo de Crout para factorizar una matriz regular A nn en la forma L1U
es el que sigue.
function [L,U]=Croutl1u(a)
% Factorización L1U por Crout
n=size(a,1);
for k=1:n-1
Su implementación en Matlab: i=k+1:n;
a(i,k)=a(i,k)/a(k,k);
a(i,i)=a(i,i)-a(i,k)*a(k,i);
end
L=tril(a,-1)+eye(n,n); U=triu(a);
end
>> [L U P]=CroutP1(A);
function [L,U,P]=CroutP1(a) >> L
% Factorización L1U por Crout con pivotación L =
n=size(a,1); p=1:n; 1.0000 0 0
0.6667 1.0000 0
for k=1:n-1 0.3333 0.8000 1.0000
[r,m]=max(abs(a(k:n,k))); >> U
m=m+k-1; U =
if a(m,k)==0, continue, end 30.0000 50.0000 61.0000
0 -8.3333 -0.6667
if k~=m, a([k m],:)=a([m k],:); p([k m])=p([m k]); end 0 0 0.2000
i=k+1:n; >> P*L*U
a(i,k)=a(i,k)/a(k,k); ans =
10 10 20
a(i,i)=a(i,i)-a(i,k)*a(k,i);
20 25 40
end 30 50 61
L=tril(a,-1)+eye(n,n); U=triu(a); P=eye(n); P=P(p,:); >> norm(P*A-L*U)
end ans =
0
>> A=rand(20);
>> max(max(A*InvLU_1(A)-eye(20)))
ans =
2.109423746787797e-015
>> A=rand(1000);
>> tic, max(max(A*InvLU_1(A)-eye(1000))), toc
ans =
5.251354906476990e-013
Probemos: Elapsed time is 4.017733 seconds.
>> tic, max(max(A*inv(A)-eye(1000))), toc
ans =
5.207778652760453e-013
Elapsed time is 0.447034 seconds.
>> tic, max(max(A*(A\eye(1000))-eye(1000))), toc
ans =
3.934630399271555e-013
Elapsed time is 0.393214 seconds.
Matlab y la factorización LU 101/128
A=rand(200,200);
tic
for i=1:1000
b=rand(200,1);
x=A\b;
end
toc
tic
[L U P] = lu(A);
for i=1:1000
b=rand(200,1);
x=U\(L\(P*b));
end
toc
Índice
El problema; consideraciones teóricas
Eliminación de Gauss
Factorización LU
En este caso 2 3 2 3
0 0
u D 4 05 y v D 415 ;
2 0
con lo que la matriz resultante es A uvT .
107/128
Por último,
32 2 3 2 3
1 3=2 7
vT y 2
xDyC T
z D 4 25 C 4 1=25 D 4 45 :
1 v z 1 1=2
2 1=2 0
Refinamiento iterativo 108/128
El vector de residuos debe calcularse con más precisión que la usada para
calcular la solución inicial. Un pequeño código para probar estas ideas:
>> A=hilb(6);
function x = Iter_ref(A,b)
>> x=ones(6,1); b=A*x;
%Refinamiento iterativo con 4 iteraciones.
>> x=Iter_ref(A,b);
[~,n]=size(A); x=inv(A)*b+1e-3*randn(n,1); % ¡OJO! con esto
ans =
[L,U]=lu(A);
0.0019
for k = 1:4
ans =
r = A*x-b;
7.7568e-10
z = -U\(L\r); norm(z)
ans =
x = x+z;
7.0729e-10
end
ans =
end
7.0729e-10
110/128
Este script de Matlab lleva a cabo el proceso a mano.
% Script_Ref.m - Script de Refinamiento Iterativo
n=6;
format short
A=hilb(n); % Matriz de Hilbert (muy mal condicionada)
b=A*ones(n,1); % Elegimos término independiente para sol. x=1.
pause
x=A\b % Solución, evidentemente, =1
Índice
El problema; consideraciones teóricas
Eliminación de Gauss
Factorización LU
Lema Si todas las submatrices principales de una matriz A 2 Rnn son regulares, existen
dos matrices triangulares inferiores unitarias únicas, L y M , y otra diagonal también única,
D D diag.d1 ; : : : ; dn /, tales que A D LDM T .
a11 D d11
a21 D l21d11
a31 D l31d11
2
a22 D l21 d11 C d22
a32 D l31l21d11 C l32d22
2 2
a33 D l31 d11 C l32 d22 C d33:
Generalizando se obtiene el algoritmo de la tabla. 114/128
Una matriz es definida positiva si para todo x ¤ 0 se cumple que x TAx > 0.
Todos sus valores propios son positivos.
Lema Las submatrices principales de una matriz definida positiva son definidas positivas.
Teorema Si A es una matriz simétrica definida positiva de orden n, existe una única
matriz triangular superior, G , con todos sus coeficientes diagonales positivos, tal que A D
GT G.
Factorización de Cholesky A D G T G
for i D 1 to ns
X
i 1
g.i; i/ a.i; i/ g 2 .k; i/
kD1
for j D i C 1 to n
!
X
i 1
g.i; j / a.i; j / g.k; i/g.k; j / g.i; i/
kD1
end
end
function G=Chols_1(A)
% Factorización de Cholesky
n=size(A,1);
for i=1:n, j=i+1:n;
A(i,i)=sqrt(A(i,i));
A(i,j)=A(i,j)/A(i,i);
A(j,j)=A(j,j)-A(i,j)’*A(i,j);
end
G=triu(A);
end
La factorización de
>> A=[5 1 -2 0;1 2 0 0;-2 0 4 1;0 0 1 3];
>> G=Chols_1(A)
G =
2.2361 0.4472 -0.8944 0
2 3
0 1.3416 0.2981 0
0 0 1.7638 0.5669
51 20 >> G’*G
0 0 0 1.6366
4 12 0 05
41 !
ans =
20 5.0000
1.0000
1.0000
2.0000
-2.0000
0
0
0
00 13 -2.0000 0 4.0000 1.0000
0 0 1.0000 3.0000
>> G=chol(A)
G =
2.2361 0.4472 -0.8944 0
0 1.3416 0.2981 0
0 0 1.7638 0.5669
0 0 0 1.6366
Matlab y la factorización de Cholesky 121/128
Para utilizar esta operación con un ejemplo de los que estamos manejando,
habría que hacer algo parecido a lo que sigue.
>> A=[5 1 -2 0;1 2 0 0;-2 0 4 1;0 0 1 3];
>> b=[1;5;14;15];
>> G=chol(A)
G =
2.2361 0.4472 -0.8944 0
0 1.3416 0.2981 0
0 0 1.7638 0.5669
0 0 0 1.6366
>> x=G\(G’\b)
x =
1.0000
2.0000
3.0000
4.0000
122/128
Matrices simétricas semidefinidas positivas
Pivotación
>> [R,G1]=Chol_p(A)
R =
2.2361 -0.8944 0 0.4472
0 1.7889 0.5590 0.2236
0 0 1.6394 -0.0762
0 0 0 1.3207
G1 =
1 0 0 0
0 0 0 1
0 1 0 0
0 0 1 0
>> G1’\(R\(R’\(G1\b)))
ans =
1.0000
2.0000
3.0000
4.0000
Matrices simétricas indefinidas 126/128
PAP T D LBLT
1
El de James R. Bunch y Linda Kaufman, 1977, en alguna de sus variantes, es el más utilizado
por los códigos profesionales y comerciales para factorizar matrices simétricas.
function [L,D,P,rho] = Diagpiv_1(A)
127/128
%DIAGPIV Factorización de Pivotación diagonal con pivotación parcial.
% Matriz de entrada, A (simétrica). Matrices de salida: permutación P,
% triangular inferior unitaria L, D matriz diagonal en bloques 1x1 o 2x2.
% P*A*P’ = L*D*L’.
% Ref. J.R. Bunch and L. Kaufman, Some stable methods for calculating
% inertia and solving symmetric linear systems, Math. Comp. 1977.
if norm(triu(A,1)’-tril(A,-1),1), error(’La matriz A debe ser simétrica.’), end
n = max(size(A)); k = 1; pp = 1:n;
D = eye(n); L = eye(n);
normA = norm(A(:),inf); rho = normA; if s == 1 % Bloque diagonal 1x1
alpha = (1 + sqrt(17))/8; D(k,k) = A(k,k); i = k+1:n;
while k < n A(i,k) = A(i,k)/A(k,k);
[lambda,r] = max( abs(A(k+1:n,k)) ); L(i,k) = A(i,k);
r = r(1) + k; A(i,i) = A(i,i) - A(i,k) * A(k,i);
if lambda > 0 elseif s == 2 % Bloque diagonal 2x2
swap = 0; E = A(k:k+1,k:k+1);
if abs(A(k,k))>=alpha*lambda D(k:k+1,k:k+1) = E;
s = 1; C = A(k+2:n,k:k+1);
else temp = C/E;
temp = A(k:n,r); temp(r-k+1) = 0; L(k+2:n,k:k+1) = temp;
sigma = norm(temp, inf); A(k+2:n,k+2:n) = A(k+2:n,k+2:n) - temp*C’;
if alpha*lambda^2 <= abs(A(k,k))*sigma end
s = 1; if k+s <= n
elseif abs(A(r,r)) >= alpha*sigma rho = max( rho, max(max(abs(A(k+s:n,k+s:n)))) );
swap = 1; end
m1 = k; m2 = r; else % Nada, elemento en diagonal 0
s = 1; s = 1; D(k,k) = A(k,k);
else end
swap = 1; k = k + s;
m1 = k+1; m2 = r; if k == n, D(n,n) = A(n,n); break, end
s = 2; end
end if nargout>=3, P = eye(n); P = P(pp,:); end
end rho = rho/normA;
% ----- end
if swap
A( [m1, m2],: ) = A( [m2, m1],: ); A( :,[m1, m2] ) = A( :,[m2, m1] );
L( [m1, m2],: ) = L( [m2, m1],: ); L( :,[m1, m2] ) = L( :,[m2, m1] );
pp( [m1, m2] ) = pp( [m2, m1] );
end
% -----
Con una matriz de Hankel, Hermann Hankel, Alemania, 1839-1873, funciona así: 128/128
>> A = gallery(’ris’,6)
A =
0.0909 0.1111 0.1429 0.2000 0.3333 1.0000
0.1111 0.1429 0.2000 0.3333 1.0000 -1.0000
0.1429 0.2000 0.3333 1.0000 -1.0000 -0.3333
0.2000 0.3333 1.0000 -1.0000 -0.3333 -0.2000
0.3333 1.0000 -1.0000 -0.3333 -0.2000 -0.1429
1.0000 -1.0000 -0.3333 -0.2000 -0.1429 -0.1111
>> cond(A)
ans =
2.2185
>> [L D P rho]=Diagpiv_1(A)
L =
1.0000 0 0 0 0 0 >> eig(A)
0 1.0000 0 0 0 0
-0.1760 0.2160 1.0000 0 0 0 ans =
-0.3143 0.1714 -1.1905 1.0000 0 0 -1.5708
-0.1048 0.3429 0.2646 -0.6667 1.0000 0
-0.9778 0.2000 -0.6173 0.6222 0 1.0000 -1.5705
D = -1.4438
0.0909 1.0000 0 0 0 0
1.0000 -0.1111 0 0 0 0 0.7080
0 0 -0.9216 0 0 0 1.5622
0 0 0 1.7415 0 0
0 0 0 0 -0.8256 1.9264 1.5708
0 0 0 0 1.9264 0.1284
P =
1 0 0 0 0 0
0 0 0 0 0 1
0 0 0 1 0 0
0 0 1 0 0 0
0 0 0 0 1 0
0 1 0 0 0 0
rho =
1.9264
>> max(max(L*D*L’-P*A*P’))
ans =
1.665334536937735e-016