实验二:最速下降法程序设计
一、实验目的
通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向 的定义和最速下降法的迭代公式;通过此次实验,进一步巩固最速下降法的基本 原理和思想。
二、实验内容
(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. 代码
grad.m
function [x,val,k] = grad(funf,gfun,x0)
%功能:用最速下降法求解无约束问题
%输入:funf,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(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
四,心得体会
可以发现,与实验一中的结果相比,最速下降法的迭代次数更多,但在这个问题上仍旧表现不错。同时,我们也发现,步长alpha的选取在最优值的求解过程中极其关键,在实现中需要仔细调整。最终,我们得到了代表最优解的点,以及该点对应的最优值。
标签:最优,上机,工程,gfun,最速,funf,数学,x0,迭代 From: https://www.cnblogs.com/zyzyzrp/p/17472519.html