Professional Documents
Culture Documents
𝑋 𝐾+1 = 𝑋 𝐾 + λ𝐾 𝑑𝐾
Sendo λ o tamanho do passo dado, e d o vetor direção. Os métodos a serem abordados aqui
possuem como objetivo definir o tamanho desses saltos a cada iteração,com o mínimo de
iterações possíveis.
Método do gradiente
Método de Newton
Método DPF
Método BFGS
Método de Broyden
Código-Fonte
%Otimização Não-Linear / Problema Irrestrito
%A função é F(x) = a1x1^2 + a2x2^2
%Algoritmo:
%
%1 - Escolher um ponto inicial X0
%curva de nivel
clear;
%a = [1 1];
%a = [10 5];
a = [15 7];
[xm,ym] = meshgrid([-3:0.1:3],[-3:0.1:3]);
zm = a(1)*xm.^2 + a(2)*ym.^2;
contour(xm,ym,zm,30);
tolerancia = 10^-10;
%Ponto = rand([2,1]);
Ponto = [1; 1] ;
%Marca os pontos aonde a função vai utilizar.
lambdak = 0.001; %Tamanho do passo que vou dar.
Npassos = 0;
hold;
D = eye(2);
Ponto_Antigo = Ponto;
Ponto = Ponto + lambdak;
while(norm(grad(a,Ponto)) > tolerancia)
lambdak = cerca(a,Ponto,dk,1,10e-10)
%lambdak = 1;
Ponto_Antigo = Ponto;
Ponto = Ponto + (dk*lambdak);
Npassos = Npassos+ 1;
end;
plot(Ponto(1),Ponto(2),'r:');
funcao(a,Ponto)
Npassos
%Boyden
function D = broyden(Ponto,Ponto_Antigo,D,c)
%Considerando alfa = 0.5
A1 = bfgs(Ponto,Ponto_Antigo,D,c);
A2 = dfp(Ponto,Ponto_Antigo,D,c);
D = 0.5*A1 + 0.5*A2;
end
%BFGS
function D1 = bfgs(ponto,ponto_antigo,D,c)
p = ponto - ponto_antigo;
q = grad(ponto,c)-grad(ponto_antigo,c);
A = 1+(q’*D*q)/(q’*p)*(p*p’)/(p’*q);
B =(p*q’*D+D*q*p’)/(q’*p);
D1 = D + A - B;
end
%Cercar intervalo
function lambda = cerca(p,x,d,s,precisao)
% p -coeficientes da função
% x - ponto da função
% s - Salto
% d - Direção do passo
%s= 0.1
a = 0;
b = s;
ga = funcao(p,x+a*d);
gb = funcao(p,x+b*d);
NCF = 0;
while gb < ga
a = b;
ga = gb;
b = b+s;
gb = funcao(p,x+b*d);
NCF = NCF + 1;
end
if(NCF == 2)
elseif (NCF > 2)
a = a - s;
end
gv = funcao(p,x+V*d);
gw = funcao(p,x+W*d);
if gv<gw
b = W;
gb = gw;
else
a = V;
end
lambdaanterior = lambdaatual;
lambdaatual = (a+b)/2;
end
lambda = lambdaatual;
%DFP
function D1 = dfp(ponto,ponto_antigo,D,c)
p = ponto - ponto_antigo;
q = grad(ponto,c)-grad(ponto_antigo,c);
B = (D*q*q'*D)/(q'*D*q);
A = (p*p')/(p'*q);
D1 = D + A - B;
end
%funcao do problema
function fx = funcao(a,x)
fx = a(1)*x(1)^2 + a(2)*x(2)^2;
%grad
function dy = grad(a,x)
dy = [2*a(1)*x(1) ; 2*a(2)*x(2)];
%matriz hessiana
function z = H(a)
z = [2*a(1) 0;0 2*a(2) ];
Resultados
Método do Gradiente
Método de Newton
Método de Broyden
Conclusão
O presente trabalho mostrou que a implementação de solução de problemas não-lineares é simples e demanda um
custo computacional pequeno. Em comparação aos métodos, para equação (3) e (2), ficou claro que os métodos de
Newton e os de DFP foram muito mais eficientes do que os de Boyden, Gradiente e BFGS, deixando claro que a
eficiência do algoritmo de solução depende muito da forma como o vetor de direção e o passo é calculado.