最优化方法概要.docx
《最优化方法概要.docx》由会员分享,可在线阅读,更多相关《最优化方法概要.docx(16页珍藏版)》请在冰豆网上搜索。
最优化方法概要
中北大学
实验报告
课程名:
最优化方法
任课教师:
李卉
专业:
数学与应用数学
学号:
1308014112
姓名:
李鑫
2015/2016学年第2学期
中北大学理学院
《最优化方法》课程实验第1次实验报告
一、实验内容及基本要求
实验项目名称:
黄金分割法程序设计
实验类型:
设计型
每组人数:
1
实验内容及要求:
内容:
能够应用MATLAB或C++设计黄金分割法的程序,并用实例进行验证
要求:
能够独立完成程序的设计及验证
二、实验题目
利用黄金分割法求函数
在
上的极小点。
取容许误差
,
三、实验步骤及结果
1)、建立y函数M文件(fun_gs.m)
functiony=fun_gs(x)
y=3*x^2-2*tan(x);
end
2)、建立求解极小值点的M文件(gs.m)
functiongs(x)
a=0;
b=1;
eps=0.0001;
i=100;
a1=b-0.618*(b-a);
a2=a+0.618*(b-a);
y1=fun_gs(a1);
y2=fun_gs(a2);
fork=1:
i;
if(abs(b-a)<=eps)
y=fun_gs((b+a)/2);
break;
else
if(y1<=y2)
y2=fun_gs(a1);
b=a2;
a2=a1;
a1=b-0.618*(b-a);
y1=fun_gs(a1);
else
y1=fun_gs(a2);
a=a1;
a1=a2;
a2=a+0.618*(b-a);
y2=fun_gs(a2);
end
i=i+1;
end
end
i
a0=(b+a)/2
y=fun_gs((b+a)/2)
end
实验结果:
i=120%迭代次数
a0=0.3895%极小值点
y=-0.3658%在极小值点上的函数值
迭代120次求得极小值点为a0=0.3895,在极小值点的函数值
《最优化方法》课程实验第2次实验报告
一、实验内容及基本要求
实验项目名称:
牛顿法程序设计
实验类型:
设计型
每组人数:
1
实验内容及要求:
内容:
能够应用MATLAB或C++设计牛顿法的程序,并用实例进行验证
要求:
能够独立完成程序的设计及验证
二、实验题目
利用牛顿法程序求解
该问题有精确解
。
三、实验步骤及结果
#include
#include
doublef1(doublex,doubley)
{return(4*pow(x*x-y,2)+3*pow(x-1,2));}
voidmain(){
doubleh=3,x0=2,x1,y0=2,y1,s,r0,r1;
doublee0=0.000001,e1=0.000001;
intk=0;
s=sqrt(pow(16*x0*x0*x0-16*x0*y0+6*x0-6,2)+pow(-8*x0*x0+8*y0,2));
printf("%dx=%fy=%fs=%f\n",k,x0,y0,s);
while(s>e1){
x1=x0;y1=y0;r0=f1(x0,y0);h=3;
while(fabs(h)>e0){
r1=f1(x1-h*(16*x1*(x1*x1-y1)+6*(x1-1)),y1-h*(-8*(x1*x1-y1)));
if(r1x0=x1-h*(16*x1*(x1*x1-y1)+6*(x1-1));
y0=y1-h*(-8*(x1*x1-y1));
r0=r1;
h=h+h;
}
elseif(fabs(h)>e0)
h=-1*h/4;
}
s=sqrt(pow(16*x0*x0*x0-16*x0*y0+6*x0-6,2)+pow(-8*x0*x0+8*y0,2));
k++;
printf("%dx=%fy=%fs=%f\n",k,x0,y0,s);
}
printf("x=%fy=%f",x0,y0);
}
实验结果:
上面结果表明,用牛顿法迭代110次可以求得最优解,最优解为
《最优化方法》课程实验第3次实验报告
一、实验内容及基本要求
实验项目名称:
共轭梯度法程序设计
实验类型:
设计型
每组人数:
1
实验内容及要求:
内容:
能够应用MATLAB或C++设计共轭梯度法的程序,并用实例进行验证
要求:
能够独立完成程序的设计及验证
二、实验题目
利用线性共轭梯度程序求解无约束优化问题
式中:
该问题有精确解
,n=10,初始向量为零向量,终止准则为
。
三、实验步骤及结果
1)、建立M文件(cg.m)
function[x,iter]=cg(G,b,x0,max_iter)
x=x0;
tolerance=1.0e-5;
fprintf('\nx0=');
fprintf('%10.6f',x0);
r=G*x-b;
d=-r;
fork=1:
max_iter
ifnorm(r,2)<=tolerance
iter=k-1;
fprintf('\nAlgorithmfindsasolution!
');
return
end
alpha=(r'*r)/(d'*G*d);
xx=x+alpha*d;
rr=r+alpha*G*d;
beta=(rr'*rr)/(r'*r);
d=-rr+beta*d;
x=xx;
r=rr;
fprintf('\nx%d=',k);
fprintf('%10.6f',x);
end
iter=max_iter;
return
end
2)、建立M文件(CG_main.m)
functionCG_main()
G=[4-100000000;...
-14-10000000;...
0-14-1000000;...
00-14-100000;...
000-14-10000;...
0000-14-1000;...
00000-14-100;...
000000-14-10;...
0000000-14-1;...
00000000-14];
b=[3222222223]';
x0=[0000000000]';
max_iter=1000;
fprintf('\n');
fprintf('ConjugateGradientMethod:
\n');
fprintf('==========================\n');
[y,iter]=cg(G,b,x0,max_iter);
fprintf('\n');
fprintf('Iterativenumber:
\n%d\n',iter);
fprintf('Solution:
\n');
fprintf('%10.6f',y);
fprintf('\n\n=====================\n\n');
实验结果:
上面的计算结果表明,用共轭梯度法迭代5次求得最优解,最优解为
《最优化方法》课程实验第4次实验报告
一、实验内容及基本要求
实验项目名称:
BFGS算法程序设计
实验类型:
设计型
每组人数:
1
实验内容及要求:
内容:
能够应用MATLAB或C++设计BFGS算法的程序,并用实例进行验证
要求:
能够独立完成程序的设计及验证
二、实验题目
利用BFGS算法求解无约束优化问题
该问题有唯一极小点
,极小值
三、实验步骤及结果
1)、建立
函数的M文件(fun.m):
functionf=fun(x)
f=2*(x
(1)-x
(2)^2)^2+(x
(2)-2)^2;
建立M文件(gradient.m)
functiong=gradient(x)
g=[4*(x
(1)-x
(2)^2);
2*(x
(2)-2)];
2)、建立搜索函数的M文件(wolfe_search.m)
functionalphak=wolfe_search(x,g,d)
alphamax=inf;
ruo=0.1;
sigma=0.6;
alpha1=0;
alpha2=alphamax;
fai1=fun(x);
dfai1=g'*d;
alpha=1;
faialpha=fun(x+alpha*d);
afai=gradient(x+alpha*d)'*d;
while1
iffaialpha-fai1>ruo*alpha*dfai1
whilefaialpha-fai1>ruo*alpha*dfai1
alphaba=alpha1+(alpha-alpha1)/...
(2*(1+(fai1-faialpha/((alpha-alpha1)*dfai1))));
alpha2=alpha;
alpha=alphaba;
faialpha=fun(x+alpha*d);
end
dfai=gradient(x+alpha*d)'*d;
end
ifdfai>=sigma*dfai1
alphak=alpha;
return
else
alphaba=alpha+((alpha-alpha1)*dfai)/(dfai1-dfai);
alpha1=alpha;
fai1=faialpha;
dfai1=dfai;
alpha=alphaba;
faialpha=fun(x+alpha*d);
dfai=gradient(x+alpha*d)'*d;
end
end
3)、建立BFGS算法的M文件(bfgs.m)
function[x,iter]=bfgs(H,x0,max_iter,TOL)
k=0;
fprintf('\nx0=');
fprintf('%10.6f',x0);
x=x0;
g=gradient(x);
whilenorm(g)>TOL&k<=max_iter
d=-H*g;
afa=wolfe_search(x,g,d);
s=afa*d;
x=x+s;
fprintf('\nx%2d=',k+1);
fprintf('%10.6f',x);
gnew=gradient(x);
y=gnew-g;
H=H+((s-H*g)*s'+s*(s-H*y)')/(s'*y)-(s-H*y)'*y*y*y'/((s'*y)^2);
g=gnew;
k=k+1;
end
ifnorm(g)<=TOL
fprintf('\nAlgorithmfindsasolution!
\n');
else
fprintf('\nNumberofiterationsexceedsmax_iter.\n');
end
iter=k;
end
4)、建立求最优解的M文件(bfgs_main.m)
functionbfgs_main()
x0=[32]';
n=length(x0);
H=eye(n);
max_iter=1000;
tolerance=1.0e-6;
fprintf('\n');
fprintf('BFGSMethod:
\n');
fprintf('============\n');
[x,iter]=bfgs(H,x0,max_iter,tolerance);
fprintf('Iterativenumber:
\n%d\n',iter);
fprintf('Solution:
\n');
fprintf('%10.6f',x);
fprintf('\nOptimalobjectivefunctionvalue:
\n');
fprintf('%10.6f\n',fun(x));
fprintf('\n=========\n');
实验结果:
上面的计算结果表明,用BFGS方法经3次迭代达到极小值点,极小值点最优解为