Você está na página 1de 15

André Augusto Precioso Marçal

Lucas José Ferreira

TRABALHO DE OTIMIZAÇÃO NÃO LINEAR


RESOLUÇÃO DE EXERCÍCIOS DO CAPÍTULO 6

São José do Rio Preto


2019
6.5. Use a Rotina 6.6 e sua variante com busca de Armijo para minimizar a função
0,5
( )
Freudenstein e Roth, numerada como (2) em [34] a partir do ponto x 0=
−1
e compare o
número de iterações gasto por cada método para resolver o problema. Considere os
parâmetros Ɛ=10-3 e kmax = 1000
Resolução: Funções utilizadas: froth.m, mgh.m, aurea.m, armijo.m, grad_aurea, grad_armijo.
Na janela de comandos, escreva:
global FUNC mm
FUNC=’froth’
mm=2
fun=’mgh’
x0=[0.5;-1]
epsl=1e-3
kmax=1000
grad_aurea
gama=0.7
eta=0.45
grad_armijo
Utilizamos primeiramente o método do gradiente com seção áurea para minimizar a
função Freudenstein e Roth. O problema é resolvido em 949 iterações. As figuras 1 e 2
mostram os gráficos gerados pelo algoritmo, com variação da função e da norma do gradiente,
ao longo das iterações.
Figura 1: Variação da função.

Figura 2: Variação da norma do gradiente.

Agora, utilizando do método do gradiente com Armijo, realizamos o mesmo processo


para minimizar a função Freudenstein e Roth no mesmo ponto de partida e considerando os
mesmos parâmetros, para que possamos relacionar um método com o outro. Foram realizadas
um total de 207 iterações. As figuras 3 e 4 também mostram os gráficos gerados pelo
algoritmo, com variação da função e da norma do gradiente, ao longo das iterações.

Figura 3: Variação da função.


Figura 4: Variação da norma do gradiente.
Ao compararmos os resultados, podemos ver que o método de busca de Armijo resolveu o
problema com menos iterações, algo que neste caso, haveria uma economia significante visto
que cada iteração na busca exata pode ser muito mais cara.

6.6. Use a Rotina 6.6 e sua variante com busca de Armijo para minimizar a função do
1
Exemplo 6.1 a partir do novo ponto x 0=() 2
e compare o número de iterações, de avaliações de
funçãoo e o tempo gasto por cada método para resolver o problema.
Resolução:
Funções utilizadas: armijo.m, aurea.m, grad_aurea.m, grad_armijo.m, exquad.
Na janela de comandos, escreva:
fun=’exquad’
epsl=1e-5
kmax=1000
x0=[1;2]
grad_aurea
gama=0.7
eta=0.45
grad_armijo
Pelo método do gradiente com tamanho de passo obtido pelo algoritmo da seção Áurea, o
problema é resolvido em 4.7483s com 5 iterações, na Tabela 1 abaixo podemos ver os valores da
função e da norma do gradiente calculados em cada iteração. As figuras 5 e 6 mostram os
gráficos gerados pelo algoritmo, com variação da função e da norma do gradiente, ao longo das
iterações.

Áurea
k f norm(g)
0 33.000.000 29.732.137
1 0.021607 0.160609
2 0.000032 0.029354
3 0.000000 0.000239
4 0.000000 0.000053
5 0.000000 0.000001

Tabela 1: Valores da função e norma do gradiente.

Figura 5: Variação da função.


Figura 6: Variação da norma do gradiente.

Depois, resolvendo o mesmo problema utilizando o método do gradiente, com


tamanho de passo pelo algoritmo de Armijo, chegamos na solução em 4.6876s com 48
iterações, a Tabela 2 abaixo expressa os valores da função e da norma do gradiente calculados
em cada iteração. As figuras 7 e 8 mostram os gráficos gerados pelo algoritmo, com variação
da função e da norma do gradiente, ao longo das iterações.

Armijo
nor
k f m(g
)
33.0 29.7
0 00.0 32.1
00 37
1.72 6.76
1 6.34 1.04
7 2
0.10 1.54
2 865 4.56
5 1
0.01 0.21
3 955 828
1 4
0.01 0.16
4 639 632
7 3
5 0.01 0.23
335 609
6 9
0.01 0.11
6 068 483
7 3
0.00 0.26
7 431 668
0 1
0.00 0.05
8 159 114
6 2
0.00 0.07
9 128 095
7 1
0.00 0.03
10 104 579
2 5
0.00 0.07
11 039 918
5 2
0.00 0.01
12 015 574
5 3
0.00 0.02
13 012 134
4 5
0.00 0.01
14 010 115
2 9
0.00 0.02
15 003 351
6 5
0.00 0.00
16 001 485
5 1
0.00 0.00
17 001 642
2 8
0.00 0.00
18 001 348
0 0
0.00 0.00
19 000 698
3 4
0.00 0.00
20 000 149
1 6
0.00 0.00
21 000 193
1 8
22 0.00 0.00
000 138
1 8
0.00 0.00
23 000 147
1 9
0.00 0.00
24 000 109
1 6
0.00 0.00
25 000 114
1 0
0.00 0.00
26 000 087
0 4
0.00 0.00
27 000 122
0 7
0.00 0.00
28 000 060
0 8
0.00 0.00
29 000 137
0 7
0.00 0.00
30 000 026
0 9
0.00 0.00
31 000 036
0 9
0.00 0.00
32 000 018
0 9
0.00 0.00
33 000 040
0 9
0.00 0.00
34 000 008
0 3
0.00 0.00
35 000 011
0 1
0.00 0.00
36 000 005
0 9
0.00 0.00
37 000 012
0 1
0.00 0.00
38 000 002
0 6
39 0.00 0.00
000 003
0 3
0.00 0.00
40 000 002
0 4
0.00 0.00
41 000 002
0 5
0.00 0.00
42 000 001
0 9
0.00 0.00
43 000 002
0 0
0.00 0.00
44 000 001
0 5
0.00 0.00
45 000 002
0 1
0.00 0.00
46 000 001
0 0
0.00 0.00
47 000 002
0 4
0.00 0.00
48 000 000
0 5

Tabela 2: Valores da função e norma do gradiente.


Figura 7: Variação da função.

Figura 8: Variação da norma do gradiente.

Comparando os resultados obtidos, observamos que o método do gradiente com busca


exata resolve o problema em menos iterações, 5 contra 48 iterações na busca de Armijo, porém o
utilizando busca de Armijo o tempo foi menor, 4.6876s contra 4.7483s na busca por Áurea, ou
seja, mesmo tendo resolvido em mais iterações o tempo de cada iteração é muito menor do que
na busca por Áurea, isso não levando em conta o custo de cada iteração, podendo ser mais cara
na busca exata do que na inexata.

1
()
6.7. Use a rotina 6.6 para minimizar a quadrática dada por (6.1) a partir do ponto x 0= .
1

Considere primeiro A= (10 02) e depois A=(10 0


500). Compare o número de iterações para
resolver cada problema.
Resolução: Funções utilizadas: aurea.m, grad_aurea.m, quadrática.m.
Na janela de comandos, escreva:
global A
A=[1,0;0,2]
fun='quadratica'
x0=[1;1]
epsl=1e-5
kmax=1000
grad_aurea
A=[1,0;0,500]
grad_aurea

Resolvendo o problema com o método do gradiente com busca Áurea para a matriz A1
1 0
= ( )
0 2
, obtemos o resultado em 4.8909s com 10 iterações. Segue abaixo os valores
calculados em cada iteração na Tabela 3.
Matriz A1
nor
k f m(g
)
1.50 2.23
0 0.00 6.06
0 8
0.11 0.49
1 111 690
1 2
0.00 0.16
2 823 563
0 2
0.00 0.03
3 061 680
0 6
0.00 0.01
4 004 226
5 9
0.00 0.00
5 000 272
3 6
0.00 0.00
6 000 090
0 9
0.00 0.00
7 000 020
0 2
0.00 0.00
8 000 006
0 7
0.00 0.00
9 000 001
0 5
10 0.00 0.00
000 000
0 5
Tabela 3: Valores da função e da norma do gradiente.
As figuras 9 e 10 mostram os gráficos gerados pelo algoritmo, com variação da função e
da norma do gradiente, ao longo das iterações.

Figura 9: Variação da função.

Figura 10: Variação da norma do gradiente.


Agora, resolvendo o mesmo problema mudando apenas a matriz para A2 =
0
500 (10
, )
obtemos a solução em 8.5456s com 863 iterações. Observe abaixo na Tabela 4 os dados
calculados em algumas iterações.

Matriz A2
K f norm(g)
0 250.500.000 500.001.000
1 0.498091 1.041.073
2 0.485013 3.421.105
3 0.472279 1.012.894
4 0.459665 3.361.917
5 0.447389 0.986668
6 0.435642 3.242.451
7 0.424204 0.959961
8 0.412875 3.186.354
9 0.401847 0.935106
10 0.391298 3.072.768
100 0.034954 0.926645
200 0.002387 0.242077
300 0.000163 0.063258
400 0.000011 0.016534
500 0.000001 0.004322
600 0.000000 0.001130
700 0.000000 0.000295
800 0.000000 0.000077
863 0.000000 0.000010
Tabela 4: Valores da função e da norma do gradiente.

As figuras 11 e 12 mostram os gráficos gerados pelo algoritmo, com variação da função e


da norma do gradiente, ao longo das iterações.
Figura 11: Variação da função.

Figura 12: Variação da norma do gradiente.

Comparando os resultados obtidos, observamos que o problema resolvido com a matriz A1


utiliza 10 iterações para achar a solução, já o mesmo problema com a matriz A2 a solução é
calculada com 863 iterações. Desse modo, podemos concluir que na mudança da matriz A, há
alterações no número de iterações.

6.12. Implemente o método do gradiente com busca exata para minimizar a quadrática (6.1),
com a matriz A∈ Rnxn obtida pela Rotina 6.2, a partir de um ponto x 0∈ Rn arbitrário. Considere 𝜆1
= 1 e 𝜆2 = 20. Note que neste caso o tamanho do passo pode ser calculado diretamente pela
fórmula (5.4). Teste o algoritmo implementando com diferentes valores de n e compare o tempo
computacional com o tempo gasto ao se utilizar a Rotina 6.6.
Resolução: Funções utilizadas: quadratica.m, matriz_simetrica.m, vetor_arb.m, aurea.m,
grad_exata_sg.m, grad_aurea_sg.
Na janela de comandos, escreva:
fun=’quadratica’
global A
A=matriz_simetrica(n,1,20) (n é a ordem da matriz)
global x0
x0=vetor_arb(n,1)
epsl=1e-5
kmax=1000
grad_exata_sg
grad_aurea_sg
Após compararmos o tempo gasto para n=2, o processo foi novamente feito para outros
valores de n, onde foram gerados uma nova matriz simétrica aleatória e outro vetor aleatório e
analisados o tempo gasto da solução pelo método do gradiente com busca exata e pelo método
do gradiente com seção Áurea conforme a Tabela 5 abaixo.
  Tempo gasto (s)
n Exata Áurea
2 0.00091600 0.010237
3 0.0074100 0.12179
4 0.011092 0.11700
5 0.0075810 0.14663
6 0.016723 0.15645
7 0.0064960 0.13144
8 0.013363 0.13047
9 0.0069849 0.14091
10 0.0074379 0.15042
20 0.0067189 0.13503
100 0.025747 0.43142
500 0.039103 0.44911
1000 0.19915 3.1301
5000 4.6545 74.547
Tabela 5: Tempo gasto em segundos pelo método do gradiente com seção Áurea e com busca
exata.
Podemos ver que não há diferença no número de iterações em ambos os métodos, porém, o
problema é solucionado mais rápido ao utilizarmos busca exata. Não há muita discrepância entre
o tempo gasto com valores de n baixos, contudo ao utilizar valores altos para n, essa diferença
aumenta, como podemos ver para n = 5000, onde a diferença chega a ser, aproximadamente, de
70s.
Observação: foi utilizado o programa GNU Octave-5.1.0.0 para resolução dos exercícios
acima.
Referências: http://en.pudn.com/Download/item/id/740271.html

Você também pode gostar