Beruflich Dokumente
Kultur Dokumente
COPPE/UFRJ
TRABALHO 2
Alunos:
Professor:
RIO DE JANEIRO
2017
Sumário
1 Introdução 1
2 Métodos Numéricos 3
2.1 Método do Gradiente . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.1 Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.2 Convergência . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Método do Gradiente Conjugado . . . . . . . . . . . . . . . . . . . . . 6
2.2.1 Convergência . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Método de Newton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.1 Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.2 Convergência . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.4 Método de Newton Modificado . . . . . . . . . . . . . . . . . . . . . . . 11
2.4.1 Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4.2 Convergência . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.5 Método de Quase Newton . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.5.1 Implementação . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.5.2 Convergência . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3 Simulações e Resultados 16
3.1 Caso 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2 Caso 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.3 Caso 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4 Caso 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.5 Caso 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4 Considerações Finais 30
Anexos 31
i
Capı́tulo 1
Introdução
1
Em cada um dos métodos numéricos apresentados, serão discutidos algumas de suas
principais particularidades e serão apresentados os algoritmos implementados em MA-
TLAB®, bem como algumas simulações de exemplos que buscam validar os códigos
desenvolvidos.
2
Capı́tulo 2
Métodos Numéricos
Neste capı́tulo será apresentada uma breve abordagem teórica, destacando o princı́pio
de funcionamento e as principais particularidades de cada um dos métodos numéricos
em questão.
Os métodos apresentados se aplicam a funções suaves e trabalham com sequência
de pontos convergentes, ou seja, dado um ponto xk (vetor em <n ) devemos escolher
uma direção dk (vetor em <n ) e avançar certa distância αk nela. A diferença entre os
métodos está na maneira de se determinar a direção de avanço e a quantidade de avanço
em cada iteração.
3
deve ser oposto ao do gradiente em cada ponto, ou seja, a direção de descida máxima
(ddm) fica: dk = −∇f (xk ).
xk+1 = xk + αk dk (2.1)
4
Outra questão importante se refere ao condicionamento da Hessiana da função f .
Hessianas bem condicionadas nos pontos de interesse (região “bem comportada”) pro-
movem uma convergência rápida do método; caso contrário há lentidão. Por exemplo,
se as curvas de nı́vel forem circulares, converge com apenas uma iteração, uma vez que
a primeira direção d aponta direto para o mı́nimo.
2.1.1 Implementação
Algoritmo do Gradiente
k←0
enquanto (não satisfaz critério de parada)
g k ← gradiente (f (.), xk )
dk ← −g k
αk ← argminα f (xk + αdk )
xk+1 = xk + αdk
k ←k+1
fim-enquanto
2.1.2 Convergência
O Método do Gradiente pode ter convergência lenta em alguns casos e, mesmo em casos
simples, como o de funções quadráticas, não se pode garantir convergência exata em
um número finito de passos e para qualquer ponto inicial. O Método do Gradiente
Conjugado, que será explicado a seguir, foi criado para melhorar esses aspectos.
5
2.2 Método do Gradiente Conjugado
6
Figura 2.2: Representação vetorial do avanço a cada iteração no método do Gradiente
Conjugado.
xk+1 = xk + αk dk
(2.3)
k+1 k+1 k
d = −g + βk d
Apesar do MGC ter sido desenvolvido para funções quadráticas, o mesmo pode ser
aplicado a uma função objetivo qualquer, uma vez que as expressões de βk independem
dos parâmetros A e b da função quadrática f (x) = q(x) = 21 xT Ax + bT x, onde a busca
linear de αk deve ser resolvida por um método numérico qualquer ou pela derivação de
f (α).
2.2.1 Convergência
O Método do Gradiente Conjugado, foi criado para melhorar alguns aspectos relaci-
onados ao Método do Gradiente, que pode ter convergência lenta ou até mesmo, em
alguns casos, pode não ser garantida uma convergência exata em um número finito de
passos e para qualquer ponto inicial. A principal mudança em relação ao Método do
Gradiente advém da suavização da mudança de direção dk a cada iteração. Com isso,
o Método do Gradiente Conjugado apresenta uma maior velocidade de convergência.
7
2.3 Método de Newton
xk+1 = xk + dk (2.6)
8
Ou seja, o valor da próxima iteração depende da iteração atual mais uma determi-
nada direção, que é obtida por meio do cálculo da hessiana e do gradiente avaliados no
ponto xk .
dk = − [Gk ]−1 g k
(2.7)
k 2 k −1 k
d = − [∇ f (x )] ∇f (x )
2.3.1 Implementação
9
Algoritmo de Newton
k←0
enquanto (não satisfaz critério de parada)
g k ← gradiente (f (.), xk )
Gk ← Hessiana (f (.), xk )
xk+1 = xk − [Gk ]−1 g k
k ←k+1
fim - enquanto
O algoritmo foi implementado no Matlab, por metodologia simbólica, e encontra-se
disponı́vel para escolha do usuário na caixa de seleção disponı́vel na interface gráfica
do software Otimizador de Funções Multidimensionais. O critério de parada utilizado
foi | xk+1 − xk |< , onde é uma tolerância definida pelo usuário.
2.3.2 Convergência
10
2.4 Método de Newton Modificado
xk+1 = xk + αk dk (2.8)
F k = Gk + γIn
11
2.4.1 Implementação
2.4.2 Convergência
12
2.5 Método de Quase Newton
dk = −H k g k (2.10)
H k+1 γ k = δ k (2.11)
γ k = g k+1 − g k
(2.12)
k k+1 k
δ =x −x
13
A geração das matrizes é dada pela formulação dos métodos DFP e BFGS, apre-
sentados nas equações 2.13 e 2.14.
Hgγ T H Hδδ T
H k+1 = H − + T (2.13)
γ T Hg δ γ
δγ T H + Hγδ T γ T Hg δδ T
H k+1 = H − + (1 + ) (2.14)
δT γ δT γ δT γ
2.5.1 Implementação
14
2.5.2 Convergência
Assim como nos métodos anteriormente apresentados, a escolha do ponto inicial in-
fluencia consideravelmente o mı́nimo encontrado, especialmente em funções altamente
não-lineares. Por mais que o método de Quase Newton utilize uma estimativa do in-
verso da Hessiana, para os casos em que os algoritmos foram testados e comparados,
o desempenho do método foi similar ao do Newton Modificado no que diz respeito ao
número de iterações. Isso é especialmente interessante pois no Método de Quase New-
ton não é necessário computar informação de 2a ordem. Os resultados dos exemplos de
simulação serão apresentados na seção subsequente.
15
Capı́tulo 3
Simulações e Resultados
3.1 Caso 1
16
Figura 3.1: Resultados para MDM,
f (x1 , x2 ) = sen(0.5x21 − 0.25x22 + 3)cos(2x1 + 1 − exp(x2 )), passo de enquadramento 0,1 e
tolerância de 0,001.
17
Tabela 3.1: Comparação entre os métodos MDM e MGC para a função
f (x1 , x2 ) = sen(0.5x21 − 0.25x22 + 3)cos(2x1 + 1 − exp(x2 )) e diferentes pontos de partida.
18
A Figura 3.4 apresenta o detalhe da convergência dos métodos MDM e MGC (Polak-
Rebière) para o ponto de partida [3,-4] da Tabela 3.1. Enquanto o MDM avança de
forma lenta numa trajetória em zig-zag, o MGC “corta caminho” e encontra o mı́nimo
de forma bem mais rápida.
3.2 Caso 2
19
q
f (x1 , x2 ) = − 20 exp(−0.2 0.5x21 + 0.5x22 )
(3.1)
− exp(0.5(cos(2πx1 ) + cos(2πx2 )) + exp(1) + 20
A função a ser minimizada é dada pela expressão analı́tica mostrada na Equação 3.1
e é conhecida como Função de Ackley. Como, a princı́pio, o comportamento da função
não é conhecido, optou-se por realizar a análise partindo de um ponto inicial qualquer
[2 ; 5]. Além disso, foi utilizado um passo de enquadramento unitário.
Novamente, a função f (x1 , x2 ) foi submetida ao procedimento de minimização pelos
métodos de otimização vetorial propostos, com uma tolerância de 10−3 . Conforme
esperado, não houve problema de convergência dos métodos para a tolerância definida,
com exceção do Método de Newton, no qual o resultado convergiu para um ponto de
mı́nimo local. A Tabela 3.2 apresenta os resultados obtidos.
A Figura 3.5 (a) mostra as curvas de nı́vel da função analisada, bem como o resultado
da minimização através dos métodos de otimização. Já a Figura 3.5 (b) mostra o gráfico
3D da Função de Ackley e, em destaque, os minimizadores do processo iterativo.
20
A escolha do passo de enquadramento unitário (elevado) possibilitou uma melhor
otimização por parte dos métodos analisados, uma vez que foi possı́vel atingir o mı́nimo
global. Para a função estudada, a escolha de um passo de enquadramento pequeno
implicaria em uma busca reduzida e, com isso, o resultado facilmente tenderia para um
mı́nimo local.
Gradiente [0 ; 0] 0 2
Newton Modificado [0 ; 0] 0 2
21
3.3 Caso 3
22
A Figura 3.6 mostra que para os quatros pontos iniciais analisados obteve-se quatro
minimizadores diferentes: um global e os demais locais.
Partindo do ponto inicial [0 ; 0], os métodos de otimização atingem o mı́nimo global
f (x1 , x2 ) = −78.3323, conforme mostra a Figura 3.7.
23
Tabela 3.3: Resultados da Otimização para a Função de Styblinski–Tang - Caso 3
24
3.4 Caso 4
A função descrita pela equação 3.3 é conhecida como função de Rosenbrock para
o caso de duas variáveis. Esta função é caracterizada por possuir um mı́nimo global
dentro de um vale parabólico e flat, conforme ilustrado na Figura 3.8. A convergência
para o vale é simples para todos os métodos, porém, devido a região plana, a busca
pelo mı́nimo global torna-se trabalhosa.
25
Tabela 3.4: Resultados obtidos na minimização da função de Rosenbrock no <2
Mı́nimo
Método de Otimização Minimizadores Iterações
Estimado
Gradiente [0.649 , 0.423] 0.123 120
Gradiente Conjugado [1.0 , 1.0] 0 15
Newton [1.0 , 1.0] 0 5
Newton Modificado [1.0 , 1.0] 0 20
Quase Newton [1.0 , 1.0] 0 15
Tolerância de 0.0001;
26
Figura 3.9: Dificuldade do Método do Gradiente - Caso 4
Apesar de não serem projetados para funções não convexas, os métodos conseguiram
estimar o mı́nimo global com precisão.
27
3.5 Caso 5
Tolerância de 0.001;
28
Tabela 3.5: Resultados obtidos na minimização da função de Rosenbrock no <4 .
Método de Mı́nimo
Minimizadores Iterações
Otimização Estimado
[0.815 , 0.664 ,
Gradiente 0.461 120
0.441 , 0.191]
[9.2 , 84.2 ,
Newton 5.03e+7 10
7090.4 , 50.2e+6]
Newton [1, 1,
0 23
Modificado 1, 1]
[1, 1,
Quase Newton 0 24
1, 1]
29
Capı́tulo 4
Considerações Finais
ordem;
Fletcher-Reeves;
30
Anexos
1 % Metodo do G r a d i e n t e
2 x0 = x i n i t ; max step = 1 0 ; i t e r = 1 ;
3 i f dim == 2
4 e z c o n t o u r ( f , [ xmin xmax ymin ymax ] , 1 0 0 )
5 hold a l l
6 end
7 [ v alu e0 , g0 ] = numerico ( x0 ) ;
8 xx = x0 ;
9 gg = g0 ;
10 pp = [ ] ;
11 f f = value0 ;
12 d0 = −g0 / ( norm ( g0 , 2 ) +1e −12) ;
13 i f dim == 2
14 p l o t ( xx ( 1 , : ) , xx ( 2 , : ) , ’−r o ’ )
15 a x i s ( [ xmin xmax ymin ymax ] )
16 % t i t l e ( [ ’ Valor : ’ , ’= ’ num2str ( v a l u e ) , ’ | ’ , ’ P. I .
= ’ num2str ( p r o d u t o i n t e r n o ) ] )
17 end
18 w h i l e i t e r <= i t e r m a x
19 valor = [ ] ;
20 count = 1 ;
21 f o r p a s s o = 0 : i n c r : max step
22 v a l o r = [ v a l o r o b j f u n b u s c a l i n e a r ( x0 , −g0 , p a s s o ) ] ;
23 i f count > 2
24 i f v a l o r ( end ) > v a l o r ( end −1)
25 break
26 end
27 end
28 count = count + 1 ;
29 end
30 f u n f u n = @( a l p h a ) o b j f u n b u s c a l i n e a r ( x0 , −g0 , a l p h a ) ;
31 p a s s o = fminbnd ( funfun , 0 , passo , o p t i m s e t ( ’ TolX ’ , 1 e −4) ) ;
32 d = −g0 /norm ( g0 , 2 ) ;
31
33 x = x0 − g0 * p a s s o / ( norm ( g0 , 2 ) +1e −12) ;
34 xx = [ xx x ]
35 [ v alue , g , ˜ ] = numerico ( x ) ;
36 p r o d u t o i n t e r n o = gg ( : , end ) ’ * g ;
37 i f dim == 2
38 hold a l l
39 % p l o t ( xx ( 1 , : ) , xx ( 2 , : ) , ’− ro ’ )
40 p l o t ( xx ( 1 , : ) , xx ( 2 , : ) , ’−r o ’ )
41 a x i s ( [ xmin xmax ymin ymax ] )
42 t i t l e ( [ ’ Valor : ’ , ’= ’ num2str ( v a l u e ) , ’ | ’,’ P. I
. = ’ num2str ( p r o d u t o i n t e r n o ) ] )
43 pause ( 0 . 0 1 )
44 end
45 gg = [ gg g ] ;
46 pp = [ pp p a s s o ] ;
47 f f = [ f f value ]
48 iter = iter + 1;
49 i f norm ( x−x0 , 2 ) < t o l
50 break
51 end
52 x0 = x ;
53 g0 = g ;
54 end
55 i f i t e r >= i t e r m a x
56 e r r o r d l g ( ’ Numero maximo de i t e r a c o e s do p r o c e s s o
numerico e x c e d i d o ’ )
57 end
58 saida = ’ ’ ;
59 f o r i = 1 : dim
60 s a i =[ s p r i n t f ( ’ x%d = ’ , i ) , num2str ( xx ( i , end ) ) ] ;
61 saida = char ( saida , s a i ) ;
62 end
63 set ( handles . result , ’ String ’ , saida ) ;
64 s e t ( h a n d l e s . Vfunc , ’ S t r i n g ’ , f f ( end ) ) ;
65 s e t ( h a n d l e s . N i t e r , ’ S t r i n g ’ , i t e r −1) ;
66
32
79 f f = value0 ;
80 d0 = −g0 ;
81 valor = [ ] ;
82 count = 1 ;
83 f o r p a s s o = 0 : i n c r : max step
84 v a l o r = [ v a l o r o b j f u n b u s c a l i n e a r ( x0 , d0 , p a s s o ) ] ;
85 i f count > 2
86 i f v a l o r ( end ) > v a l o r ( end −1)
87 break
88 end
89 end
90 count = count + 1 ;
91 end
92 f u n f u n = @( a l p h a ) o b j f u n b u s c a l i n e a r ( x0 , d0 , a l p h a ) ;
93 p a s s o = fminbnd ( funfun , 0 , passo , o p t i m s e t ( ’ TolX ’ , 1 e −4) ) ;
94 % i n t e r v a l o = d i v i s a o a u r e a ( x0 , d0 , 0 , max step , 1 e −3) ;
95 % p a s s o = mean ( i n t e r v a l o ) ;
96 x = x0 + d0 * p a s s o /norm ( d0 , 2 ) ;
97 xx = [ xx x ] ;
98 x0 = x ;
99 w h i l e i t e r <= i t e r m a x
100 [ v alue , g , ˜ ] = numerico ( x ) ;
101 i f dim == 2
102 p l o t ( xx ( 1 , : ) , xx ( 2 , : ) , ’−bo ’ )
103 a x i s ( [ xmin xmax ymin ymax ] )
104 t i t l e ( [ ’ Valor : ’ , ’= ’ num2str ( v a l u e ) ] )
105 pause ( 0 . 1 )
106 end
107 f f = [ f f value ] ;
108 % b = g ’ * g / ( g0 ’ * g0 ) ;
109 b = g ’ * ( g−g0 ) / ( g0 ’ * g0 ) ;
110 g0 = g ;
111 d = −g +b * d0 ;
112 d0 = d ;
113 valor = [ ] ;
114 count = 1 ;
115 f o r p a s s o = 0 : i n c r : max step
116 valor = [ valor o b j f u n b u s c a l i n e a r (x , d , passo ) ] ;
117 i f count > 2
118 i f v a l o r ( end ) > v a l o r ( end −1)
119 break
120 end
121 end
122 count = count + 1 ;
123 end
124 % MDA
125 % i n t e r v a l o = d i v i s a o a u r e a ( x , d , 0 , passo , 0 . 0 0 0 0 1 ) ;
126 % p a s s o = mean ( i n t e r v a l o ) ;
33
127
34
174 valor = [ ] ;
175 count = 1 ;
176 f o r p a s s o = 0 : i n c r : max step
177 v a l o r = [ v a l o r o b j f u n b u s c a l i n e a r ( x0 , d0 , p a s s o ) ] ;
178 i f count > 2
179 i f v a l o r ( end ) > v a l o r ( end −1)
180 break
181 end
182 end
183 count = count + 1 ;
184 end
185 f u n f u n = @( a l p h a ) o b j f u n b u s c a l i n e a r ( x0 , d0 , a l p h a ) ;
186 p a s s o = fminbnd ( funfun , 0 , passo , o p t i m s e t ( ’ TolX ’ , 1 e −4) ) ;
187 % i n t e r v a l o = d i v i s a o a u r e a ( x0 , d0 , 0 , max step , 1 e −3) ;
188 % p a s s o = mean ( i n t e r v a l o ) ;
189 x = x0 + d0 * p a s s o /norm ( d0 , 2 ) ;
190 xx = [ xx x ] ;
191 x0 = x ;
192 w h i l e i t e r <= i t e r m a x
193 [ v alue , g , ˜ ] = numerico ( x ) ;
194 i f dim == 2
195 p l o t ( xx ( 1 , : ) , xx ( 2 , : ) , ’−yo ’ )
196 a x i s ( [ xmin xmax ymin ymax ] )
197 t i t l e ( [ ’ Valor : ’ , ’= ’ num2str ( v a l u e ) ] )
198 pause ( 0 . 1 )
199 end
200 f f = [ f f value ] ;
201 b = g ’ * g / ( g0 ’ * g0 ) ;
202 %b = g ’ * ( g−g0 ) / ( g0 ’ * g0 ) ;
203 g0 = g ;
204 d = −g +b * d0 ;
205 d0 = d ;
206 valor = [ ] ;
207 count = 1 ;
208 f o r p a s s o = 0 : i n c r : max step
209 valor = [ valor o b j f u n b u s c a l i n e a r (x , d , passo ) ] ;
210 i f count > 2
211 i f v a l o r ( end ) > v a l o r ( end −1)
212 break
213 end
214 end
215 count = count + 1 ;
216 end
217 % MDA
218 % i n t e r v a l o = d i v i s a o a u r e a ( x , d , 0 , passo , 0 . 0 0 0 0 1 ) ;
219 % p a s s o = mean ( i n t e r v a l o ) ;
220
35
222 f u n f u n = @( a l p h a ) o b j f u n b u s c a l i n e a r ( x , d , a l p h a ) ;
223 p a s s o = fminbnd ( funfun , 0 , passo , o p t i m s e t ( ’ TolX ’ , 1 e −4) ) ;
224 x = x0 + p a s s o * d/norm ( d , 2 ) ;
225 xx = [ xx x ]
226 iter = iter + 1;
227 i f norm ( x−x0 , 2 ) < t o l
228 break
229 end
230 x0 = x ;
231 end
232 [ v alue , g , ˜ ] = numerico ( x ) ;
233 f f = [ f f value ]
234 i f dim == 2
235 p l o t ( xx ( 1 , : ) , xx ( 2 , : ) , ’−yo ’ )
236 a x i s ( [ xmin xmax ymin ymax ] )
237 t i t l e ( [ ’ Valor : ’ , ’= ’ num2str ( v a l u e ) ] )
238 pause ( 0 . 1 )
239 end
240 i f i t e r >= i t e r m a x
241 e r r o r d l g ( ’ Numero maximo de i t e r a c o e s do p r o c e s s o
numerico e x c e d i d o ’ )
242 end
243 saida = ’ ’ ;
244 f o r i = 1 : dim
245 s a i =[ s p r i n t f ( ’ x%d = ’ , i ) , num2str ( xx ( i , end ) ) ] ;
246 saida = char ( saida , s a i ) ;
247 end
248 set ( handles . result , ’ String ’ , saida ) ;
249 s e t ( h a n d l e s . Vfunc , ’ S t r i n g ’ , f f ( end ) ) ;
250 s e t ( handles . Niter , ’ String ’ , i t e r ) ;
251
36
269 pause ( 0 . 5 )
270 end
271 x = x0 + d0 ;
272 xx = [ xx x ]
273 iter = iter + 1;
274 i f norm ( x−x0 , 2 ) < t o l
275 break
276 end
277 x0 = x ;
278 count = count + 1 ;
279 end
280 [ f v a l , g r a d v a l , h e s s i a n v a l ] = numerico ( x ) ;
281 ff = [ ff fval ]
282 i f dim == 2
283 p l o t ( xx ( 1 , : ) , xx ( 2 , : ) , ’−co ’ )
284 a x i s ( [ xmin xmax ymin ymax ] )
285 t i t l e ( [ ’ Valor : ’ , ’= ’ num2str ( f v a l ) ] )
286 pause ( 0 . 5 )
287 end
288 i f i t e r >= i t e r m a x
289 e r r o r d l g ( ’ Numero maximo de i t e r a c o e s do p r o c e s s o
numerico e x c e d i d o ’ )
290 end
291 saida = ’ ’ ;
292 f o r i = 1 : dim
293 s a i =[ s p r i n t f ( ’ x%d = ’ , i ) , num2str ( xx ( i , end ) ) ] ;
294 saida = char ( saida , s a i ) ;
295 end
296 set ( handles . result , ’ String ’ , saida ) ;
297 s e t ( h a n d l e s . Vfunc , ’ S t r i n g ’ , f f ( end ) ) ;
298 s e t ( h a n d l e s . N i t e r , ’ S t r i n g ’ , i t e r −1) ;
299
37
316 end
317 gama = 0 . 1 ;
318 w h i l e 1 == 1
319 i f min ( e i g ( h e s s i a n v a l ) ) < 0
320 h e s s i a n v a l = h e s s i a n v a l + gama * eye ( dim ) ;
321 gama = gama + 0 . 1 ;
322 else
323 break
324 end
325 end
326 d0 = −pinv ( h e s s i a n v a l ) * g r a d v a l ;
327 valor = [ ] ;
328 count = 1 ;
329 f o r p a s s o = 0 : i n c r : max step
330 v a l o r = [ v a l o r o b j f u n b u s c a l i n e a r ( x0 , d0 , p a s s o ) ] ;
331 i f count > 2
332 i f v a l o r ( end ) > v a l o r ( end −1)
333 break
334 end
335 end
336 count = count + 1 ;
337 end
338 % i n t e r v a l o = d i v i s a o a u r e a ( x0 , d0 , 0 , passo , 0 . 0 0 0 0 1 ) ;
339 % p a s s o = mean ( i n t e r v a l o ) ;
340 f u n f u n = @( a l p h a ) o b j f u n b u s c a l i n e a r ( x0 , d0 , a l p h a ) ;
341 p a s s o = fminbnd ( funfun , 0 , passo , o p t i m s e t ( ’ TolX ’ , 1 e −4) ) ;
342 x = x0 + p a s s o * d0/norm ( d0 , 2 ) ;
343 xx = [ xx x ]
344 iter = iter + 1;
345 i f norm ( x−x0 , 2 ) < t o l
346 break
347 end
348 x0 = x ;
349 end
350 [ f v a l , g r a d v a l , h e s s i a n v a l ] = numerico ( x ) ;
351 ff = [ ff fval ]
352 i f dim == 2
353 p l o t ( xx ( 1 , : ) , xx ( 2 , : ) , ’−go ’ )
354 a x i s ( [ xmin xmax ymin ymax ] )
355 t i t l e ( [ ’ Valor : ’ , ’= ’ num2str ( f v a l ) ] )
356 pause ( 0 . 1 )
357 end
358 i f i t e r >= i t e r m a x
359 e r r o r d l g ( ’ Numero maximo de i t e r a c o e s do p r o c e s s o
numerico e x c e d i d o ’ )
360 end
361 saida = ’ ’ ;
362 f o r i = 1 : dim
38
363 s a i =[ s p r i n t f ( ’ x%d = ’ , i ) , num2str ( xx ( i , end ) ) ] ;
364 saida = char ( saida , s a i ) ;
365 end
366 set ( handles . result , ’ String ’ , saida ) ;
367 s e t ( h a n d l e s . Vfunc , ’ S t r i n g ’ , f f ( end ) ) ;
368 s e t ( h a n d l e s . N i t e r , ’ S t r i n g ’ , i t e r −1) ;
369
39
411 [ val , g , ˜ ] = numerico ( x ) ;
412 gama = g − g0 ;
413 H = H0 − H0 * gama * gama ’ * H0 / ( gama ’ * H0 * gama ) + d e l t a *
d e l t a ’ / ( d e l t a ’ * gama ) ; %DFP
414 % H = ( [ 1 0 0 ; 0 1 0 ; 0 0 1 ] − ( x − x0 ) * gama ’ / ( gama
’ * ( x − x0 ) ) ) * H0 * ( [ 1 0 0 ; 0 1 0 ; 0 0 1]−gama * ( x − x0 )
’ / ( gama ’ * ( x − x0 ) ) ) + ( x − x0 ) * ( x − x0 ) ’ / ( gama ’ * ( x − x0 )
) ; %BFGS c e r t o
415 H0 = H;
416 g0 = g ;
417 x0 = x ;
418 end
419 [ f v a l , g r a d v a l , ˜ ] = numerico ( x ) ;
420 ff = [ ff fval ]
421 i f dim == 2
422 p l o t ( xx ( 1 , : ) , xx ( 2 , : ) , ’−mo ’ )
423 a x i s ( [ xmin xmax ymin ymax ] )
424 t i t l e ( [ ’ Valor : ’ , ’= ’ num2str ( f v a l ) ] )
425 pause ( 0 . 1 )
426 end
427 i f i t e r >= i t e r m a x
428 e r r o r d l g ( ’ Numero maximo de i t e r a c o e s do p r o c e s s o
numerico e x c e d i d o ’ )
429 end
430 saida = ’ ’ ;
431 f o r i = 1 : dim
432 s a i =[ s p r i n t f ( ’ x%d = ’ , i ) , num2str ( xx ( i , end ) ) ] ;
433 saida = char ( saida , s a i ) ;
434 end
435 set ( handles . result , ’ String ’ , saida ) ;
436 s e t ( h a n d l e s . Vfunc , ’ S t r i n g ’ , f f ( end ) ) ;
437 s e t ( h a n d l e s . N i t e r , ’ S t r i n g ’ , i t e r −1) ;
438
40
454 a x i s ( [ xmin xmax ymin ymax ] )
455 t i t l e ( [ ’ Valor : ’ , ’= ’ num2str ( v a l ) ] )
456 pause ( 0 . 1 )
457 end
458 valor = [ ] ;
459 count = 1 ;
460 f o r p a s s o = 0 : i n c r : max step
461 v a l o r = [ v a l o r o b j f u n b u s c a l i n e a r ( x0 , d0 , p a s s o ) ] ;
462 i f count > 2
463 i f v a l o r ( end ) > v a l o r ( end −1)
464 break
465 end
466 end
467 count = count + 1 ;
468 end
469 % i n t e r v a l o = d i v i s a o a u r e a ( x0 , d0 , 0 , passo , 0 . 0 1 ) ;
470 % p a s s o = mean ( i n t e r v a l o ) ;
471 f u n f u n = @( a l p h a ) o b j f u n b u s c a l i n e a r ( x0 , d0 , a l p h a ) ;
472 p a s s o = fminbnd ( funfun , 0 , passo , o p t i m s e t ( ’ TolX ’ , 1 e −4) ) ;
473 x = x0 + p a s s o * d0/norm ( d0 , 2 ) ;
474 xx = [ xx x ]
475 iter = iter + 1;
476 i f norm ( x−x0 , 2 ) < t o l
477 break
478 end
479 d e l t a = x − x0 ;
480 [ val , g , ˜ ] = numerico ( x ) ;
481 gama = g − g0 ;
482 %H = H0 − H0 * gama * gama ’ * H0 / ( gama ’ * H0 * gama ) + d e l t a *
d e l t a ’ / ( d e l t a ’ * gama ) ; %DFP
483 H = ( eye ( dim ) − ( x − x0 ) * gama ’ / ( gama ’ * ( x − x0 ) ) ) * H0 * (
eye ( dim )−gama * ( x − x0 ) ’ / ( gama ’ * ( x − x0 ) ) ) + ( x − x0 )
* ( x − x0 ) ’ / ( gama ’ * ( x − x0 ) ) ; %BFGS c e r t o
484 H0 = H;
485 g0 = g ;
486 x0 = x ;
487 end
488 [ f v a l , g r a d v a l , ˜ ] = numerico ( x ) ;
489 ff = [ ff fval ]
490 i f dim == 2
491 p l o t ( xx ( 1 , : ) , xx ( 2 , : ) , ’−ko ’ )
492 a x i s ( [ xmin xmax ymin ymax ] )
493 t i t l e ( [ ’ Valor : ’ , ’= ’ num2str ( f v a l ) ] )
494 pause ( 0 . 1 )
495 end
496 i f i t e r >= i t e r m a x
497 e r r o r d l g ( ’ Numero maximo de i t e r a c o e s do p r o c e s s o
numerico e x c e d i d o ’ )
41
498 end
499 saida = ’ ’ ;
500 f o r i = 1 : dim
501 s a i =[ s p r i n t f ( ’ x%d = ’ , i ) , num2str ( xx ( i , end ) ) ] ;
502 saida = char ( saida , s a i ) ;
503 end
504 set ( handles . result , ’ String ’ , saida ) ;
505 s e t ( h a n d l e s . Vfunc , ’ S t r i n g ’ , f f ( end ) ) ;
506 s e t ( h a n d l e s . N i t e r , ’ S t r i n g ’ , i t e r −1) ;
42