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).

Author: Jacques Wainer

Created: 2019-04-15 Mon 16:24

Validate