最速下降法无约束最优化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《MATLAB 程序设计实践》课程考核
实践一、编程实现以下科学计算法,并举一例应用之。(参考书籍《精通MATLAB 科学计算》,王正林等著,电子工业出版社,2009年)
“最速下降法无约束最优化”
最速下降法:
解: 算法说明:最速下降法是一种沿着N 维目标函数的负梯度方向搜索最小值的方法。
原理:由高等数学知识知道任一点的负梯度方向是函数值在该点下降最快的方向,那么利用负梯度作为极值搜索方向,达到搜寻区间最速下降的目的。而极值点导数性质,知道该点的梯度=0,故而其终止条件也就是梯度逼近于0,也就是当搜寻区间非常逼近极值点时,即:当▽f(a )→0推出f(a )→极值)(x f ,f(a )即为所求。该方法是一种局部极值搜寻方法。
函数的负梯度表示如下:
-g(x )=-▽f(x)=-⎢⎣⎡∂∂1
)(x x f 2)(x x f ∂∂ … T N x x f ⎥⎦⎤∂∂)(
搜索步长可调整,通常记为αk (第k 次迭代中的步长)。该算法利用一维的线性搜索方法,如二次逼近法,沿着负梯度方向不断搜索函数的较小值,从而找到最优解。
方法特点(1)初始值可任选,每次迭代计算量小,存储量少,程序简短。即使从一个不好的初始点出发,开始的几步迭代,目标函数值下降很快,然后慢慢逼近局部极小点。(2)任意相邻两点的搜索方向是正交的,它的迭代路径胃绕道逼近极小点。当迭代点接近极小点时,步长变得很小,越走越慢。(3)全局收敛,线性收敛,易产生扭摆现象而造成早停。
算法步骤:最速下降法的基本求解流程如下:
第一步
迭代次数初始化为k=0,求出初始点0x 的函数值f 0=f (0x )。
第二步
迭代次数加1,即k=k+1,用一维线性搜索方法确定沿负梯度方向-1-k g 的步长1k -α,其中1k -α=ArgMinaf (111k /----k k g g x α)。
第三步
沿着负梯度方向寻找下一个接近最小值的点,其中步长为1k -α,得到下一点的坐标为:1111/-----=k k k k k g g x x α。
第四步
如果k x ≈1-k x ,且f (k x )≈f (1-k x ),那么就认为k x 为所求的最小值点,并结
束循环;否则,就跳到步骤二。
流程图:
题目:
最速下降法求解无约束最优化问题实例。采用最速下降法求如下函数的最小值问题:
f(x,y)=x(x-5-y)+y(y-4)
即用最速下降法求解函数的最小值问题。
解:需先求出该函数的梯度函数。可知其梯度函数为:g(x)=(2x-5-y,-x+2y-4)。
源程序代码如下:
Opt_Steepest.m文件
%用最速下降法求最优化解;
function [xo,fo]=Opt_Steepest(f,grad,x0,TolX,TolFun,dist0,MaxIter)
%f:函数名;
%grad:梯度函数;
%x0:搜索初始值;
%TolX:最优值点间的误差阈值;
%TolFun:函数的误差阈值;
%dist0:初始步长;
%MaxIter:最大的迭代次数;
%xo:最优化点值;
%fo:函数在点xo处的函数值。
%%%%%%判断输入的变量数,设定一些变量为默认值
if nargin<7
MaxIter=100; %最大的迭代次数默认为100
end
if nargin<6
dist0=10; %初始步长默认为10
end
if nargin<5
TolFun=1e-8; %函数值误差为1e-8
end
if nargin<4
TolX=1e-6; %自变量距离误差
end
x=x0;
fx0=feval(f,x0);
fx=fx0;
dist=dist0;
kmax1=25; %线性搜索法确定步长的最大搜索次数
warning=0;
%%%%%迭代计算求最优解
for k=1:MaxIter
g=feval(grad,x);
g=g/norm(g); %求点x处的梯度
%%线性搜索方法确定步长
dist=dist*2;
fx1=feval(f,x-dist*2*g);
for k1=1:kmax1
fx2=fx1;
fx1=feval(f,x-dist*g);
if fx0>fx1+TolFun && fx1 den=4*fx1-2*fx0-2*fx2;num=den-fx0+fx2;%二次逼近法 dist=dist*num/den; x=x-dist*g;fx=feval(f,x); %确定下一点 break; else dist=dist/2; end end if k1>=kmax1 warning=warning+1; %无法确定最优步长 else warning=0; end if warning>=2||(norm(x-x0) break; end x0=x; fx0=fx; end xo=x;fo=fx; if k==MaxIter fprintf('Just best in %d iteration',MaxIter); end Q1.m文件 f1004=inline('[x(1)*(x(1)-5-x(2))+x(2)*(x(2)-4)]','x'); %目标函数grad=inline('[2*x(1)-5-x(2),-x(1)+2*x(2)-4]','x'); %目标函数的梯度函数x0=[1 4]; TolX=1e-4; TolFun=1e-9; MaxIter=100; dist0=1; [xo,fo]=Opt_Steepest(f1004,grad,x0,TolX,TolFun,dist0,MaxIter)