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

  • 相关阅读:
    Xamarin Layout属性(转)
    Oracle基础
    tableViewNestTableView(tableView嵌套collectionView)
    抓包工具Fiddler的使用教程(五): 修改response的数据 .
    Web调试利器fiddler
    SQLServer光标
    SQLServer触发器
    web端功能测试总结(一)
    web功能测试
    test zlj
  • 原文地址:https://www.cnblogs.com/batteryhp/p/5020507.html
Copyright © 2020-2023  润新知