Gradiente Conjugado
Gradiente Conjugado
Gradiente Conjugado
Miguel Vargas-Flix
[email protected]
http://www.cimat.mx/~miguelvargas
CIMAT, August 26, 2015
1/24
2/24
f ( x )=
1 T
x A xxT b =A xb,
2
k 0
repetir
r k bA x k
T
rk rk
k T
rk A rk
x k +1 x k + k r k
k k +1
hasta que r k<
x0 es una coordenada inicial.
http://www.cimat.mx/~miguelvargas
3/24
x , y A = x T A y.
Decimos que un vector x es conjugado a otro vector y con respecto a una matriz A si
x , y A =0, con x y.
La idea del algoritmo es utilizar direcciones conjugadas para el descenso en la bsqueda del punto
*
ptimo x , es decir
*
x =1 p1 + 2 p2 ++ n p n,
los coeficientes estn dados a partir de la combinacin lineal
*
A x =1 A p1 +2 A p 2 ++ n A pn =b.
A partir de una matriz A de rango n slo se pueden definir n vectores A-conjugados, por lo tanto
el algoritmo de gradiente conjugado garantiza la obtencin de una solucin en un mximo de n
iteraciones.
http://www.cimat.mx/~miguelvargas
4/24
r k =A xk b, k =1, 2,
la idea es lograr de forma iterativa que el residual tienda a ser cero, buscando cada vez mejores x k .
El procedimiento ser de forma iterativa, la forma de actualizacin ser
x k +1 =x k + p k ,
tomando p k como una direccin de descenso.
El tamao de paso k que minimiza la funcin f ( x ) a lo largo de la direccin x k + k p k es
T
r k pk
.
k = T
pk A pk
http://www.cimat.mx/~miguelvargas
5/24
http://www.cimat.mx/~miguelvargas
6/24
r 0 A x0 b
p0 r 0
k 0
mientras r k>
T
r k pk
k T
pk A pk
x k +1 x k + k p k
r k +1 A x k +1b
T
r k +1 A pk
k +1
pTk A p k
p k +1 r k +1 +k +1 p k
k k +1
x0 es una coordenada inicial (puede ser igual a 0).
Generalmente no es necesario realizar las n iteraciones, se puede definir la precisin deseada
limitando la convergencia con una tolerancia .
http://www.cimat.mx/~miguelvargas
7/24
r 0 A x0 b
p0 r 0
k 0
mientras r k>
w A pk
T
rk r k
k T
pk w
x k +1 x k + k p k
r k +1 r k + w
T
r k +1 r k +1
k +1
r Tk r k
p k +1 r k +1 +k +1 p k
k k +1
El proceso ms lento del algoritmo es la multiplicacin matriz-vector.
Se puede implementar eficientemente usando almacenamiento con compresin por renglones.
http://www.cimat.mx/~miguelvargas
8/24
8
0
2
0
0
4
0
0
9
0
0
1
1
3
0
0
3
0
0
0
0
0
7
0
0
0
0
0
1
5
1 2
1 3
3 4
2 1 7
1 3 5
9 3 1
V 3= { 2, 1, 7 }
J 3= {1, 3, 5 }
2 3 6
5
6
Con este mtodo, por cada rengln de la matriz se guardan dos arreglos para las entradas distintas
de cero de cada rengln. Un vector J i conteniendo los ndices y otro V i los valores, con i=1,, m.
Este esquema es adecuado cuando todos (o casi todos) los renglones tienen al menos una entrada
distinta de cero.
Este tipo de esquema se puede crear utilizando un vector de vectores.
http://www.cimat.mx/~miguelvargas
9/24
|Ji| es el nmero de entradas no cero del rengln i de A. Ntese que |Vi|=|J i|.
(( )
c1
8 4
c2
0 0
c3
= 2 0
c4
0 9
c5
0 0
c6
0
1
1
3
0
0
3
0
0
0
ci = ai j b j
i =1
0
0
7
0
0
0
0
0
1
5
)( )
5
4
0
1
2
9
8 4
1 2
c1
c2
c3
c4
c5
c6
1 3
5
4
0
1
2
9
3 4
2 1 7
1 3 5
9 3 1
2 3 6
5
6
|J i|
ci = Vik b J
k =1
k
i
La ventaja de utilizar compresin por renglones es que los datos de cada rengln de la matriz de
rigidez son accesados en secuencia uno tras otro, esto producir una ventaja de acceso al entrar el
bloque de memoria de cada rengln en el cache del CPU.
http://www.cimat.mx/~miguelvargas
10/24
El pseudocdigo es:
ConjugateGradient ( A , x , b , , step max )
A=( Vi , J i ), i=1, 2, , n CRS matrix
n
x Initial value
n
b Right side vector
Tolerance
step max Maximum number of steps
n
r Residual
n
p Descent direction
n
w Result of matrix*vector
http://www.cimat.mx/~miguelvargas
j J i
k
sum sum+V i p j
w i sum
dot_pw dot_pw + p i w i
dot_rr 0
for i1, 2, , n
sum 0
for k 1, 2, ,V i
k
j J i
k
sum sum+V i x j
r i sumb i
pi r i
dot_rr dot_rr +r i r i
step 0
while ( step< stepmax ) and
dot_pw 0
for i1, 2, , n
sum 0
for k 1, 2, ,V i
dot_rr
dot_pw
new_dot_rr 0
for i1, 2, , n
x i x i + pi
r i r i + w i
new_dot_rr new_dot_rr+ r i r i
new_dot_rr
dot_rr
for i1, 2, , n
pi p i r i
( dot_rr> )
dot_rr new_dot_rr
step step+1
11/24
Nmero de condicin
El siguiente sistema de ecuaciones [Kind07], A x=b1
)( ) ( )
x1
10.1
x2
58.8
, tiene solucin
=
19.2
x3
29.4
x4
( )( )
x1
1.0
x2
1.0
,
=
1.0
x3
1.0
x4
b1
)( ) ( ) ( ) ( ) ( )
b1 +
x1
351.45
x2
11.00
,
=
1.05
x3
1.20
x4
b2
12/24
0.100 3+0.005
3.000
4.000
0.400 12.200
20.100
26.100
0.100 3.100
70.005
9.000
0.200 6.100
10.100 130.005
)( ) ( ) ( ) ( )
x1
10.1
x2
58.8
, entonces
=
19.2
x3
29.4
x4
x1
3.425
x2
1.150
.
=
1.053
x3
0.957
x4
http://www.cimat.mx/~miguelvargas
13/24
El nmero de condicin de una matriz A no singular, para una norma est dado por
( A )=AA1.
Para la norma 2,
max ( A )
( A )=AA =
,
min ( A )
1
14/24
M ( A xb )=0,
1
con M
15/24
El algoritmo es el siguiente:
Input: A , x 0, b,
r 0 A x0 b
1
q0 M r0
p0 q 0
k 0
mientras r k>
w A pk
T
rk qk
k T
pk w
x k +1 x k + k p k
r k +1 r k + w
1
q k +1 M r k +1, or solve M q k + 1 r k +1
T
r k +1 q k +1
k
r Tk q k
p k +1 q k +1 +k +1 p k
k k +1
Ntese que ahora el algoritmo require aplicar el precondicionador en cada paso.
http://www.cimat.mx/~miguelvargas
16/24
M=diag ( A ),
de esta forma el precondicionador es una matriz diagonal, cuya inversa es fcil de calcular
1
( M1)i j = Ai i
0
si i= j
si i j
No se almacena todo M 1, lo usual es guardar un vector con slo los elementos de la diagonal.
El pseudocdigo es...
http://www.cimat.mx/~miguelvargas
17/24
r Residual
p n Descent direction
n
M Preconditioner stored as vector
n
q Applied preconditioner
wn Result of matrix*vector
dot_rr 0
dot_rq0
for i1, 2, , n
sum 0
for k 1, 2, ,V i
k
j J i
k
sum sum+V i x j
r i sumb i
M i Ai i
qi r i / M i
pi q i
dot_rr dot_rr +r i r i
dot_rq dot_rq+r i qi
http://www.cimat.mx/~miguelvargas
step 0
while ( step< stepmax ) and ( dot_rr> )
dot_pw 0
for i1, 2, , n
sum 0
for k 1, 2, ,V i
k
j J i
k
sum sum+V i p j
w i sum
dot_pw dot_pw + p i w i
dot_rq
dot_pw
new_dot_rr 0
new_dot_rq0
for i1, 2, , n
x i x i + pi
r i r i + w i
qi r i / M i
new_dot_rr new_dot_rr+ r i r i
new_dot_rqnew_dot_rq +r i q i
new_dot_rq
dot_rq
for i1, 2, , n
pi p i qi
dot_rr new_dot_rr
dot_rq new_dot_rq
step step+1
18/24
// sum2.cpp
int main()
{
float sum = 0;
for (int i = 0; i < 11; ++i)
sum += a[i];
int main()
{
float sum = 0;
for (int i = 0; i < 11; ++i)
sum += a[i];
return 0;
return 0;
}
Sum = 1.000000000
}
Sum = 1.000000358
19/24
// sum3.cpp
#include <stdio.h>
int main()
{
float sum = 0;
for (int i = 0; i < 11; ++i)
sum += a[i];
int main()
{
float sum = 0;
for (int i = 0; i < 11; ++i)
sum += a[i];
return 0;
return 0;
}
Sum = 1.000000000
http://www.cimat.mx/~miguelvargas
}
Sum = 1.000000358
20/24
// sum4.cpp
#include <stdio.h>
int main()
{
float sum = 0;
for (int i = 0; i < 11; ++i)
{
sum += a[i];
}
int main()
{
double sum = 0;
for (int i = 0; i < 11; ++i)
{
sum += a[i];
}
return 0;
return 0;
}
Sum = 1.000000000
}
Sum = 1.000000300
21/24
http://en.wikipedia.org/wiki/Kahan_summation_algorithm
22/24
Preguntas?
http://www.cimat.mx/~miguelvargas
23/24
Referencias
[Noce06] J. Nocedal, S. J. Wright. Numerical Optimization. Springer, 2006.
[Piss84] S. Pissanetzky. Sparse Matrix Technology. Academic Press, 1984.
[Saad03] Y. Saad. Iterative Methods for Sparse Linear Systems. SIAM, 2003.
[Kind07] U. Kindeln. Resolucin de sistemas lineales de ecuaciones: Mtodo del gradiente
conjugado. Universidad Politcnica de Madrid. 2007
[Gold91] D. Goldberg. What Every Computer Scientist Should Know About Floating-Point
Arithmetic. Computing Surveys. Association for Computing Machinery. 1991.
http://www.cimat.mx/~miguelvargas
24/24