Otimização/Método de gradientes conjugados
Origem: Wikilivros, livros abertos por um mundo aberto.
| Otimização |
Índice |
[editar] Algumas considerações históricas
- Este método foi originalmente proposto por Hestenes e Stiefel, em 1952.
- Seu objetivo inicial foi a resolução de problemas quadráticos sem restrições, mas logo o mesmo foi estendido para casos mais gerais.
[editar] O método
Este método pode ser considerado sob dois pontos de vista:
- Como um método de descida, com busca linear exata;
- Como um método de resolução de sistema linear, baseado em um processo de ortogonalização.
- Definição
Um conjunto não vazio
é dito convexo quando
e
vale
[editar] Exemplos de conjuntos convexos e côncavos
- Definição
Uma função
é dita convexa quando
é convexo e
e
vale
- Definição
Dado um conjunto convexo
, uma função
é dita fortemente convexa quando existe uma constante a > 0 tal que
é convexa.
- Exercício
Verifique que uma função quadrática
é fortemente convexa se existe uma matriz simétrica definida positiva A, um vetor
e um escalar
de modo que
.
| Resolução |
|---|
Sendo uma função quadrática, tem-se . A matriz A pode ser suposta simétrica, pois caso não seja, toma-se (simétrica), e segue (verifique).
Além disso, se f é uma função fortemente convexa, então é estritamente convexa. Como f é duas vezes diferenciável (por ser uma função quadrática), a convexidade estrita implica que |
Nota: Uma matriz é definida positiva se, e somente se, todos os seus autovalores são positivos.
Tem-se:
Sendo
, segue em particular que
e
, onde Λ é uma matriz diagonal cujos elementos da diagonal são os autovalores de A e P é uma matriz onde as colunas são os autovetores correspondentes aos autovalores.
Note que A é uma matriz simétrica, pois é a matriz Hessiana de uma função com segundas derivadas parciais contínuas, e consequentemente vale
.
Para introduzir o método de direções conjugadas, serão consideradas somente funções quadráticas.
Uma condição necessária de primeira ordem para que x seja um ponto de mínimo para a função f é que
. Para o presente caso, a função f é convexa, então, a condição necessária
também é suficiente.
- Exercício
Prove que se A é uma matriz simétrica definida positiva, então
dada por
possui um único ponto de mínimo.
| Resolução |
|---|
Uma vez que A é simétrica definida positiva, a função f é fortemente convexa. Mas toda função fortemente convexa, definida em um conjunto fechado não vazio possui um único minimizador, pois:
Em particular, f possui um único ponto de mínimo. |
No caso de uma função quadrática, tem-se
, ou seja, x é solução do sistema linear Ax = − a.
A resolução de um sistema linear nem sempre pode ser feita numericamente de forma eficiente. Por exemplo, se a matriz do sistema é:
A solução do sistema linear corresponde à interseção entre duas retas quase paralelas, e os erros de truncamento podem causar imprecisão na solução obtida computacionalmente.
Analiticamente, o sistema Ax = − a tem x = − A − 1a como solução. Então alguém poderia se perguntar: qual o problema em resolver esse sistema linear, se basta calcular a inversa da matriz A e multiplicar pelo vetor − a? A resposta é que o calculo da inversa de uma matriz em geral é impraticável computacionalmente, por ter custo muito alto. Por isso, nas situações práticas, onde as matrizes tem ordem bem maior do que 2 (digamos 1000), o cálculo de matrizes inversas não é uma opção.
Assim, com o intuito de desenvolver um método computacional para o cálculo de minimizadores, é preciso utilizar outras técnicas. Considere o seguinte:
Em um método de descida tem-se sempre uma sequencia
, com xk + 1 = xk + tkdk e tk é um minimizador de 
e
Logo, tkAdk = − (Axk + a) e multiplicando por
obtem-se
. Consequentemente, o valor de tk é dado por
Deste modo, o método consistirá de escolher em cada etapa k uma direção dk, e calcular o coeficiente tk pela fórmula anterior, para gerar o próximo ponto xk + 1. Mas como escolher a direção dk?
Dado xk e escolhido dk, defina
como θ(t) = f(xk + tdk), ou seja, θ é a restrição da função f à reta que passa pelo ponto xk e que tem direção dk. Logo, derivando a expressão de θ em relação a t, obtem-se
Então, no ponto de mínimo, xk + 1, tem-se
Ou seja, a direção dk a ser seguida a partir do ponto xk é ortogonal ao gradiente da função f, no ponto xk + 1.
[editar] Esquema do método de descida
Seja
o minimizador da função f. Tem-se
Mas
implica que
, logo
e consequentemente
Donde
. Portanto
.
- Exercício
Provar que se A é uma matriz simétrica, definida positiva, então existe uma matriz simétrica B, de modo que A = B2
| Resolução |
|---|
Sendo uma matriz simétrica, tem-se , com P unitária e
Logo |
Usando o resultado desse exercício, tem-se ainda que 
Fazendo δ = Bd, o método do gradiente conjugado escolhe as direções de descida tais que
. Mas quando
, tem-se na expressão apresentada anteriormente apenas 
Finalmente, tem-se o algoritmo para este método.
[editar] Algoritmo de Hestenes-Stiefel
Primeiro passo: EscolhaSe
, então pare:
Senão:
Calcular
x1 = x0 + t0d0 Passo iterativo k: Dado
Se
, então pare:
Senão:
![]()
xk + 1 = xk + tkdk
Pode-se verificar facilmente que
. De fato, como
, tem-se
. Logo,
.
- Exercício
Provar que se y = Bx então
.
| Resolução |
|---|
| Tem-se
Multiplicando ambos os membros por B, e trocando x1 de lugar com xk + 1 resulta:
ou seja,
somando
Então Sendo a última igualdade devida ao fato de |
[editar] Exemplos
Considere
definida por
. Em outros termos, tomando
, tem-se
, onde
.
Pode-se aplicar o método de direções conjugadas ao seguinte problema
Note, desde já, que o conjunto solução é
.
- Inicio
- Toma-se x0 arbitrário, por exemplo,
. - Avalia-se o gradiente da função f neste ponto inicial:

- Iteração 1
A seguir, verifica-se se o gradiente se anula no novo ponto x1:
Como o gradiente já é nulo, não é preciso fazer a segunda iteração, e o ponto x1 é o (único) minimizador global de f.
Em um caso mais geral, considerando
definida por
, tem-se cálculos muito parecidos em cada passo.
O conjunto solução continua sendo
.
- Inicio
- Considere x0 como no primeiro exemplo, ou seja,
. - Avalia-se o gradiente da função f neste ponto inicial:

- Iteração 1
A seguir, verifica-se se o gradiente se anula no novo ponto x1:
Novamente, o gradiente se anula já na primeira iteração, de modo que x1 é o minimizador global de f.
- Exercício
Seja
uma matriz simétrica definida positiva, cujos autovalores são todos iguais. Então começando de qualquer ponto
, o método fornece xn − 1 como solução.
Um terceiro exemplo pode ser dado tomando
e
definida por
. Observe que tal matriz é simétrica e definida positiva:
- det(A − λI) = (2 − λ)(3 − λ) − 1 = λ2 − 4λ − 3 = (λ − 3)(λ − 1)
Logo, os autovalores de A são λ = 1 e λ = 3. Isso também implica que a função é fortemente convexa.
Aplicando o método:
- Início
- Toma-se um ponto arbitrário no plano, por exemplo
; - Verifica-se se tal ponto é o minimizador global, avaliando nele o gradiente da função:
.
- Já que o gradiente não se anulou no chute inicial, é preciso escolher uma direção e um comprimento de passo para determinar a próxima aproximação:
- Iteração 1


Feitos esses cálculos, o próximo ponto é dado por
Para saber se será necessária uma nova iteração, ou se o minimizador foi encontrado, calcula-se o gradiente da função no ponto:
.
Novamente, será preciso calcular uma nova direção e um novo comprimento de passo:
- Iteração 2

onde β, no algoritmo de Hestenes é dado por:
Portanto
Além disso, o tamanho do passo é dado por
Portanto
Obviamente, este é o minimizador procurado (pois o método tem a propriedade de convergência quadrática, ou seja utiliza no máximo n iterações para chegar a solução quando aplicado a funções quadráticas definidas em
)
- Exercício
Implementar o algoritmo de Hestenes-Stiefel em alguma linguagem de programação, por exemplo em Scilab, ou Matlab.
- Exercício
Seja f um função quadrática fortemente convexa. Verifique as seguintes igualdades:
[editar] Implementação em Scilab
Abaixo é apresentada uma implementação deste algoritmo na linguagem de programação utilizada pelo Scilab.
A = [2 1; 1 2]; function [x] = min_gradiente_conjugado(xk) //Entrada: xk em R^n, qualquer "chute inicial" // Saída: x, o ponto em que f assume o valor mínimo k = 0 //Indica quantos loops já foram feitos epsilon = 0.01 n = size(xk,1) g = df(xk) seq = zeros(n,n+1) seq(:,1) = xk while (norm(g) > epsilon) & (k <= n) if (k == 0) d = -g else d = Hestenes(g,d,A) end t = busca_linear(g,d,A) xk = xk + t*d k = k+1 seq(:,k+1) = xk g = df(xk) end plot(seq(1,:),seq(2,:)) x = xk endfunction function [fu] = f(u) fu=(1/2)*(u'*A*u) endfunction function [grf] = df(u) grf = A*u endfunction function [d] = Hestenes(g,d,A) d=-g + ((g'*A*d)/(d'*A*d))*d endfunction function [t] = busca_linear(g,d,A) t=(g'*g)/(d'*A*d) endfunction
Para facilitar a compreensão do método, pode ser útil exibir as curvas de nível da função. Uma forma de implementar uma função com esse propósito é a seguinte:
function plotar_curvas qtd=101 tam=max(seq) x=linspace(-tam,tam,qtd) y=x z=zeros(qtd,qtd) for i=1:qtd for j=1:qtd z(i,j)=f([x(i);y(j)]) end end contour2d(x,y,z,10) a=gca(); a.x_location = "middle"; a.y_location = "middle"; endfunction
[editar] Algoritmo de Fletcher-Reeves
| Um dos autores deste material sugeriu a adição de uma imagem para ilustrar o método de Fletcher-Reeves. |
Esta versão é na verdade uma extensão do algoritmo anterior, permitindo a aplicação no caso de funções que não são quadráticas.
Primeiro passo: EscolhaSe
, então pare:
Senão:
(como em todo método de descida) Calcular t0, através de uma busca linear x1 = x0 + t0d0 Passo iterativo: Se
, então pare:
Senão:
Calcular tk, através de uma busca linear xk + 1 = xk + tkdk k = k + 1
| Um dos autores deste material sugeriu a adição de uma implementação do algoritmo acima em SciLab. |
[editar] Algoritmo de Polak-Ribière
| Um dos autores deste material sugeriu a adição de uma imagem para ilustrar o método de Fletcher-Reeves. |
Uma outra versão é a seguinte:
Primeiro passo: TomarSe
, então pare:
Senão:
(como em todo método de descida) Calcular t0, através de uma busca linear x1 = x0 + t0d0 k = 1 Passo iterativo: Se
, então pare:
Senão:
Calcular tk, através de uma busca linear xk + 1 = xk + tkdk k = k + 1
| Um dos autores deste material sugeriu a adição de uma implementação do algoritmo acima em SciLab. |
- Exercício
Verificar que, no caso de uma função f quadrática e fortemente convexa, os algoritmos de Hestenes-Stiefel, de Fletcher-Reeves e de Polak-Ribière são os mesmos.
- Exercício
Seja f(x) = e − x + ex. Implemente o método de gradientes conjugados, e utilize o algoritmo para determinar o ponto de mínimo da função f. Note que o espaço é unidimensional, então o método de gradientes conjugados reduz-se ao método dos gradientes, com primeira direção
. Observe ainda que f é uma função coerciva fortemente convexa.
[editar] Algoritmo auxiliar
Para o caso de funções não quadráticas, é preciso usar algum método de busca linear para a implementação do método dos gradientes conjugados, seja a versão de Fletcher-Reeves ou a de Polak-Ribière. Uma possibilidade é a busca de linear de Armijo (ver Izmailov & Solodov (2007), vol 2, pag. 65), cujo algoritmo é esboçado a seguir:
function busca_linear_Armijo (f, theta, alpha, delta, t0) while (alpha * pred > ared) t = d * t end endfunction
com:
- pred = − tθ
- θ(t) = f(x + td)

| Implementar a regra de Armijo e corrigir o esboço acima. |


(simétrica), e segue
(verifique).
é definida positiva.











, com 

Se
, então pare:
Senão:
Calcular
Se
, então pare:
Senão:

,
,
em ambos os lados, segue que
,
para 
















(como em todo método de descida)
Calcular
Calcular
Calcular