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
步骤5:x 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);