| | | | |

2.2 Problemas de Minimização

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

Em revisão

Vamos considerar o seguinte problema de minimização: dada a função objetivo f:Dn, resolver

min𝒙Df(𝒙). (2.29)

No que segue e salvo dito explicitamente ao contrário, vamos assumir que o problema está bem determinado e que f é suficientemente suave. Ainda, vamos assumir as seguintes notações:

  • gradiente de f

    f(𝒙)=(fx1(𝒙),,fxn(𝒙)) (2.30)
  • derivada direcional de f com respeito a 𝒅n

    f𝒅(𝒙)=f(𝒙)𝒅 (2.31)
  • matriz hessiana de f, H=[hi,j]i,j=1n,n

    hi,j(𝒙)=2fxixj(𝒙) (2.32)
Observação 2.2.1 (Condições de Otimização).

Se f(𝒙*)=0 e H(𝒙*) é positiva definida, então 𝒙* é um mínimo local de f em uma vizinhança não vazia de 𝒙*. Consulte mais em [8, Seção 7.2]. Um ponto 𝒙* tal que f(𝒙*)=0 é chamado de ponto crítico.

2.2.1 Métodos de Declive

Em revisão

Um método de declive consiste em uma iteração tal que: dada uma aproximação inicial 𝒙(0)n, computa-se

𝒙(k+1)=𝒙(k)+α(k)𝒅(k), (2.33)

com tamanho de passo α(k)>0, para k=0,1,2, até que um dado critério de parada seja satisfeito. As direções descendentes são tais que

𝒅(k)f(𝒙(k))<0,se f(𝒙(k))0, (2.34)
𝒅(k)=0,noutro caso. (2.35)
Observação 2.2.2 (Condição de Convergência).

Da Série de Taylor4040endnote: 40Brook Taylor, 1685 - 1731, matemático britânico. Fonte: Wikipédia:Brook Taylor., temos que

f(𝒙(k)+α(k)𝒅(k))f(𝒙(k))=α(k)f(𝒙(k))𝒅(k)+ε, (2.36)

com ε0 quando α(k)0. Como consequência da continuidade da f, para α(k) suficientemente pequeno, o sinal do lado esquerdo é igual a do direito desta última equação. Logo, para tais α(k) e 𝒅(k)0 uma direção descendente, temos garantido que

f(𝒙(k)+α(k)𝒅(k))<f(𝒙(k)). (2.37)

Notamos que um método de declive fica determinado pelas escolhas da direção de declive 𝒅(k) e o tamanho do passo α(k). Primeiramente, vamos a este último item.

Pesquisa linear

Em revisão

O método de pesquisa linear consiste em escolher α(k) com base na resolução do seguinte problema de minimização

minαϕ(α):=f(𝒙(k)+α𝒅(k)). (2.38)

Entretanto, a resolução exata deste problema é muitas vezes não factível. Técnicas de aproximações para a resolução deste problema são, então, aplicadas. Tais técnicas são chamadas de pesquisa linear não exata.

A condição de Armijo é que a escolha de α(k) deve ser tal que

f(𝒙(k)+α(k)𝒅(k))f(𝒙(k))+σα(k)f(𝒙(k))𝒅(k), (2.39)

para alguma constante σ(0,1/2). Ou seja, a redução em f é esperada ser proporcional à derivada direcional de f com relação a direção 𝒅(k) no ponto 𝒙(k). Em aplicações computacionais, σ é normalmente escolhido no intervalo [105,101].

A condição (2.39) não é suficiente para evitar escolhas muito pequenas de α(k). Para tanto, pode-se empregar a condição de curvatura, a qual requer que

f(𝒙(k)+α(k)𝒅(k))𝒅(k)βf(𝒙(k))𝒅(k), (2.40)

para β[σ,1/2]. Notemos que o lado esquerdo de (2.40) é igual a ϕ(α(k)). Ou seja, este condição impõe que α(k) seja maior que βϕ(0). Normalmente, escolhe-se β[101,1/2]. Juntas, (2.39) e (2.40) são conhecidas como condições de Wolfe4141endnote: 41Philip Wolfe, 1927 - 2016, matemático estadunidense. Fonte: Wikipédia..

2.2.2 Método do Gradiente

Em revisão

O método do gradiente (ou método do máximo declive) é um método de declive tal que as direções descendentes são o oposto do gradiente da f, i.e.

𝒅(k)=f(𝒙(k)). (2.41)

É imediato verificar que as condições (2.34)-(2.35) são satisfeitas.

Exemplo 2.2.1.

Consideramos o problema de encontrar o mínimo da função de Rosenbrock4242endnote: 42Howard Harry Rosenbrock, 1920 - 2010, engenheiro britânico. Fonte: Wikipedia: Howard Harry Rosenbrock.

f(𝒙)=i=1n100(xi+1xi2)2+(1xi)2. (2.42)

O valor mínimo desta função é zero e ocorre no ponto 𝒙=𝟏. Esta função é comumente usada como caso padrão para teste de métodos de otimização.

Para o método do gradiente, precisamos das derivadas parciais

fx1=400x1(x2x12)2(1x1) (2.43)
fxj=i=1n200(xixi12)×(δi,j2xi1δi1,j)
2(1xi1)δi1,j (2.44)
fxn=200(xnxn12) (2.45)

onde, δi,j é o delta de Kronecker4343endnote: 43Leopold Kronecker, 1923 - 1891, matemático alemão. Fonte: Wikipédia: Leopold Kronecker..

Código 5: Algoritmo do Gradiente
1import numpy as np
2import numpy.linalg as npla
3import scipy.optimize as spopt
4
5# fun obj
6def fun(x):
7  '''
8  Função de Rosenbrock
9  '''
10  return sum(100.*(x[1:]-x[:-1]**2.)**2. + (1.-x[:-1])**2.)
11
12# gradiente da fun
13def grad(x):
14  xm = x[1:-1]
15  xm_m1 = x[:-2]
16  xm_p1 = x[2:]
17  der = np.zeros_like(x)
18  der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm)
19  der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0])
20  der[-1] = 200*(x[-1]-x[-2]**2)
21
22  return der
23
24# problem dimension
25n = 2
26
27# num max iters
28maxiter = 100000
29# tolerancia
30tol = 1e-10
31
32# aprox. inicial
33x = np.zeros(n)
34
35for k in range(maxiter):
36  # direcao descendente
37  d = -grad(x)
38
39  # pesquisa linear
40  alpha = spopt.line_search(fun, grad, x, d,
41                            c1=0.0001, c2=0.9)[0]
42
43  # atualizacao
44  x = x + alpha * d
45
46  nad = npla.norm(alpha * d)
47  nfun = npla.norm(fun(x))
48
49  if ((k+1) % 10 == 0):
50    print(f"{k+1}: {alpha:1.2e} {nad:1.2e} {nfun:1.2e}")
51
52  if (nfun < tol):
53    break

Exercícios

Em revisão

E. 2.2.1.

Aplique o método do gradiente para computar o ponto mínimo da função de Rosenbrock4444endnote: 44Howard Harry Rosenbrock, 1920 - 2010, engenheiro britânico. Fonte: Wikipedia: Howard Harry Rosenbrock.

f(𝒙)=i=1n100(xi+1xi2)2+(1xi)2 (2.46)

com

  1. a)

    n=2.

  2. b)

    n=3.

  3. c)

    n=4.

  4. d)

    n=5.

  5. e)

    n=10.

Resposta.

f(𝟏)=0

E. 2.2.2.

Aplique o método do gradiente para computar o ponto mínimo da função de Beale [1]

f(x,y)=(1.5x+xy)2 (2.47)
+(2.25x+xy2)2
+(2.625x+xy3)2.

para 𝒙[4.5,4.5]2.

Resposta.

f(3,0.5)=0

E. 2.2.3.

Aplique o método do gradiente para computar o ponto mínimo da função de Goldstein-Price [4]

f(x,y)=[1+(x+y+1)2(1914x (2.48)
+3x214y+6xy+3y2)]
×[30+(2x3y)2(1832x
+12x2+48y36xy+27y2)]
Resposta.

f(0,1)=3

E. 2.2.4.

Aplique o método do gradiente para computar o ponto mínimo da função de Booth

f(x,y)=(x+2y7)2+(2x+y5)2 (2.49)

para 𝒙[10,10]2.

Resposta.

f(1,3)=0

E. 2.2.5.

Aplique o método do gradiente para computar o ponto mínimo da função de Rastrigin

f(x)=10n+i=1n[xi210cos(2πxi)], (2.50)

para 𝒙[5.12,5.12]n, com

  1. a)

    n=2.

  2. b)

    n=3.

  3. c)

    n=4.

  4. d)

    n=5.

  5. e)

    n=10.

Resposta.

f(𝟎)=0

2.2.3 Método de Newton

Em revisão

O método de Newton4545endnote: 45Isaac Newton, 1642 - 1727, matemático, físico, astrônomo, teólogo e autor inglês. Fonte: Wikipédia: Isaac Newton. para problemas de otimização é um método de declive com direções descendentes

𝒅(k)=H1(𝒙(k))f(𝒙(k)), (2.51)

assumindo que a hessiana H seja definida positiva dentro de uma vizinhança suficientemente grande do ponto de mínimo 𝒙*. Esta escolha é baseada no polinômio de Taylor da função objetivo f

f(𝒙(k+1))f(𝒙(k))+f(𝒙(k))𝒅(k)+12𝒅(k)H(𝒙(k))𝒅(k). (2.52)

Com isso, escolhemos 𝒙(k+1) de forma a minimizar o lado direito desta aproximação, i.e.

di(k)(f(𝒙(k))+f(𝒙(k))𝒅(k)+12𝒅(k)H(𝒙(k))𝒅(k))=0 (2.53)

para i=1,2,,n. Ou seja, temos

f(𝒙(k))𝒅(k)+H(𝒙(k))𝒅(k)=𝟎 (2.54)

o que leva a (2.51).

Observação 2.2.3 (Computação da Direção).

Na implementação computacional, não é necessário computar a inversa da hessiana, a direção d(k) pode ser mais eficientemente computada resolvendo-se

H(x(k))d(k)=f(x(k)). (2.55)
Observação 2.2.4 (Solver linear).

O método usado para computar a solução de (2.55) é chamado de solver linear. Por exemplo, Newton-Krylov4646endnote: 46Alexei Nikolajewitsch Krylov, 1863 - 1945, engenheiro e matemático russo. Fonte: Wikipédia. é o nome dado ao método de Newton que utiliza um método de subespaço de Krylov como solver linear. Mais especificamente, Newton-GMRES quando o GMRES é escolhido como solver linear. Uma escolha natural é Newton-GC, tendo em vista que o método de gradiente conjugado é ideal para matriz simétrica e definida positiva.

Exemplo 2.2.2.

Seguindo o Exemplo 2.2.1, temos que a hessiana associada é a matriz simétrica H=[hi,j]i,j=1n,n com

h1,1 =2fx12=1200x12400x2+2 (2.56)
h1,2 =2fx1x2=400x1 (2.57)
hi,j =2fxixj=200(δi,j2xi1δi1,j)400(δi+1,j2xiδi,j)
400δi,j(xi+1xi2)+2δi,j (2.58)
hn1,n =2fxn1xn=400xn1 (2.59)
hn,n =2fxn1=200 (2.60)

Notemos que a hessiana é uma matriz tridiagonal.

1import numpy as np
2import numpy.linalg as npla
3import scipy.optimize as spopt
4
5# fun obj
6def fun(x):
7  '''
8  Funcao de Rosenbrock
9  '''
10  return sum(100.*(x[1:]-x[:-1]**2.)**2. + (1.-x[:-1])**2.)
11
12# gradiente da fun
13def grad(x):
14  xm = x[1:-1]
15  xm_m1 = x[:-2]
16  xm_p1 = x[2:]
17  der = np.zeros_like(x)
18  der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm)
19  der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0])
20  der[-1] = 200*(x[-1]-x[-2]**2)
21
22  return der
23
24def hess(x):
25  x = np.asarray(x)
26  H = np.diag(-400*x[:-1],1) - np.diag(400*x[:-1],-1)
27  diagonal = np.zeros_like(x)
28  diagonal[0] = 1200*x[0]**2-400*x[1]+2
29  diagonal[-1] = 200
30  diagonal[1:-1] = 202 + 1200*x[1:-1]**2 - 400*x[2:]
31  H = H + np.diag(diagonal)
32
33  return H
34
35# dimensao
36n = 2
37
38# num max iters
39maxiter = 100000
40# tolerancia
41tol = 1e-10
42
43# aprox. inicial
44x = np.zeros(n)
45
46for k in range(maxiter):
47
48  # direcao descendente
49  d = npla.solve (hess(x),-grad(x))
50
51  # pesquisa linear
52  alpha = spopt.line_search(fun, grad, x, d)[0]
53
54  # atualizacao
55  x = x + alpha * d
56
57  nad = npla.norm(alpha * d)
58  nfun = npla.norm(fun(x))
59
60  print(f"{k+1}: {alpha:1.2e} {nad:1.2e} {nfun:1.2e}")
61
62  if ((nfun < tol) or np.isnan(nfun)):
63    break
Observação 2.2.5 (Métodos Tipo Newton).

Métodos tipo Newton são aqueles que utilizam uma aproximação para a inversa da matriz hessiana. Uma estratégia comumente aplicada, é a de atualizar a hessiana apenas em algumas iterações, baseando-se em uma estimativa da taxa de convergência. Na Subseção 2.1.2, exploramos esta técnica no contexto de resolução de sistemas não lineares.

Exercícios

Em revisão

E. 2.2.6.

Aplique o método de Newton para computar o ponto mínimo da função de Rosenbrock4747endnote: 47Howard Harry Rosenbrock, 1920 - 2010, engenheiro britânico. Fonte: Wikipedia: Howard Harry Rosenbrock.

f(𝒙)=i=1n100(xi+1xi2)2+(1xi)2 (2.61)

com

  1. a)

    n=2.

  2. b)

    n=3.

  3. c)

    n=4.

  4. d)

    n=5.

  5. e)

    n=10.

Resposta.

f(𝟏)=0

E. 2.2.7.

Aplique o método de Newton para computar o ponto mínimo da função de Beale [1]

f(x,y)=(1.5x+xy)2 (2.62)
+(2.25x+xy2)2
+(2.625x+xy3)2.

para 𝒙[4.5,4.5]2.

Resposta.

f(3,0.5)=0

E. 2.2.8.

Aplique o método de Newton para computar o ponto mínimo da função de Goldstein-Price [4]

f(x,y)=[1+(x+y+1)2(1914x (2.63)
+3x214y+6xy+3y2)]
×[30+(2x3y)2(1832x
+12x2+48y36xy+27y2)]
Resposta.

f(0,1)=3

E. 2.2.9.

Aplique o método de Newton para computar o ponto mínimo da função de Booth

f(x,y)=(x+2y7)2+(2x+y5)2 (2.64)

para 𝒙[10,10]2.

Resposta.

f(1,3)=0

E. 2.2.10.

Aplique o método de Newton para computar o ponto mínimo da função de Rastrigin

f(x)=10n+i=1n[xi210cos(2πxi)], (2.65)

para 𝒙[5.12,5.12]n, com

  1. a)

    n=2.

  2. b)

    n=3.

  3. c)

    n=4.

  4. d)

    n=5.

  5. e)

    n=10.

Resposta.

f(𝟎)=0

2.2.4 Método do Gradiente Conjugado

Em revisão

Métodos do gradiente conjugado são obtidos escolhendo-se as direções descendentes

d(k)=f(x(k))+βkd(k1), (2.66)

onde βk é um escalar escolhido de forma que as direções {d(k)} sejam mutuamente ortogonais com respeito a uma dada norma. Por exemplo, o método de Fletcher-Reeves consiste em escolher

βk=f(x(k))f(x(k))f(x(k1))f(x(k1)), (2.67)

o que garante que as direções sejam mutuamente ortogonais com respeito ao produto interno euclidiano.

Observação 2.2.6 (Variantes).

Outras variações comumente empregadas são o Método de Polak-Ribière e suas variantes. Consulte mais em [7, Seção 5.2].

Exemplo 2.2.3.

Implementação do Método de Fletcher-Reeves para a minimização da função de Rosenbrock dada no Exemplo 2.2.1.

1import numpy as np
2import numpy.linalg as npla
3import scipy.optimize as spopt
4
5# fun obj
6def fun(x):
7  '''
8  Funcao de Rosenbrock
9  '''
10  return sum(100.*(x[1:]-x[:-1]**2.)**2. + (1.-x[:-1])**2.)
11
12# gradiente da fun
13def grad(x):
14  xm = x[1:-1]
15  xm_m1 = x[:-2]
16  xm_p1 = x[2:]
17  der = np.zeros_like(x)
18  der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm)
19  der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0])
20  der[-1] = 200*(x[-1]-x[-2]**2)
21
22  return der
23
24# dimensao do prob
25n = 2
26
27# num max iters
28maxiter = 100000
29# tolerancia
30tol = 1e-10
31
32# aprox. inicial
33x = np.zeros(n)
34
35# iteracoes CG
36gf = grad(x)
37d = -gf
38
39for k in range(maxiter):
40
41  # pesquisa linear
42  alpha = spopt.line_search(fun, grad, x, d)[0]
43
44  # atualizacao
45  x = x + alpha * d
46
47  nad = npla.norm(alpha * d)
48  nfun = npla.norm(fun(x))
49
50  print(f"{k+1}: {alpha:1.2e} {nad:1.2e} {nfun:1.2e}")
51
52  if ((nfun < tol) or np.isnan(nfun)):
53    break
54
55  # prepara nova iter
56  ngf = grad(x)
57
58  beta = np.dot(ngf,ngf)/np.dot(gf,gf)
59  d = -ngf + beta * d
60
61  gf = ngf

Exercícios

Em revisão

E. 2.2.11.

Aplique o método um gradiente conjugado para computar o ponto mínimo da função de Rosenbrock4848endnote: 48Howard Harry Rosenbrock, 1920 - 2010, engenheiro britânico. Fonte: Wikipedia: Howard Harry Rosenbrock.

f(𝒙)=i=1n100(xi+1xi2)2+(1xi)2 (2.68)

com

  1. a)

    n=2.

  2. b)

    n=3.

  3. c)

    n=4.

  4. d)

    n=5.

  5. e)

    n=10.

Resposta.

f(𝟏)=0

E. 2.2.12.

Aplique o método um gradiente conjugado para computar o ponto mínimo da função de Beale [1]

f(x,y)=(1.5x+xy)2 (2.69)
+(2.25x+xy2)2
+(2.625x+xy3)2.

para 𝒙[4.5,4.5]2.

Resposta.

f(3,0.5)=0

E. 2.2.13.

Aplique o método um gradiente conjugado para computar o ponto mínimo da função de Goldstein-Price [4]

f(x,y)=[1+(x+y+1)2(1914x (2.70)
+3x214y+6xy+3y2)]
×[30+(2x3y)2(1832x
+12x2+48y36xy+27y2)]
Resposta.

f(0,1)=3

E. 2.2.14.

Aplique o método um gradiente conjugado para computar o ponto mínimo da função de Booth

f(x,y)=(x+2y7)2+(2x+y5)2 (2.71)

para 𝒙[10,10]2.

Resposta.

f(1,3)=0

E. 2.2.15.

Aplique um método do gradiente conjugado para computar o ponto mínimo da função de Rastrigin

f(x)=10n+i=1n[xi210cos(2πxi)], (2.72)

para 𝒙[5.12,5.12]n, com

  1. a)

    n=2.

  2. b)

    n=3.

  3. c)

    n=4.

  4. d)

    n=5.

  5. e)

    n=10.

Resposta.

f(𝟎)=0


Envie seu comentário

As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!