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.
Utilize como ponto inicial como (4,4)
Utilize as tolerância default para o critério de parada do CG
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
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
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
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.