每天一个小算法(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]';程序正确。

上一篇:基于sentry的前端错误监控日志系统(部署sentry服务器/前端项目部署)-让前端最快的定位到生产问题


下一篇:一排div*下落