bfgs.m

来自「BFGS变尺度算法」· M 代码 · 共 39 行

M
39
字号
function [x,y,value]=BFGS(f,x0)
% 变尺度法中的BFGS法

% 测试用例:
% syms xi yi
% f=100*(yi-xi^2)^2+(1-xi)^2;
% x0=[-2,4];

% 测试结果:
% times=38
% value=9.0342e-013
% x=1
% y=1

N=100; % 循环次数的上限 
err=0.001; % 退出循环的误差
times=1; % 循环次数

g=jacobian(f); % 梯度矩阵
xi=x0(1); yi=x0(2); % 初始点
gk=subs(g); % 初始梯度 
H=eye(2); % 初始Hesse阵
p=-gk*H'; % 初始搜索方向
[alpha,fvalue]=linesearch(f,[xi,yi],p); % 初始搜索步长

while norm(gk)>err & times<=N-1
xi=xi+alpha*p(1); yi=yi+alpha*p(2); % 新的循环点
gkk=subs(g); % 新的梯度
y=gkk-gk; s=alpha*p; % 梯度差,迭代点差
H=H+((1+(y*H*y')/(s*y'))*(s'*s)/-(H*y'*s)-(s'*y*H))/(s*y'); % H阵更新
p=-gkk*H'; % 新的搜索方向
[alpha,fvalue]=linesearch(f,[xi,yi],p); % 新的搜索步长
gk=gkk; % 更新梯度
times=times+1; % 循环次数加1
end

value=fvalue; % 最终的函数值(极小值)
x=xi+alpha*p(1); % 极小值点
y=yi+alpha*p(2);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?