最优化方法实验报告(2)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最优化方法实验报告Numerical Linear Algebra And Its Applications
学生所在学院:理学院
学生所在班级:计算数学10-1
学生姓名:甘纯
指导教师:单锐
教务处
2013年5月
实验三
实验名称: 无约束最优化方法的MATLAB 实现 实验时间: 2013年05月10日 星期三 实验成绩:
一、实验目的:
通过本次实验的学习,进一步熟悉掌握使用MATLAB 软件,并能利用该软件进行无约束最优化方法的计算。
二、实验背景:
(一)最速下降法
1、算法原理
最速下降法的搜索方向是目标函数的负梯度方向,最速下降法从目标函数的负梯度方向一直前进,直到到达目标函数的最低点。
2、算法步骤
用最速下降法求无约束问题n R x x f ∈,)(min 的算法步骤如下: a )给定初始点)0(x ,精度0>ε,并令k=0;
b )计算搜索方向)()()(k k x f v -∇=,其中)()(k x f ∇表示函数)(x f 在点)(k x 处的梯度;
c )若ε≤)(k v ,则停止计算;否则,从)(k x 出发,沿)(k v 进行一维搜索,
即求k λ,使得)(min )()()(0
)()(k k k k v x f v x f λλλ+=+≥; d )令1,)()()1(+=+=+k k v x x k k k k λ,转b )。
(二)牛顿法
1、算法原理
牛顿法是基于多元函数的泰勒展开而来的,它将)()]([-)(1)(2k k x f x f ∇∇-作为搜索方向,因此它的迭代公式可直接写出来:
)()]([)(1)(2)()(k k k k x f x f x x ∇∇-=-
2、算法步骤
用牛顿法求无约束问题n R x x f ∈),(min 的算法步骤如下: a )给定初始点)0(x ,精度0>ε,并令k=0;
b )若ε≤∇)()(k x f ,停止,极小点为)(k x ,否则转
c );
c )计算)()]([,)]([)(1)(2)(1)(2k k k k x f x f p x f ∇∇-=∇--令;
d )令1,)()()1(+=+=+k k p x x k k k ,转b )。
(三)共轭梯度法
1、算法原理
共轭梯度法是利用目标函数梯度逐步产生共轭方向作为线搜索方向的方法,每次搜索方向都是在目标函数梯度的共轭方向,搜索步长通过一维极值算法确定。
2、算法步骤
a )给定初始点)0(x ,精度0>ε;
b )若ε≤∇)()0(x f ,停止,极小点为)0(x ,否则转
c ); c )0()0()0(=-∇=k x f p ),且置取;
d )用一维搜索方法求k t ,使得
)(min )()()(0
)()(k k t k k k tp x f p t x f +=+≥ 令)
()()1(k k k k p t x x +=+,转e );
e )若ε≤∇+)()1(k x
f ,停止,极小值为)1(+k x ,否则转f ); f )若,,1)()0(n x x n k ==+令转c ),否则转
g );
g )令2)(2
)
1()1()1(()()(k k k k k x f x f x f p ∇∇=
+-∇=+++λ,
三、实验内容:
1.最速下降法的MATLAB 实现
2.牛顿法的MATLAB 实现
3.共轭梯度法的MATLAB 实现
四、实验过程:
1.最速下降法的函数: function [x,minf] = minFD(f,x0,var,eps) %最速下降法主函数
if nargin == 3
eps = 1.0e-6;
end
syms l;
tol = 1;
gradf = - jacobian(f,var);
while tol>eps
v = Funval(gradf,var,x0);
tol = norm(v);
y = x0 + l*v;
yf = Funval(f,var,y);
[a,b] = minJT(yf,0,0.1);%进退法求区间
xm = minHJ(yf,a,b);%黄金分割法
x1 = x0 + xm*v;
x0 = x1;
end
x = x1;
minf = Funval(f,var,x);
%进退法函数
function [minx,maxx] = minJT(f,x0,h0,eps) if nargin == 3
eps = 1.0e-6;
end
x1 = x0;
k = 0;
h = h0;
while 1
x4 = x1 + h;
k = k+1;
f4 = subs(f, findsym(f),x4);
f1 = subs(f, findsym(f),x1);
if f4 < f1
x2 = x1;
x1 = x4;
f2 = f1;
f1 = f4;
h = 2*h;
else
if k==1