function [xk,oldf,history] = BFGS(func,xk,epsilon,iter)
% quasi-Newton method
oldf = feval(func,xk);
% begin
n = length(xk);
Bk = eye(n);% hessian
grad = fgrad(func,xk); % gradient
for t = 1:iter
dk = -Bk\grad; % direction
ak = armijo(func,xk,dk,grad);% step
new_xk = xk + ak*dk';
newf = feval(func,new_xk);
new_grad = fgrad(func,new_xk); % gradient
if(norm(grad)<epsilon)
break;
end
yk = new_grad - grad;
sk = new_xk' - xk';
if(yk'*sk>0)
Bk = Bk - (Bk*sk*sk'*Bk)/(sk'*Bk*sk) + (yk*yk')/(yk'*sk);
end
xk = new_xk;
oldf = newf;
grad = new_grad;
history(t)=oldf;
fprintf('iter=%d ObjVal=%g\n',t,oldf);
end
end
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
MATLAB拟牛顿BFGS代码.rar (5个子文件)
BFGS代码
main.m 224B
fgrad.m 253B
Rosenbrock.m 135B
armijo.m 305B
BFGS.m 760B
共 5 条
- 1
快乐的小鸡
- 粉丝: 13
- 资源: 4
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页