4.19

所花时间:4小时

代码量:26

博客篇:1

最速下降法程序设计

一、实验目的

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

 

 

二、实验内容

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. 代码

 

function [k,x,val]=grad(fun,gfun,x0,epsilon) %功能:梯度法求解minf(×) 
%输入:fun,gfun分别是目标函数及其梯度,x0是初始点,epsilon为容许误差
%输出k是迭代次数.×, va1分别是沂似最优点和最优值
maxk=5000;
beta=0.5; sigma=0.4;
k=0;
while(k<maxk) 
gk=feval(gfun,x0); 
dk=-gk;
%最大迭代次数
%计算梯度
%计算搜索方向
if(norm(dk)<epsilon)break;end 
%检验终止准则
m=0;mk=0;
while(m<20) %用Armij搜索求步长
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-04-19 20:45  umiQa  阅读(3)  评论(0编辑  收藏  举报