采用Armjio非精确线搜索准则的最速下降法--MATLAB实现

Posted Z.Q.Feng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了采用Armjio非精确线搜索准则的最速下降法--MATLAB实现相关的知识,希望对你有一定的参考价值。


Armjio线搜索求步长

可参靠作者另外一篇博客:采用非精确线搜索求步长的Armjio准则–MATLAB实现


最速下降法

代码如下:

function [f, xk, k] = SD(x0, fun, grid, eps, kmax)
    %
    % function [f, xk, k] = SD(x0, fun, grid, eps, kmax)
    % 求出函数fun从初始点x0处以负梯度方向为下降方向,
    % 采用 Armjio 准则计算迭代步长,求出函数的极小点
    % ---------------------------------------------------
    % 输入:
    %     x0    初始点(列向量)
    % 	fun 	函数文件名称(字符变量)
    %		grid 	梯度函数文件名称(字符变量)
    %		eps   函数在迭代点处的下降方向(列向量)
    %     kmax  函数的最大迭代次数
    %
    % 输出:
    %		f	    函数在极小值 xk 处的目标函数值
    %		xk		函数采用此方法求得的极小点
    %	  	k		  求极小点算法迭代次数
    % ---------------------------------------------------
    % by Zhi Qiangfeng 
    %
    k = 0;
    xk = x0;
    gk = feval(grid, xk);
    while k <= kmax
        if norm(gk) < eps
            break;
        end
        dk = -gk; % 选取此处的负梯度方向作为下降方向
        % 采用 Armjio 准则求步长
        alpha = Armjio(fun, grid, xk, dk);
        xk = xk + alpha * dk; % 更新迭代点
        gk = feval(grid, xk); % 更新梯度值
        k = k + 1;
    end
    f = feval(fun, xk);
end

输出示例

>> x0 = [10; 1];
>> eps = 1e-4;
>> kmax = 10000;
>> [f, xk, k] = SD(x0, "fun", "grid", eps, kmax)

f =  0.000000020329

xk =

   0.99986
   0.99957

k =  2238

>>

最优化相关算法设计数学原理:最优化/Optimization文章合集


有帮助可以点赞哦,谢谢大家的支持~

以上是关于采用Armjio非精确线搜索准则的最速下降法--MATLAB实现的主要内容,如果未能解决你的问题,请参考以下文章

采用Armjio非精确线搜索求步长的FR非线性共轭梯度法--MATLAB实现

采用Armjio非精确线搜索求步长的FR非线性共轭梯度法--MATLAB实现

采用非精确线搜索求步长的Armjio准则--MATLAB实现

采用非精确线搜索求步长的Armjio准则--MATLAB实现

最速下降法和牛顿法求解多元非线性函数的最优值

最速下降法和牛顿法求解多元非线性函数的最优值