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

一、实验目的

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

二、实验内容

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

(2)终止准则取;

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

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

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

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

1. 算法步骤

(1)最速下降法Matlab的实现;
(2)学会分析实验结果;
(3)撰写实验报告;

2. 代码

Grad.m文件

   function [x,val,k] = grad(fun,gfun,x0)
       %功能:用最速下降法求解无约束问题 minif(x)
       %输入:fun,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(fun,x0+rho^m*d)<feval(fun,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(fun,x0);
       disp(['迭代次数:k='])
       disp(k)
       end

Fun.m文件

    function f= fun(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

3. 结果

迭代次数:

        k=
       1435

       最优解:x =
       1.0000
       1.0000
   此时: f(x) = 1.1985e-10
posted @ 2023-06-07 21:45  YE-  阅读(68)  评论(0编辑  收藏  举报