3o Exercício de casa - versão 2

Jacques Wainer

Versão 2 - discute os critérios de parada para os algoritmos

data para entrega: até meia note de 23/4 (6a feira)

Nos vamos encontrar o mínimo da função de Himmelblau (de 2 variáveis x e y:

f(x, y) = (x^2+y-11)^2 + (x + y^2 -7)^2

que não é uma função convexa: ela tem 4 mínimos.

Use os seguintes algoritmos de otimização:

Utilize a função minimize do scipy para o conjugado gradiente, BFGS (use o L-BFGS-B) e Nelder-Mead. O minimize não implementa os outros 2 algoritmos (descida do gradiente com busca em linha e NEWOA)

Para cada um dos 5 algoritmos de otimização acima, imprima

Para contar o número de chamadas da função e do gradiente, talvez a forma mais facil é que cada vez que é chamada a função (ou o gradiente) soma um numa variável global.

Discuta rapidamente esses resultados.

1 Conjugado gradiente

Utilize como ponto inicial como (4,4)

Utilize as tolerância default para o critério de parada do CG

2 Descida do gradiente com busca em linha

Utilize como ponto inicial como (4,4)

Para a descida do gradiente com busca em linha, utilize ou a função minimize-scalar ou a função line-search do scipy para fazer a buca em linha.

Eu acho que a função line-search é a mais conveniente. Veja que um dos parametros pk é exatamente a direção para fazer a busca linear (que é -\nabla f(x_i))

Para a descida do gradiente com busca em linha, voce pecisa repetir o loop

até que alguma condição de parada aconteça. User a condição de parada do projeto passado

tol = | f(x_{novo})-f(x_{velho}) | < 1.e-5

3 Nelder-Mead

Inicialize com o triangulo inicial em (-4,-4) (-4,1),(4,-1)

Utilize as tolerância default para o critério de parada do Nelder-Mead

4 BFGS

Inicialize com ponto inicial em (4,4)

Rode o BFGS tanto passando a função do gradiente (tarefa 41,) como sem a função do gadiente (tarefa 4.2)

No caso do BFGS sem gradiente o algoritmo vai aproximar o gradiente usando diferenças - da mesma forma que ele aproxima o inverso do Hessiano.

Utilize as tolerância default para o critério de parada do L-BFGS-B

5 NEWOA ou BOBYQA

O NEWUOA é um algoritmo da família de otimização sem gradiente de Powell. . Algum site menciona que a ultima versão é o BOBYQA. Mas note que o NEWUOA é para problemas Unconstained (sem restrição), e o BOBYQA é para Bounded (boxed). Nenhuma das duas versões estão no scipy.minimize - voce terá que instalar algum pacote extra para usa-los (por exemplo NlOpy ou Py-BOBYQA ou algum outro).

O BOBYQA do Py-BOBYQA precisa de um ponto inicial (não sei porque) Neste caso use o (4,4) como ponto inicial.)

Use os valores default para tolerância e outros parâmetros.