1. Método Quase-Newton
O método Quase-Newton é baseado em regras recursivas para formação de
uma matriz Hessiana (Hk) que é correspondente a uma estimativa de sua inversa.
‘Deve-se ter em mente que é obrigatório a matriz Hk seja sempre positiva.
Com as características citadas anteriormente foram definidos dois métodos
eficientes: DFP (Davidon-Fletcher-Powell) e o método BFGS (Broyden-Fletcher-
Goldfarb-Shanno) em homenagem aos seus formuladores. Existe, no entanto, uma
conexão entre esses dois métodos e criou-se então a Família de Broyden que contém
os dois métodos agrupados.
Método DFP
Observa-se o método DFP a seguir:
𝐶 𝑘
𝐷𝐹𝑃
= (𝑣 𝑘 𝑣 𝑘′/ 𝑣′ 𝑘 𝑟𝑘) – (𝐻 𝑘 𝑟𝑘 𝑟′ 𝑘 𝐻𝑘 /𝑟′ 𝑘 𝐻 𝑘 𝑟𝑘)
Método BFGS
O método BFGS é mostrado abaixo:
𝐶 𝑘
𝐵𝐹𝐺𝑆
= (1 + (𝑟′ 𝑘 𝐻 𝑘 𝑟𝑘/𝑟′ 𝑘 𝑣 𝑘) *
(𝑣 𝑘 𝑣 𝑘′)
(𝑣′
𝑘 𝑟 𝑘)
-
(( 𝑣 𝑘 𝑟′
𝑘 𝐻 𝑘)+ ( 𝐻 𝑘 𝑟𝑘 𝑣′
𝑘))
(𝑟′
𝑘 𝑣 𝑘)⁄
Família de Broyden
No método de Broyden utiliza-se uma correção dada por:
𝐶 𝑘 = (1 – α) 𝐶 𝑘
𝐷𝐹𝑃
+ α𝐶 𝑘
𝐵𝐹𝐺𝑆
No entanto, deve-se utilizar a fórmula para a estimativa da inversa da
Hessiana:
𝐻 𝑘+1 = 𝐻 𝑘 + 𝐶 𝑘 (α)
Enquanto α = 0 teremos o método de DFP e quando α = 1 teremos o método
BFGS.
2. Código Algoritmo Quase-Newton em Matlab
% Entradas:
% (1) A dimensionalidade dafunçãode múltiplasvariáveis.
% (2) Funçãono formatoadequado.
% OBS -> Nota:Por favor,garantirque a função inseridaestáno formatolegível peloMATLAB.
Este é o únicopontoem que há possibilidade de erromáximo.
% (3) vetorde aproximaçãoinicial.
% Nota:Garanta que a dimensionalidadecoincidecomdimensãode vetorde
aproximaçãoinicial.
% (4) Erro de tolerância
disp('Gostariade limparoseuespaçode trabalhode memóriae telade comando?');
z=input('Parafazerissodigite 1,qualqueroutronúmeroparacontinuar:');
if z==1
clc;clear
end
escolha=input('Parafazerumamaximizaçãoinserir1,para a minimizaçãodigite2:');a=2; %
coeficientea,dafunção;
while a==2
if escolha~=1&&escolha~=2
disp('Entradaerrada');a=2;
escolha=input('Parafazeramaximixaçãodigite 1,paraminimizardigite 2:');
else
a=1;
end
end
a=2;mark=0;flag=0;count=0;symsb;u=[];warningoff all
try
while a==2
4. disp('A dimensãodaaproximaçãoinicialé incorreto!');a=2;
x0=(input('Digiteaaproximaçãoinicial comovetorlinhade variaveis'));
else
a=1;
end
end
try
eps=abs(input('Digite umerrode tolerancia'));
catch
disp('Digite umnúmeroreal!');
end
g=f;
try
for i=1:n
h(i)=diff(g,['x'num2str(i)]);
forj=1:n
k(i,j)=diff(h(i),['x'num2str(j)]);
end
end
catch
disp('Seuproblemade otimizaçãonãopode serresolvido');
return
end
disp('MatrizHessianadafunção=')
if escolha==1
disp(-k)
elseif escolha==2
5. disp(k)
end
for i=1:n
for j=1:n
if i==j
d=det(-k(1:i,1:j));
if escolha==1
d=-d;
end
SOL=solve(d);
if str2num(char(d))<=0
mark=mark+1;u=[u i];
elseif isempty(SOL)==0
for m=1:length(SOL)
if isreal(SOL(m))==1||isa(SOL(m),'sym')
mark=mark+1;
if (isempty(find(u==i,1)))
u=[ui];
end
end
end
end
end
end
end
if mark>0
if escolha==1
6. fprintf('nO%gthmenorprincipal daHessiananãoé negativoparatoda reta real x!n',u);
fprintf('Entãoafunçãonãoé côncava globalmente,assimamaximizaçãonãoé
garantida!n');
elseif escolha==2
fprintf('nThe %gthmenorprincipal da Hessiananãoé positivoemtodaretareal x!n',u);
fprintf('Entãoafunção nãoé convexaglobalmente,e assimaminimizaçãoglobal nãoé
garantida!n');
end
else
if escolha==1
fprintf('nTodososmenoresprincipaisdaHessianasãonegativos,entãoafunçãoé
côncava globalmente!n');
disp('Assimamaximizaçãoglobal é possível!');
elseif escolha==2
fprintf('nTodososmenoresprincipaisdasHessianasãopositivos,assimafunçãoé
convexaglobalmente!n');
disp('Assimaminimizaçãoglobalé possível!');
end
end
X=x0;
if mark>0
S=eye(n);
else
S=k;
for i=1:n
S=(subs(S,['x'num2str(i)],X(i)));
end
end
7. %S=input('Digite umamatrizdefinidapositiva');
if n==2
A=[];B=[];C=f;
end
while flag~=1
count=count+1;steplength=0;
grad=h';fprintf('n-------------------------%gthIteração------------------nnn',count) % gth,
significan-ésimaposiçãoouposição;
if n==2
A=[A X(1)];B=[BX(2)];
end
for i=1:n
grad=subs(grad,['x'num2str(i)],X(i));
end
disp('pontoatual:');disp(X);
disp('Gradiente=');
if escolha==1
disp(-grad)
elseif escolha==2
disp(grad)
end
if max(abs(grad))>eps
fprintf('nA tolerânciade erroque você forneceunãofoi alcançadoaindan');
flag=input('Paraterminardigite1,senãooutronumeropara continuar:');
end
if flag==1
hes=k;
fori=1:n
8. hes=subs(hes,['x'num2str(i)],X(i));
end
fprintf('nn..........Resultado...........nn')
if length(find(eig(hes)>0))==length(eig(hes))
disp('Nopontoatual afunção é convexaentãoeladevaserum minimolocal !');
elseiflength(find(eig(hes)<0))==length(eig(hes))
disp('Nopontoatual afunção é concava assimeladevaseruma maximolocal');
else
disp('OPontoatual nãoé um EXTREMO local (pontocrítico)!');
end
disp('Atualmente,amatriz hessianaé:');
if escolha==1
disp(-hes)
elseifescolha==2
disp(hes)
end
fprintf('Opontoótimoem%gthoerroé:n',max(abs(grad)));
disp(X);
fori=1:n
f=subs(f,['x'num2str(i)],X(i));
end
fprintf('ne ovalordafunçãoaqui é:n');
if escolha==1
disp(-f)
elseifescolha==2
disp(f)
end
9. fprintf('Onúmerototal de iteraçõesrealizada=%gn',count);
end
if max(abs(grad))<=eps
fprintf('nnA tolerânciade erroque você forneceufoi alcançado.n');
hes=k;
fori=1:n
hes=subs(hes,['x'num2str(i)],X(i));
end
fprintf('nn..........Resultado...........nn')
if length(find(eig(hes)>0))==length(eig(hes))
disp('Alémdisso,nopresente momento,afunção é convexaporissopode serum
mínimolocal !');
elseiflength(find(eig(hes)<0))==length(eig(hes))
disp('Alémdisso,nopresente momento,afunçãoé côncava de modoque pode serum
máximolocal !');
else
disp('No entanto,opresentepontonãoé um pontoextremolocal !');
end
disp('Atualmente amatrizhesseanaé:');
if escolha==1
disp(-hes)
elseifescolha==2
disp(hes)
end
fprintf('Opontootimo em%gOerro é:n',max(abs(grad)));
disp(X);
fori=1:n
f=subs(f,['x'num2str(i)],X(i));
10. end
fprintf('nEaqui ovalorda funçãoé:n');
if escolha==1
disp(-f)
elseifescolha==2
disp(f)
end
fprintf('Onúmerototal de iteraçõesrealizada=%gn',count);flag=1;
elseif max(abs(grad))>eps&&flag~=1
fun=f;dir=-S*grad;
fori=1:n
fun=subs(fun,['x'num2str(i)],X(i)+b*dir(i));
end
diff(fun,b);
d=solve(diff(fun,b));
if isempty(d)==1
steplength=1;
else
t=double(d);
dd=diff(diff(fun,b));
fori=1:length(t)
if isreal(t(i))==1
if subs(dd,'b',t(i))>0
steplength=t(i);break
end
end
end
11. if steplength==0
for i=1:length(t)
if isreal(t(i))==1
if t(i)>0
steplength=t(i);break
end
end
end
end
if steplength==0
steplength=1;
end
end
funct=f;
fori=1:n
funct=subs(funct,['x'num2str(i)],X(i));
end
disp('Valorfuncional(dafunção) atualmente=');
if escolha==1
disp(-funct)
elseifescolha==2
disp(funct)
end
disp('Tamanhodopassotomado=');disp(steplength);
X=X+steplength*dir;p=steplength*dir;
grad_new=h';
fori=1:n
12. grad_new=subs(grad_new,['x'num2str(i)],X(i));
end
q=grad_new-grad;
S=S-(S*q*q'*S)/(q'*S*q)+(p*p')/(p'*q);
if count>100
disp('Você jádeve terfeito100iteraçõese parece que nenhumextremodafunção
existe!');
flag=input('Érecomendável paravocê encerraro processo,afazê-lo,digitando1,ou
qualqueroutronúmeroparacontinuar:');
end
end
end
try
if n==2&&length(A)>=2
[a,b]=meshgrid(A,B);C=subs(C,{x1,x2},{a,b});
view([-50,30]);axistight;holdon
surfc(a,b,C,'facecolor','green','edgecolor','b','facelighting','gouraud')
view([-50,30]);axistight;shadinginterp;
plot(A,B,'-mo',...
'LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[.491 .63],...
'MarkerSize',12);
end
catch
disp('Nãofoi possível geraro"plot"de função(plotara função) !');
end