Sunteți pe pagina 1din 1

function

[u,costo]=algoBFGS(u0,epsilon,maxitre,c1,c2,H0,k,alpha,S,A,b,a,d,c,p,beta,h)
H=H0;
uaux=u0;
error=norm(evaluaciondelgraddeF(uaux,S,A,b,a,d,c,alpha),inf);
while (error>=epsilon) && k<maxitre
Hk=H;
%direccion de descenso
pk=-H*evaluaciondelgraddeF(uaux,S,A,b,a,d,c,alpha)';
%busqueda lineal
ak=1/2;
unext=uaux+ak.*pk';
while (evaluaciondeF(unext,S,A,b,a,d,c,alpha)>
evaluaciondeF(uaux,S,A,b,a,d,c,alpha)+...
c1*ak*evaluaciondelgraddeF(uaux,S,A,b,a,d,c,alpha)*pk) | ...
(evaluaciondelgraddeF(unext,S,A,b,a,d,c,alpha)*pk<
c2*evaluaciondelgraddeF(uaux,S,A,b,a,d,c,alpha)*pk)
ak=ak/2;
unext=uaux+ak.*pk';
if ak < 0.001
break;
end
end
sk=unext-uaux;
yk=evaluaciondelgraddeF(unext,S,A,b,a,d,c,alpha)-
evaluaciondelgraddeF(uaux,S,A,b,a,d,c,alpha);
rhok=1/(yk*sk');
H=(H0- rhok.*(sk'*yk))*Hk*(H0- rhok.*(yk'*sk))+ rhok.*(sk'*sk);
uaux=unext;%evaluacion de u_k+1
error=norm(evaluaciondelgraddeF(uaux,S,A,b,a,d,c,alpha),inf);
k=k+1;
end
u=-uaux;
costo=evaluaciondeJ(u,S,A,b,c,alpha,beta,p,h);
end

S-ar putea să vă placă și