每天一个小算法(matlab armijo)
下面是 armijo线搜索+最速下降法的小程序,matlab用的很不熟,费了不少劲。
函数:
function g=fun_obj(x) syms a b f = 1/2*a^2+b^2-a*b-2*a; a=x(1);b=x(2); g=eval(f);
求梯度:
function g=fun_grad(x) syms a b f = 1/2*a^2+b^2-a*b-2*a; gradient = jacobian(f,[a,b]); a = x(1);b = x(2); g = eval(gradient);
armijo线搜索:
function mk = armijo( xk, rho, sigma, d ) assert( rho > 0 && rho < 1 ); assert( sigma > 0 && sigma < 0.5 ); mk = 0; max_mk = 100; while mk <= max_mk x = xk + rho^mk * d; if fun_obj( x ) <= fun_obj( xk ) + sigma * rho^mk *fun_grad(xk)*d'; break; end mk = mk + 1; end return;
主程序:
function result = armijograd(x0) max_iter = 5000; % max number of iterations EPS = 1e-6; % threshold of gradient norm rho = 0.45; sigma = 0.2; % Armijo parameters k = 0; xk = x0; % initialization while k < max_iter k = k + 1; dk = fun_grad( xk ); % gradient vector d = -1 * dk; % search direction if norm( dk ) < EPS %precision break; end mk = armijo( xk, rho, sigma, d); %armijo line search xk = xk + rho^mk * d; %update end result = xk; return;
最终结果是:[4,2]';程序正确。