function[x,val,k]=bfgs(fun,gfun,X0)
%功能:用BFGS法求无约束问题最小值?
%输入:x0是初始点,fun和gfun分别是目标函数和梯度?
%输出:x、val分别是最优点和最优值,k是迭代次数?
maxk=5000;%最大迭代次数?
rho=0.5;sigma=0.4;k=0;
eps=10e-6;%精度
n=length(X0);%给出初始矩阵
Bk=eye(n);
while(k<maxk)
gk=feval(gfun,x0);
if(norm(gk)<eps)
break;
end
dk=-Bk*gk';
m=0;mk=0;
while(m<20)
new=sigma*rho^m*gk*dk;
old=feval(fun,x0);
if(feval(fun,x0+rho^m*dk')<feval(fun,x0)+sigma*rho^m*gk*dk)
mk=m;break;
end
m=m+1;
end
%BFGS校正
x=x0+rho^mk*dk';
sk=x-x0;
yk=feval(gfun,x)-gk;
if(yk'*sk>0)
Bk=Bk-(((Bk*sk')*sk)*Bk)/(sk*Bk*sk')+(yk'*yk)/(yk*sk');
end
k=k+1;
x0=x;
end
val=feval(fun,x0);
end
- 1
- 2
- 3
- 4
前往页