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

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

一、实验目的

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

 

二、实验内容

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

(2)终止准则取

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

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

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

  

 

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

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

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

  

2. 代码

grad.m

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

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

%输入:funfgfun分别是目标函数和梯度,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

 

3. 结果

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-05-17 15:18  STDU_DREAM  阅读(291)  评论(0编辑  收藏  举报