Você está na página 1de 5

10/06/2019 Exercício_8.

ipynb - Colaboratory

Exercício 8 - Método de Pontos Interiores


1) Utilize o método de pontos interiores para resolver o problema de otimização abaixo:
2
minimizar f (x) = x − 4x + 4
x

sujeito a: x ≥ 3

x ≥ 0

condi ções iniciais: tol1 = 1e − 6

tol2 = 1e − 6

beta = 0.05

MI = 5

from sympy import *


from sympy.plotting import plot3d
import numpy as np
import matplotlib.pyplot as plt

# Criando as variáveis simbólicas:

x = Symbol('x')
lbd = Symbol('lbd')
mi = Symbol('mi')
s = Symbol ('s')

# Definindo a função objetivo e lagrangeano

f = x**2 - 4*x + 4 - mi*ln(s**2)


L = Matrix([f - lbd*(x - s**2 - 3)])

# Condições iniciais

sol = Matrix([10,1,1])
tol1 = 1e-6
tol2 = 1e-6
beta = 0.05
MI = 5
iteracao = 0

# Cálculo do jacobiano e hessiana

var = Matrix([x,lbd,s])
jacobiano = L.jacobian(var)
hessiana = hessian(L,var)

# Cálculo do erro

delta_y =-jacobiano.subs([(x,sol[0]),(lbd,sol[1]),(s,sol[2]),(mi,MI)])
erros = np.abs(delta_y)
maior_erro = np.max(erros)

ite=[] # criando uma lista do número de iterações para analisar a variação de mi


miplt = [] # criando uma lista para os valores de mi durante as iterações para análise

# Processo iterativo Método de Newton

while (maior_erro > tol1)and(MI > tol2):

iteracao = iteracao + 1
hessiana_atual = hessiana.subs([(x,sol[0]),(lbd,sol[1]),(s,sol[2]),(mi,MI)])
delta_x = hessiana_atual.inv()*delta_y.transpose()
sol = sol + delta_x
MI = MI*beta
delta_y = -jacobiano.subs([(x,sol[0]),(lbd,sol[1]),(s,sol[2]),(mi,MI)])
https://colab.research.google.com/drive/1bXIgz7hbvInU5sPcDsItfnXdD6UTrleX#scrollTo=uQbVb7DY40XN&printMode=true 1/5
10/06/2019 Exercício_8.ipynb - Colaboratory
erros = np.abs(delta_y)
maior_erro = np.max(erros)
miplt.append(MI)
ite.append(iteracao)

fob = f.subs([(x,float(sol[0])),(mi,MI),(s,float(sol[2]))])

plt.plot(miplt,ite)
plt.title('Variação do MI durante as iterações')
print('Valor da FOB:',fob)
print('Solução:')
print('x =',float(sol[0]))
print('mi =',MI)
print('lbd =',float(sol[1]))
print('s=',float(sol[2]))
print('Número de iterações:',iteracao)

Valor da FOB: 1.00000256941758


Solução:
x = 3.000000733965744
mi = 7.812500000000003e-08
lbd = 2.000001467931489
s= -0.0008678362487636443
Número de iterações: 6

2 2
minimizar f (x 1 , x 2 ) = (x 1 − 5) + (x 2 − 5)
x1 ,x2

sujeito a: x 1 + x 2 = 10

0 ≤ x 1 ≤ 10

0 ≤ x2 ≤ 9

2) Veri que a convexidade da função objetivo S = [0:0.1:10]


3) Resolva o problema acima utilizando o método de pontos interiores

# Criando as variáveis simbólicas:

x1 = Symbol('x1')
x2 = Symbol('x2')
x3 = Symbol ('x3')
lbd = Symbol('lbd')
mi = Symbol('mi')
su1 = Symbol ('su1')
su2 = Symbol ('su2')
piu1 = Symbol('piu1')
piu2 = Symbol('piu2')

https://colab.research.google.com/drive/1bXIgz7hbvInU5sPcDsItfnXdD6UTrleX#scrollTo=uQbVb7DY40XN&printMode=true 2/5
10/06/2019 Exercício_8.ipynb - Colaboratory
# Verificando a convexidade da função objetivo

# Definindo a função objetivo

f =(x1 - 5)**2 + (x2 - 5)**2

# Plotando o gráfico para a visualização do comportamento da função no intervalo dado:

print('Gráfico da função F(x1,x2):')


plot3d(f, (x1,0, 10.1,0.1), (x2,0, 10.1,0.1))

# Cálculo da hessiana

var = Matrix([x1,x2])
hessiana = hessian(f,var)
nr_linhas = hessiana.shape[0]
nr_colunas = hessiana.shape[1]
intervalo = np.arange(0,10.1,0.1)
cont = 0

# Analisando a convexidade da FOB no intervalo dado:

# Criando uma lista de determinantes da matriz hessiana:

det_hess = []

for a in intervalo:

while (nr_linhas and nr_colunas) > 0:

cont = cont + 1
sub_hessiana = hessiana[:nr_linhas,:nr_colunas]
det_sub = det(sub_hessiana)
det_sub = det_sub.subs([(x1,a),(x2,a)])
nr_linhas = nr_linhas - 1
nr_colunas = nr_colunas - 1
det_hess.append(det_sub)

# Transformando a lista de determinantes em um vetor:

det_hess = np.array([det_hess])

# Analisando as condições de convexidade:

if det(hessiana) >= 0:
if det(hessiana) > 0:
if np.min(det_hess) <= 0:
if np.min(det_hess) == 0:
print('F(x1,x2) é côncava')
else:
print('F(x1,x2) é extritamente côncava')
else:
if np.min(det_hess) >= 0:
if np.min(det_hess) == 0:
print('F(x1,x2) é convexa')
else:
print('F(x1,x2) é extritamente convexa')
else:
print('F(x1,x2) é simultaneamente côncava e convexa')
else:
print('para alguns pontos, F(x1,x2) não é côncava e nem convexa')

print('Número de iterações:',cont)

# Definindo a função objetivo e lagrangeano

f = (x1 - 5)**2 + (x2 - 5)**2 - mi*ln(su1**2) - mi*ln(su2**2)


L = Matrix([f + lbd*(10 - x1 - x2) + piu1*(x1 + su1**2 - 10) + piu2*(x2 + su2**2 - 9)])

# Condições iniciais

sol = Matrix([1,1,1,1,1,1,1])
tol1 = 1e-12
tol2 = 1e-12

https://colab.research.google.com/drive/1bXIgz7hbvInU5sPcDsItfnXdD6UTrleX#scrollTo=uQbVb7DY40XN&printMode=true 3/5
10/06/2019 Exercício_8.ipynb - Colaboratory
beta = 0.03
MI = 1
iteracao = 0

# Cálculo do jacobiano e hessiana

var = Matrix([x1,x2,lbd,su1,su2,piu1,piu2])
jacobiano = L.jacobian(var)
hessiana = hessian(L,var)

# Cálculo do erro

delta_y =-jacobiano.subs([(x1,sol[0]),(x2,sol[1]),(lbd,sol[2]),(su1,sol[3]),
(su2,sol[4]),(piu1,sol[5]),(piu2,sol[6]),(mi,MI)])
erros = np.abs(delta_y)
maior_erro = np.max(erros)

ite=[] # criando uma lista do número de iterações para analisar a variação de mi


miplt = [] # criando uma lista para os valores de mi durante as iterações para análise

# Processo iterativo Método de Newton

while (maior_erro > tol1)and(MI > tol2):

iteracao = iteracao + 1
hessiana_atual = hessiana.subs([(x1,sol[0]),(x2,sol[1]),(lbd,sol[2]),(su1,sol[3]),
(su2,sol[4]),(piu1,sol[5]),(piu2,sol[6]),(mi,MI)])
delta_x = hessiana_atual.inv()*delta_y.transpose()
sol = sol + delta_x
MI = MI*beta
delta_y = -jacobiano.subs([(x1,sol[0]),(x2,sol[1]),(lbd,sol[2]),(su1,sol[3]),
(su2,sol[4]),(piu1,sol[5]),(piu2,sol[6]),(mi,MI)])
erros = np.abs(delta_y)
maior_erro = np.max(erros)
miplt.append(MI) # adicionando os valores de mi na lista
ite.append(iteracao) # adicionando os número de iterações na lista

fob = f.subs([(x1,float(sol[0])),(x2,float(sol[1])),(su1,float(sol[3])),(su2,float(sol[4]

plt.plot(miplt,ite)
plt.title('Variação do MI durante as iterações')
print('Valor da FOB:',fob)
print('Solução:')
print('x1 =',float(sol[0]))
print('x2 =',float(sol[1]))
print('mi =',MI)
print('lbd =',float(sol[2]))
print('piu1 =',float(sol[5]))
print('piu2 =',float(sol[6]))
print('su1=',float(sol[3]))
print('su2 =',float(sol[4]))
print('Número de iterações:',iteracao)

https://colab.research.google.com/drive/1bXIgz7hbvInU5sPcDsItfnXdD6UTrleX#scrollTo=uQbVb7DY40XN&printMode=true 4/5
10/06/2019 Exercício_8.ipynb - Colaboratory

Gráfico da função F(x1,x2):

F(x1,x2) é extritamente convexa


Número de iterações: 2
Valor da FOB: -1.96549994467863e-12
Solução:
x1 = 5.000000000000274
x2 = 4.999999999999726
mi = 6.560999999999999e-13
lbd = 4.9207500000350784e-12
piu1 = 4.37399999987524e-12
piu2 = 5.4675000001949685e-12
su1= 2.2360679774997285
su2 = 2.0000000000000684
Número de iterações: 8

https://colab.research.google.com/drive/1bXIgz7hbvInU5sPcDsItfnXdD6UTrleX#scrollTo=uQbVb7DY40XN&printMode=true 5/5