function [x delta] = BFGS_exact(f_origin,C,lambda,mu)
% BFGS法确定多个变量的最优解
%
% 输入:
% x0:当前点;
% Iter_max:最大迭代次数;
% 输出:
% x:最优解;
%
Iter_max = 20; %函数参数的个数,x1,x2,x3...的个数
x0 = [1,1]; %初始值
eps = 1e-2; %迭代容忍度
ite = 1; % 循环次数
f111 = f_origin-lambda.*C+mu.*(C)^2/2;
g111=gradient(f111);
gk = BFGS_Gradient(g111,x0); % 初始梯度
H = eye(length(x0)); % 初始H阵
d = -gk*H'; % 初始搜索方向
alpha = exact_buchang(f111,x0,d'); % 初始搜索步长
while norm(gk) > eps && ite< Iter_max
x0 = x0 + alpha.*d; % 新的循环点
gkk = BFGS_Gradient(g111,x0); % 新的梯度
y = gkk - gk; % 梯度差
s = alpha.*d; % 迭代点差
H = H + (1 +(y*H*y')/(s*y'))*(s'*s)/(s*y') - (s'*y*H + H*y'*s)/(s*y'); %H阵更新
d = -gkk*H'; % 新的搜索方向
alpha = exact_buchang(f111,x0,d'); % 新的搜索步长
gk = gkk; % 更新梯度
ite = ite + 1; % 循环次数加1
end
x = x0 + alpha.*d; % 极小值
delta=BFGS_Gradient(g111,x);
% 梯度矩阵
function g = BFGS_Gradient(g11,x0)
temp = sym('x',[1,2]);
g=(double(subs(g11,temp,x0)))';
end
end