function [x,val,k]=grad(fun,gfun,x0)
%功能:用最速下降法求解无约束问题:min f(x)
%输入:x0是初始点, fun,gfun分别是目标函数和梯度
%输出:x, val分别是近似最优点和最优值, 1 k是迭代次数。
maxk=5000; %最大迭代次数
rho=0.5;sigma=0.4;
k=0;epsilon=1e-5;
while (k<maxk)
g=feval(gfun,x0);%计算梯度
d=-g; %计算搜索方向
if(norm(d)<epsilon),break; end
m=0; mk=0;
while(m<20) %Armij0搜索新
if(feval (fun,x0+rho^m*d)<feval (fun,x0)+sigma*rho^m*g'*d)
mk=m; break;
end
m=m+1;
end
x0=x0+rho^mk*d;
k=k+1;
end
x=x0;
val=feval (fun,x0);
function f=fun(x)
f=100*(x(2)-x(1)^2)^2+(x(1)-1)^2;
function g=gfun(x)
g=[2*x(1)-400*x(1)*(x(2)-x(1)^2)-2,200*(x(2)-x(1)^2)]';
命令行窗口调用
>> x0=[-0.5,1]';[x,val,k]=grad('fun','gfun',x0)
运行结果:
x =
1.0000
1.0000
val =
1.1966e-10
k =
1655