2024.6.3

所学时间:2小时

代码行数:32

博客园数:1篇

所学知识:今天继续完成工程数学的最速下降法的实验。

实验目的

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

二、实验内容

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

2)终止准则取

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

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

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

 

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

1. 算法步骤

定义目标函数 fun 和目标函数的梯度 gfun

(1) grad 函数中,设定最大迭代次数 maxk,学习率 beta Armijo准则参数 sigma

(2).初始化迭代次数 k,并在迭代次数小于 maxk 时执行循环。

(3).计算当前点 x0 处的梯度 gk

(4).计算负梯度方向 dk

(5).如果梯度的2范数小于设定阈值 epsilon,则结束迭代。

(6).初始化Armijo条件搜索参数,设定最大搜索次数为 20

(7).在最大搜索次数内,利用Armijo准则搜索最优的步长 beta。更新 x0

(8).增加迭代次数 k

(9).返回最终结果 x0 和目标函数在最优点的值。

2. 代码

function f= fun(x)

%目标函数x

f=(x(1)+10*x(2))^2+5*(x(3)-x(4))^2+(x(2)-2*x(3))^4+10*(x(1)-x(4))^4;

end

function  g=gfun(x)

%目标函数的梯度

g=[2*(x(1)+10*x(2))+40*(x(1)-x(4))^3;

    20*(x(1)+10*x(2))+4*(x(2)-2*x(3))^3;

    10*(x(3)-x(4))-8*(x(2)-2*x(3))^3;

    -10*(x(3)-x(4))-40*(x(1)-x(4))^3];

end

 

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

maxk=500000;

beta=0.5;   sigma=0.4;

k=0;

while(k<maxk)

    gk=feval(gfun,x0);

    dk=-gk;

    if(norm(gk)<epsilon)  break;end

    m=0;mk=0;

    while(m<20)

        if(feval(fun,x0+beta^m*dk)<=feval(fun,x0)+sigma*beta^m*gk'*dk)

            mk=m;break;

        end

        m=m+1;

    end

    x0=x0+beta^mk*dk;

    k=k+1;

end

x=x0;

val=feval(fun,x0);

 

posted @ 2024-06-03 19:16  kuku睡  阅读(7)  评论(0编辑  收藏  举报