Método do Gradiente e Gradientes Conjugados

Uma outra classe de métodos que permite a resolução numérica de equações é a classe dos métodos de optimização.
Considerando uma equação da forma f(x)=0, é claro que f(x)=0 sse f(x)f(x)=0.
Ora, os pontos z que verificam a equação equivalente f(z)2=0 são também os pontos de mínimo absoluto da função f 2, que é não negativa.
Ou seja, se existirem, os zeros de f são os pontos de mínimo absoluto de f 2.
De forma semelhante, no caso de funções com várias variáveis, usando a norma euclidiana, obtemos:

F(x)= 0 <=> ||F(x)||2=0 <=> F(x). F(x)=0

e, se existirem, as soluções de F(x)= 0 são os pontos de mínimo absoluto de f(x)= F(x). F(x).

Portanto, podemos utilizar métodos de optimização para a resolução de equações ou sistemas de equações. Sabemos que quando as funções são regulares, um ponto de mínimo relativo é um ponto crítico, que anula a derivada, ou o gradiente. Assim, por outro lado, os métodos para a resolução de equações, também são usados como métodos de optimização. No entanto, há outros métodos específicos para os problemas optimização. Iremos ver (brevemente) o método do gradiente e o método do gradiente conjugado, aplicados à resolução de alguns sistemas.


Seja A uma matriz simétrica e definida positiva, e consideremos uma forma quadrática auxiliar:

f(x)= (1/2) xTAx -bTx + c,

que transforma vectores em números reais. Como a forma é quadrática, há apenas um vector que minimiza f e é exactamente o ponto crítico, solução de

f(x)=0, e neste caso, f(x) = (1/2)(AT+A)x-b = Ax -b.

Assim, se encontrarmos o ponto de mínimo, ele será solução do sistema linear Ax = b.

Consideramos métodos iterativos de optimização do tipo

x(n+1) = x(n)+ an r(n) ,

de forma a que haja uma descida, ou seja, f (x(n+1) ) < f (x(n) ). O vector r(n) define a direcção de descida.



Método do Gradiente
No caso do método do gradiente (ou declive máximo - steepest descent), a direcção de descida escolhida é

r(n) = -f(x(n)) = b - Ax(n) ,

que neste caso de sistemas lineares é também designado por resíduo.
Resta encontrar o valor an que minimiza f, de entre os possíveis valores  x(n)+ ar(n). Encontramos o ponto de mínimo, derivando f (nesses pontos) em ordem a a, ou seja,

d/da  f (x(n)+ ar(n)) = f(x(n)+ ar(n)) . r(n)
= (b - A(x(n)+ar(n))). r(n)
= (b - Ax(n)). r(n)-aAr(n). r(n)
r(n). r(n)-aAr(n). r(n).

Assim, o valor mínimo an será obtido com o zero da derivada,

r(n). r(n)-anAr(n). r(n) = 0   <=> an = r(n). r(n)/(Ar(n). r(n)).

Em conclusão, dado um vector inicial x(0), o método do gradiente resume-se à iteração
 

x(n+1) = x(n)
r(n). r(n)
r(n). Ar(n)
 r(n),    com   r(n)b - Ax(n).

Um critério de paragem consiste em exigir que || r(n)||2 = r(n). r(n) < e, com e pequeno,
notando que isso implica que Ax(n) é próximo de b.

Observação: Aqui o método do gradiente está aplicado ao caso de sistemas lineares, em que a função f é apenas auxiliar, nem tão pouco aparece na expressão do método. No entanto, este método pode ser utilizado para minimizar funções diferenciáveis, nesse caso mais geral, r(n) = -f(x(n)).



Método das Direcções Conjugadas
Começamos por definir direcções conjugadas.
Como assumimos que a matriz A é definida positiva, há um produto interno associado a essa matriz
<u,v>A= u . Av = uTAv.

Com este produto interno, dois vectores dizem-se A-ortogonais se <u,v>A= u . Av = 0, como sinónimo diz-se que as direcções u e v são conjugadas.

Seja N a dimensão da matriz A e sejam d(0), ..., d(N-1) direcções conjugadas, que constituem uma base A-ortogonal em RN.

Se considerarmos d(n) como direcções de descida, temos a iteração

x(n+1) = x(n)+ an d(n) ,
e queremos agora encontrar o valor an que minimiza f, de entre os possíveis valores  x(n)+ ad(n).

De forma, semelhante, podemos obter

d/da  f (x(n)+ ad(n)) =  r(n). d(n)-aAd(n). d(n),
e assim an = r(n). d(n)/(d(n) . Ad(n)), com   r(n)b - Ax(n).

Obtemos de forma genérica, um método de direcções conjugadas:
 

x(n+1) = x(n)
r(n). d(n)
d(n). Ad(n)
 d(n)
mas ainda não definimos as direcções d(n), apenas assumimos que existiam a priori, e eram conjugadas.

Teorema: Um método de direcções conjugadas atinge a solução ao fim de N iterações.
Demonstração:
Consideremos o erro na iterada n, definido por e(n)= x - x(n).
Reparamos que

e(n+1) = e(n)
r(n). d(n)
d(n). Ad(n)
 d(n)
e mantendo a notação an = r(n). d(n) / (d(n). Ad(n)), podemos escrever recursivamente e(N),

e(N) = e(N-1)-aN-1 d(N-1)  = ... = e(0) - aN-1 d(N-1) - ... - a0 d(0)

Por outro lado, podemos escrever e(0) na base A-ortogonal d(0), ..., d(N-1)  através das projecções A-ortogonais

e(0) = PN-1 d(N-1) + ... + P0 d(0)

em que Pn é a projecção A-ortogonal de e(0) na direcção d(n), ou seja

Pn = < e(0), d(n) >A / < d(n), d(n) >A =  (e(0). Ad(n) ) / (d(n). Ad(n) ).

Portanto, basta agora ver que para cada n temos Pn = an , para concluir que e(N) = 0, ou seja que x(N) é a solução exacta.
De facto, atendendo às expressões de Pn  e de an basta ver que r(n). d(n) = e(0). Ad(n) .
Ora, Ae(n) = Ax-Ax(n) = b-Ax(n) = r(n) , portanto

d(n). r(n) = d(n). Ae(n) d(n). A(e(0) - an-1 d(n-1) - ... - a0 d(0))
= d(n). Ae(0) - an-1d(n). Ad(n-1) - ... - a0 d(n). Ad(0)
= d(n).Ae(0) - 0 - ... - 0,
porque d(n-1), ..., d(0) são A-ortogonais a d(n).

Método dos Gradientes Conjugados
Consideramos agora o caso particular do método das direcções conjugadas, em que elas são obtidas através do gradiente.
Recordamos que no caso linear o gradiente é dado pelo resíduo r(n)b - Ax(n).
Através de um processo de ortogonalização (ou melhor, A-ortogonalização) de Gram-Schmidt, através dos sucessivos resíduos (gradientes) podemos construir as direcções d(n) que serão conjugadas (A-ortogonais).
Assim, podemos resumir o Método dos Gradientes Conjugados,

1º)  Dado x(0) definimos d(0) = r(0) = b-Ax(0) ,

2º)  Definimos x(n+1) = x(n)+ an d(n) , com an r(n). d(n) / (d(n). Ad(n))

3º)  Definimos r(n+1) = r(n) - an Ad(n) , e d(n+1) = r(n+1) + bn d(n), com bn r(n+1). r(n+1) / (r(n). r(n))

4º)  Regressamos ao 2º passo, até que sejam efectuados N passos.

Nota: Apesar de termos demonstrado que o método atinge a solução exacta ao fim de N passos, um mau condicionamento da matriz poderá impedir que a solução seja efectivamente obtida. Nesse caso há que utilizar um critério de paragem, p.ex: exigindo que o resíduo seja suficientemente pequeno.

Observação: De forma alternativa, mas menos eficiente, podemos escrever o método na forma equivalente:
1º)  É dado x(0) .
2º)  Definimos

r(n) = b - Ax(n)
se  n=0, d(0) = r(0),
se  n>0, d(n) = r(n) + (r(n).r(n))/(r(n-1).r(n-1))d(n-1),
x(n+1) = x(n) + (r(n).r(n))/(d(n). Ad(n))d(n)
3º)  Regressamos ao 2º passo (até que sejam efectuados N passos).

Apesar de ser equivalente, neste caso aparecem dois produtos pela matriz A, mais concretamente Ax(n) e Ad(n), o que implica um maior número de operações. Por isso é preferível utilizar o algoritmo anterior, onde aparece apenas um produto, o Ad(n).