一、实验目的
通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代公式;通过此次实验,进一步巩固最速下降法的基本原理和思想。
二、实验内容
(1)求解无约束优化问题:
(2)终止准则取;
(3)完成最速下降法(负梯度法)的MATLAB编程、调试;
(4)要求选取多个不同的初始点,并给出迭代次数,最优函数值等相关信息,有能力的同学尝试画出最优值随迭代次数变化的曲线图;
(5)按照模板撰写实验报告,要求规范整洁。
三、算法步骤、代码、及结果
1. 算法步骤
(1)最速下降法Matlab的实现;
(2)学会分析实验结果;
(3)撰写实验报告;
2. 代码
Grad.m文件
function [x,val,k] = grad(fun,gfun,x0)
%功能:用最速下降法求解无约束问题 minif(x)
%输入:fun,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(fun,x0+rho^m*d)<feval(fun,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(fun,x0);
disp(['迭代次数:k='])
disp(k)
end
Fun.m文件
function f= fun(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. 结果
迭代次数:
k=
1435
最优解:x =
1.0000
1.0000
此时: f(x) = 1.1985e-10
标签:迭代,下降,次数,实验,程序设计,最优,最速
From: https://www.cnblogs.com/yzx-sir/p/17464679.html