Post on 07-Aug-2018
8/19/2019 Gradiente conjugado
1/24
Gradiente conjugado
Miguel Vargas-Félix
miguelvargas@cimat.mxhttp://www.cimat.mx/~miguelvargas
CIMAT, August 26, 20! /2"
mailto:miguelvargas@cimat.mxhttp://www.cimat.mx/~miguelvargashttp://www.cimat.mx/~miguelvargasmailto:miguelvargas@cimat.mx
8/19/2019 Gradiente conjugado
2/24
M#t$%$ %e gra%ie&te c$&'uga%$
Es un método iterativo para minimizar funciones cuadráticas convexas f :ℝn→ℝ de la forma
f ( x )= 12
xT
A x−xT
b,
donde x ,b∈ℝn y A∈ℝn×n es una matriz simétrica positiva definida
Es un método de descenso de gradiente
Ejemplo para n=2. Descenso de gradiente (izquierda, gradiente conjugado (derec!a
http://www.cimat.mx/~miguelvargas 2/2"
8/19/2019 Gradiente conjugado
3/24
!ara minimizar f ( x ) calculamos primero su gradiente,
∇ f (x )=∇ 12x
TAx−xTb =Ax−b,
"uscamos minimizar, por tanto igualamos a cero
A x=b,es decir, "uscamos resolver un sistema lineal de ecuaciones
El método de descenso de gradiente es:
I&put: A, x#, b, ε" ← #repetir
r" ← b−Ax"
α" ←r" Tr"
r" T
Ar " x" +1 ← x" +α" r" " ← " +1
hasta (ue ‖r " ‖
8/19/2019 Gradiente conjugado
4/24
$i A es simétrica positiva definida, entonces
xTAx > #, para todo x≠0
%s&, podemos a definir un producto interno
〈x , y 〉A = xT
A y
'ecimos (ue un vector x es conjugado a otro vector y con respecto a una matriz A si
〈x , y
〉A=#, con
x ≠ y
)a idea del algoritmo es utilizar direcciones conjugadas para el descenso en la "*s(ueda del punto
+ptimo x, es decir
x=α1p1+α2p2+…+αnpn,
los coeficientes están dados a partir de la com"inaci+n lineal
Ax=α1Ap1+α2Ap2+…+αnApn=b
% partir de una matriz A de rango n s+lo se pueden definir n vectores A-conjugados, por lo tanto
el algoritmo de gradiente conjugado garantiza la o"tenci+n de una soluci+n en un máximo de n
iteraciones
http://www.cimat.mx/~miguelvargas "/2"
8/19/2019 Gradiente conjugado
5/24
'efinamos el residual r" como
r" =Ax" −b, " =1,2,…
la idea es lograr de forma iterativa (ue el residual tienda a ser cero, "uscando cada vez mejores x"
El procedimiento será de forma iterativa, la forma de actualizaci+n será
x" +1=x" +αp" ,
tomando p" como una direcci+n de descenso
El tama.o de paso α" (ue minimiza la funci+n f x ) a lo largo de la direcci+n x" +α" p" esα" =−
r " Tp"
p" TAp"
http://www.cimat.mx/~miguelvargas !/2"
8/19/2019 Gradiente conjugado
6/24
$i definimos p" +1 como la direcci+n más cercana al residual r" "ajo la restricci+n de ser
conjugado
Esta direcci+n está dada por la proyecci+n de r" en el espacio ortogonal a p" con respecto al
producto interno inducido por A, as&
p" +1=−r " +p"
TA r"
p" T
A p" ⏟β"
p"
http://www.cimat.mx/~miguelvargas 6/2"
8/19/2019 Gradiente conjugado
7/24
El algoritmo es el siguiente /0oce# p1#3:
I&put: A, x#, b, ε
r# ← A x#−b p# ← −r#" ← #mie&tras ‖r " ‖>ε
α" ← −r"
Tp"
p" T
A p" x" +1 ← x" +α" p"
r" +1 ← Ax" +1−b
β" +1 ←r" +1TAp"
p" TAp"
p" +1 ← −r" +1+β" +1p" " ← " +1
x# es una coordenada inicial 4puede ser igual a 05
Generalmente no es necesario realizar las n iteraciones, se puede definir la precisi+n deseada
limitando la convergencia con una tolerancia ε
http://www.cimat.mx/~miguelvargas */2"
8/19/2019 Gradiente conjugado
8/24
El algoritmo de gradiente conjugado mejorado es el siguiente /0oce# p1123, con la variaci+n de
utilizar s+lo una multiplicaci+n matriz-vector:
I&put: A, x#, b, ε
r# ← A x#−b
p# ← −r#" ← #
mie&tras ∥r " ∥>εw ← A p"
α"
←r" Tr "
p" Tw
x" +1 ← x" +α" p" r" +1 ← r" +α w
β" +1 ←r" +1
Tr" +1
r" T
r"
p" +1 ← −r" +1+β" +1 p"
" ← " +1
El proceso más lento del algoritmo es la multiplicaci+n matriz-vector
$e puede implementar eficientemente usando almacenamiento con compresi+n por renglones
http://www.cimat.mx/~miguelvargas +/2"
C % -t
8/19/2019 Gradiente conjugado
9/24
C$mpresse% $w -t$rage
El método #ompressed $o% &torage 4compresi+n por renglones5 /$aad#6 p623, se guardan las
entradas no cero de cada rengl+n de A por separado
7 # # # #
# # 1 6 # #
2 # 1 # 8 #
# 9 6 # # 1
# # # # #
7
21 6) "
2 1 )
8!
9 62 )
16
6
V6={2,1,8 }
J6={1,6,}
;on este método, por cada rengl+n de la matriz se guardan dos arreglos para las entradas distintas
de cero de cada rengl+n
8/19/2019 Gradiente conjugado
10/24
Multiplicaci& matri vect$r
En la multiplicaci+n matriz-vector c=Ab el +rden de "*s(ueda es = (1), esto es por(ue no se >aceuna "*s(ueda de las entradas del reng+n, se toman las entradas una tras otra
$ea J i el conjunto de &ndices de las entradas no cero del rengl+n i de A
|Ji| es el n*mero de entradas no cero del rengl+n i de A 0+tese (ue |Vi|=|J i|
c1c2
c6c7c:c
=( 7 # # # #
# # 1 6 # #
2 # 1 # 8 #
# 9 6 # # 1
# # # # # :)(
:
7
#1
2
9)
7 2
1 6) "
2 1 )
8!
9 62 )
16
6
7
#
2
1
9
ci=∑i=1
n
ai j' j
c1
c2
c6
c
c7
c
=
ci=∑" =1
|J i|
Vi" 'Ji"
)a ventaja de utilizar compresi+n por renglones es (ue los datos de cada rengl+n de la matriz de
rigidez son accesados en secuencia uno tras otro, esto producirá una ventaja de acceso al entrar el
"lo(ue de memoria de cada rengl+n en el cac!e del ;!
8/19/2019 Gradiente conjugado
11/24
El pseudoc+digo es:
;onjugateGradient A ,x , b ,ε , stepmaxA= Vi , J i , i=1,2,… , n C- matrix
x∈ℝn
I&itial value
b∈ℝn
ight si%e vect$r
ε∈ℝ T$lera&ce stepmax Maximum &um1er $ steps
r∈ℝn
esi%ual
p∈ℝn
3esce&t %irecti$&
w∈ℝn
esult $ matrix4vect$r
dot(rr ←#for i←1,2,… ,n5 sum←#
5 for " ←1,2,… ,∣Vi∣5 5 j ←J i
"
5 5 sum ← sum+Vi" x j
5 r i ← sum−'i5 pi ←−r i5 dotrr ←dotrr +r i r i
step←#
?>ile ( stepε5 dot(p%←#
5 for i←1,2,… ,n5 5 sum←#
5 5 for " ←1,2,… ,∣Vi∣5 5 5 j ←J i
"
5 5 5 sum ← sum+Vi" p j5 5 %i ← sum
5 5 dotp%←dotp%+ pi %i
5 α← dotrr
dotp%
5 ne%(dot(rr ←#5 for i←1,2,… ,n5 5 xi ← xi +α pi5 5 r i ←r i+α %i5 5 ne%dotrr ← ne%dotrr + r i r i
5 β←
ne%dotrr
dotrr
5 for i←1,2,… ,n5 5 pi ←β pi−r i
5 dot(rr ←ne%(dot(rr 5 step ← step+1
http://www.cimat.mx/~miguelvargas /2"
7 % %i i
8/19/2019 Gradiente conjugado
12/24
7mer$ %e c$&%ici&
El siguiente sistema de ecuaciones /@ind#83, Ax=b1
#1 6# 6# 7##7 122 2#1 21
#1 61 8# 9#
#2 1 1#1 16#
⏟A
x1
x2 x6 x7⏟x
=1#1:
192
297⏟
b1
, tiene soluci+n
x1
x2
x6 x7
=1#1#
1#
1#
,
n+tese (ue
∥b
1∥2=92282672
$i pertur"amos el vector de la derec>a un poco
(#1 6# 6# 7#
#7 122 2#1 21
#1 61 8# 9##2 1 1#1 16#)⏟
A
x1 x2
x6
x7⏟x
=
(1#1−###
+###
192−###297−###)⏟b1+
=
(1##9
#
19192969)⏟b2
, entonces
x1 x2
x6 x7
=
(6:17:
−11##
1#:12# )
,
a>ora ∥b2∥2=9228:61686
http://www.cimat.mx/~miguelvargas 2/2"
$i en vez de pertur"ar el vector de la derec>a pertur"amos la matriz
8/19/2019 Gradiente conjugado
13/24
$i en vez de pertur"ar el vector de la derec>a, pertur"amos la matriz
#1## 6+###: 6### 7###
#7## 122## 2#1## 21##
#1## 61## 8−###: 9###
#2## 1## 1#1## 16−###:
x1
x2
x6
x7
=
1#1
:
192
297
, entonces
x1
x2
x6
x7
=
−672:
11:#
1#:6
#9:8
8/19/2019 Gradiente conjugado
14/24
El n*mero de condici+n ! de una matriz A no singular, para una norma ∥"∥ está dado por
! (A )=∥A∥"∥A−1∥
!ara la norma ∥"∥2,
! (A )=∥A∥"∥A−1∥=#max (A )#min(A )
,
donde # son los valores singulares de la matriz
!ara una matriz A simétrica positiva definida,
! (A )=$max (A )$min (A)
,
donde $ son los eigenvalores de A
%s&, matrices con un n*mero de condici+n cercano a 1 se dicen (ue están "ien condicionadas
Al reducir el número de condición de un sistema, se puede acelerar la velocidad de
convergencia del gradiente conjugado.
http://www.cimat.mx/~miguelvargas "/2"
8ra%ie&te c$&'uga%$ prec$&%ici$&a%$
8/19/2019 Gradiente conjugado
15/24
8ra%ie&te c$&'uga%$ prec$&%ici$&a%$
Entonces, en vez de resolver el pro"lema
Ax−b=#,
se resuelve el pro"lemaM
−1 (A x−b)=#,
con M−1
una matriz cuadrada, la cual reci"e el nom"re de precondicionador
El mejor precondicionador ser&a claro M
−1
=A
−1
, as& x=M
−1
b, y el gradiente conjugadoconvergir&a en un paso
%l igual (ue la matriz A, el precondicionador M−1
tiene (ue ser simétrico positivo definido
Aay dos tipos de precondicionadores, impl&citos M y expl&citos M−1
En algunos casos es costoso calcular M−1
, en general se utilizan precondicionadores con inversas
fáciles de calcular o precondicionadores implicitos (ue se puedan factorizar 4con ;>olesBy, por
ejemplo M=T
5http://www.cimat.mx/~miguelvargas !/2"
El l it l i i t
8/19/2019 Gradiente conjugado
16/24
El algoritmo es el siguiente:
I&put: A, x#, b,ε
r# ← A x#−b
!# ← M−1
r#p# ← −!#" ← #
mie&tras ∥r " ∥>εw ← A p"
α" ← r" T
!" p"
Tw
x" +1 ← x" +α" p" r" +1 ← r" +α w
! " +1 ← M−1r" +1, $r s$lve M !" +1 ← r" +1
β" ←r
" +1
T!
" +1
r " T
!" p" +1 ← −!" +1+β" +1 p" " ← " +1
0+tese (ue a>ora el algoritmo re(uire aplicar el precondicionador en cada paso
http://www.cimat.mx/~miguelvargas 6/2"
8ra%ie&te c$&'uga%$ 9 prec$&%ici$&a%$r ac$1i
8/19/2019 Gradiente conjugado
17/24
8ra%ie&te c$&'uga%$ 9 prec$&%ici$&a%$r ac$1i
El precondicionador Caco"i es el más sencillo, consiste en >acer
M=diag A ),
de esta forma el precondicionador es una matriz diagonal, cuya inversa es fácil de calcular
(M−1)i j={1
Ai isi i= j
# si i≠ j
0o se almacena todo M −1, lo usual es guardar un vector con s+lo los elementos de la diagonal
El pseudoc+digo es
http://www.cimat.mx/~miguelvargas */2"
8/19/2019 Gradiente conjugado
18/24
8/19/2019 Gradiente conjugado
19/24
? .0, .0eB+, 2.0eB+, ).0eB+, ".0eB+, !.0eB+, .0eB+, 2.0eB+, ).0eB+, ".0eB+, !.0eB+D
i&t mai&EF
float sum 0Dfor Eint i 0D i G D 99iF
sum 9 a>i?D
pri&tEH-um .J&H, sumFD
return 0D
// sum2.cpp
float a>? .0eB+, 2.0eB+, ).0eB+, ".0eB+, !.0eB+, .0eB+, 2.0eB+, ).0eB+, ".0eB+, !.0eB+, .0D
int mai&EF
float sum 0D$r Eint i 0D i G D 99iF
sum 9 a>i?D
pri&tEH-um .J&H, sumFD
return 0D
Sum = 1.000000000 Sum = 1.000000358
)as soluci+n exacta es 1######6##
%l calcular los productos punto para el gradiente conjugado se tienen (ue sumar muc>os n*meros
con punto flotantehttp://www.cimat.mx/~miguelvargas /2"
Aay tres soluci+nes para evitar pérdida de informaci+n
8/19/2019 Gradiente conjugado
20/24
. Kr%e&ar l$s &7mer$s a&tes %e sumarl$s
// sum1.cpp
#include Gst%i$.hL
float a>? .0, .0eB+, 2.0eB+, ).0eB+, ".0eB+, !.0eB+, .0eB+, 2.0eB+, ).0eB+, ".0eB+, !.0eB+D
i&t mai&EF
float sum 0Dfor Eint i 0D i G D 99iF
sum 9 a>i?D
pri&tEH-um .J&H, sumFD
return 0D
// sum3.cpp
#include Gst%i$.hL
float a>? .0eB+, .0eB+, 2.0eB+, 2.0eB+, ).0eB+, ).0eB+, ".0eB+, ".0eB+, !.0eB+, !.0eB+, .0D
int mai&EF
float sum 0Dfor Eint i 0D i G D 99iF
sum 9 a>i?D
pri&tEH-um .J&H, sumFD
return 0D
Sum = 1.000000000 Sum = 1.000000358
http://www.cimat.mx/~miguelvargas 20/2"
2. sar tip$s %e pu&t$ l$ta&te mNs gra&%es para acumular la suma
8/19/2019 Gradiente conjugado
21/24
p p g p
// sum1.cpp#include Gst%i$.hL
float a>? .0, .0eB+, 2.0eB+,
).0eB+, ".0eB+, !.0eB+, .0eB+, 2.0eB+, ).0eB+, ".0eB+, !.0eB+D
int mai&EF
float sum 0D
for Eint i 0D i G D 99iF
sum 9 a>i?D
pri&tEH-um .J&H, sumFD
return 0D
// sum4.cpp#include Gst%i$.hL
float a>? .0, .0eB+, 2.0eB+,
).0eB+, ".0eB+, !.0eB+, .0eB+, 2.0eB+, ).0eB+, ".0eB+, !.0eB+D
int mai&EF
double sum 0D
for Eint i 0D i G D 99iF
sum 9 a>i?D
pri&tEH-um .J&H, sumFD
return 0D
Sum = 1.000000000 Sum = 1.000000300
;uando se suman Ddou"les, se puede acumular el resultado utilizando Dlong dou"le
Fué pasa cuando no >ay puntos flotantes de mayor capacidadH
http://www.cimat.mx/~miguelvargas 2/2"
8/19/2019 Gradiente conjugado
22/24
8/19/2019 Gradiente conjugado
23/24
8/19/2019 Gradiente conjugado
24/24
eere&cias
/0oce#3 C 0ocedal, $ C Irig>t 0umerical =ptimization $pringer, 2##
/!iss73 $ !issanetzBy $parse Jatrix Tec>nology %cademic !ress, 197
/$aad#63 K $aad Lterative Jet>ods for $parse )inear $ystems $L%J, 2##6
/@ind#83