工程数学2

实验二:最速下降法程序设计

 

一、实验目的

通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式 ;通过此次实验,进一步巩固最速下降法的基本原理和思想。

 

二、实验内容

 

  1)求解无约束优化问题:

2)终止准则取

3)完成最速下降法(负梯度法)的 MATLAB 编程、调试;

4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝试画出最优值随迭代次数变化的曲线图;

5)按照模板撰写实验报告,要求规范整洁。

 

 

三、算法步骤、代码、及结果

   1. 算法步骤

    1. 算法步骤

步骤1:给出初始点x 0,置k=0,最大迭代次数maxk=5000,精度e=1e-5,目标 函数funf及其梯度gfun

步骤2:若终止条件满足(| | gfun | | < e),则迭代停止

步骤3:计算d k = −gfun

步骤4:在d k方向上利用一维精确线性搜索Amrijo搜索求步长ak

步骤5:x k + 1 = x k + α k d k  k = k + 1,转步骤2

  

 

  1. 代码

grad.m

function [x,val,k] = grad(funf,gfun,x0)

%功能:用最速下降法求解无约束问题

%输入:funf,gfun分别是目标函数和梯度,x0是初始点

%输出:x,val分别是近似最优解和最优值,k是迭代次数

%%

maxk=5000; %最大迭代次数

rho=0.5;

sigma=0.4;

k=0;

e=1e-5; %精度

while(k<maxk)

    g=feval(gfun,x0); %计算梯度

    d=-g;

    if(norm(d)<e),break;end

    %用Amrijo搜索技术确定步长

    m=0;mk=0;

    while(m<20) %最大迭代次数

       if(feval(funf,x0+rho^m*d)<feval(funf,x0)+sigma*rho^m*g'*d)

           mk=m;

           break;

       else

           m=m+1;

       end

    end

    x0=x0+d*rho^mk;

    k=k+1;

end

x=x0;

val=feval(funf,x0);

end

 

funf.m

function f= funf(x)

%目标函数

%%

f=100*(x(1)^2-x(2))^2+(x(1)-1)^2;

end

 

gfun.m

function  g=gfun(x)

%目标函数的梯度

%%

g=[400*x(1)*(x(1)^2-x(2))+2*(x(1)-1),-200*(x(1)^2-x(2))]';

end

 

 

  1. 结果

x0=[-1.2 1]';

>> [x,val,k]=grad('funf','gfun',x0);

>> disp(['最优解:x = '])

disp(x)

disp(['此时: f(x) = ',num2str(val)])

最优解:x =

    1.0000

    1.0000

 

此时: f(x) = 1.1985e-10

disp(['迭代次数:k = ', k])

迭代次数:k = ֛

>> disp(k)

        1435

 

 

四、心得体会

在使用最速下降法时,我需要先确定初始点和学习率等参数,然后根据目标函数的梯度方向来更新当前点坐标,直到达到预设精度要求为止。

 

在实现过程中,我发现最速下降法虽然简单易于理解,但是迭代次数较多且容易陷入局部最优解。因此,在实际应用中,我需要通过合理设置学习率、调整初始点和考虑其他辅助算法等方式来提高算法效率和收敛速度。

 

此外,在本次实验中,我还学习了如何通过调试工具和可视化界面来验证算法的正确性和优化效果。这为我今后在实际应用领域中的算法设计和优化提供了有力的支持。

 

总之,通过本次实验,我深入理解了最速下降法的原理和实现方式,并掌握了常见的算法优化技巧和调试方法。这将对我的算法设计和优化能力提升产生积极的影响。

 

posted @ 2023-06-11 10:23  与孤独对酌  阅读(37)  评论(0)    收藏  举报