MO431A - Tarefa 4 - Versão 2
1 Modificações da versão 1
- função é o negativo da função da versão 1
- o teste de convergência indica é que a razão dos módulos dos vetores
- ponto novo inicial é [0.5, 0.5, 0.5]
- a função line search é mais conveniente para o problema que a mimimize scalar
- use o L-BFGS-B (bounded)
Data limite: Entregue um pdf, via email ou impresso, até as 10h do 17/4
Pode ser feito individualmente ou em duplas.
Nos vamos minimizar a função de 3 dimensões:
\[f(x_1,x_2,x_3) = - [ 100 (x_1 -x_2^2) - (x_1 - 1)^2 + 90 (x_2 - x_3^2) - (x_2 -1)^2] \]
que é parecida com a função de Rosenbrock.
Para alguns casos, precisamos definir os limites dos valores de xi. Se for preciso assuma que -10 ≤ xi ≤ 10
2 Objetivo
Para os algoritmos que serão testados abaixo, imprima o numero de chamadas da função e o numero de chamadas para o gradiente da função.
2.1 Teste de convergência
Todos os métodos abaixo são iterativos e você precisa passar formas do algoritmo parar as iterações. Usaremos o erro relativo do x
\[ tol = \frac{|x_{novo}-x_{velho|}}{|x_{velho|}} \]
Usaremos uma tolerância de 1.0x10-5
3 Algoritmos a serem testados
Os algoritmos abaixo são independentes, cada um valendo 1/6 da nota total.
3.1 Descida do gradiente
A partir do ponto [0.5, 0.5, 0.5] busque a solução de minimização usando descida do gradiente com learning rate de 1.0x10-6
Descida do gradiente não esta implementada na função minimize do scipy
3.2 Descida do gradiente com busca em linha
Implemente a descida do gradiente com busca em linha (procura o mínimo na direção do gradiente). Voce deve usar aa função de busca em linha do scipy line search Pode ser qualquer um dos métodos de busca em linha.
3.3 L-BFGS
Use o L-BFSG-B do minimize.
3.4 Nelder-Mead
Use o Nelder-Mead do minimize. Mas discuta uma inicialização apropriada (o Nelder-Mead precisa de 4 pontos para a inicialização para esse problema de 3 dimensões).
3.5 NEWUOA ou BOBYQA
Utilize ou o NEWUOA ou o BOBYQA para resolver o problema de minimização.
Eu mencionei em aula que o NEWUOA era a ultima versão dos vários algoritmos do Powell de aproximação quadrática. 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 NlOpt ou Py-BOBYQA ou algum outro).
3.6 Descida do gradiente implementado com TensorFlow
Implemente a função acima em TensorFlow, e assim obtenha a função do gradiente por diferenciação automática (tf.gradients ou tf.GradientTape). Voce pode implementar a descida do gradiente no Python veja este site, ou usar a descida do gradiente do próprio TensorFlow (tf.train.GradientDescentOptimizer).