function [x, k] = BFGS(xk, H0, kmax, fun, grd, Armjio)
exp = 1e-6;
k = 0;
Hk = H0;
gk = feval(grd, xk);
while k <= kmax
if norm(gk) < exp
break;
end
dk = -Hk * gk;
alpha = feval(Armjio, fun, grd, xk, dk);
x_ = xk; %上一步xk
xk = x_ + alpha * dk;
g_ = gk; %上一步gk
gk = feval(grd, xk);
sk = xk - x_;
yk = gk - g_;
if sk' * yk > 0
v = yk' * sk;
Hk = Hk + (1 + (yk' * Hk * yk) / v) * (sk * sk') / v - (sk * yk' * Hk + Hk * yk * sk') / v;
end
k = k + 1;
end
x = xk;
end
评论0