清华大学数学实验报告6.docx
《清华大学数学实验报告6.docx》由会员分享,可在线阅读,更多相关《清华大学数学实验报告6.docx(12页珍藏版)》请在冰豆网上搜索。
清华大学数学实验报告6
数学实验报告6
无约束优化
电机工程与应用电子技术系
苗键强
2011010645
一、实验目的
1.掌握用MATLAB优化工具箱和LINGO解线性规划的方法;;
2.练习建立实际问题的线性规划模型。
二、实验内容
题目1
【问题描述】
取不同的初值计算下列非线性规划,尽可能求出所有局部极小点,进而找出全局极小点,并对不同算法(搜索方向、搜索步长、数值梯度与分析梯度等)的结果进行分析、比较。
min
【分析与解】
设
Step1:
初步分析
初步观察函数表达式可知,由于该式为二次项乘积的形式,所以函数值始终大于等于0,当
或
或
时,函数值为0,而当
和
均趋于无穷大时,函数值也趋于无穷大,因而函数的所有局部极小点处对应的自变量均为有限值。
为分析函数存在的所有局部极小点,对于函数的二位图像进行初步分析,在Matlab中编程如下:
clear
clc
[x1,x2]=meshgrid(-20:
0.1:
20,-20:
0.1:
20)
f=((x1.*x2).^2).*((1-x1).^2).*((1-x1-x2.*((1-x1).^5)).^2);
mesh(x1,x2,f)
pause;
contour(x1,x2,f,100)
运行以上代码,得到如下图像:
三维网格图
等高线图
通过分析以上图像可以发现,在自变量取值变化范围内,函数值的最大值已经达到
的数量级,因此自变量取值范围已经足够大。
Step2:
确定自变量范围
为进一步分析所有局部极小点处对应的自变量的具体值,缩小自变量变化范围,在Matlab中编程如下:
clear
clc
[x1,x2]=meshgrid(-0.1:
0.01:
1.1,-0.3:
0.01:
0.3)
f=((x1.*x2).^2).*((1-x1).^2).*((1-x1-x2.*((1-x1).^5)).^2);
mesh(x1,x2,f)
pause;
contour(x1,x2,f,100)
运行以上代码,得到如下图像:
三维网格图
等高线图
由等高线可知,函数局部极小值位于直线
或
或
附近。
Step3:
对不同算法的结果进行分析和比较
Action1:
数值方法:
编写函数文件,在Matlab中编程如下:
functionf=jixiao(x)
f=((x
(1).*x
(2)).^2).*((1-x
(1)).^2).*((1-x
(1)-x
(2).*((1-
x
(1)).^5)).^2);
end
对不同算法的结果进行分析和比较,取初始点(0.5,0.5):
[1]BFGS,混合二三次插值:
clear
clc
x0=[0.5,0.5];
opt1=optimset('LargeScale','off','MaxFunEvals',1000);
[x1,v1,ef1,out1]=fminunc('jixiao',x0,opt1)
运行以上代码,得到以下结果:
x1=
-0.0000 0.5033
v1=
5.0074e-13
ef1=
1
out1=
iterations:
5
funcCount:
18
stepsize:
1
firstorderopt:
3.5473e-07
algorithm:
[1x38char]
message:
[1x436char]
[2]BFGS,三次插值:
clear
clc
x0=[0.5,0.5];
opt1=optimset('LargeScale','off','MaxFunEvals',1000);
opt2=optimset(opt1,'LineSearchType','cubicpoly');
[x2,v2,ef2,out2]=fminunc('jixiao',x0,opt2)
运行以上代码,得到以下结果:
x4=
-0.0000 0.5033
v4=
5.0074e-13
ef4=
1
out4=
iterations:
5
funcCount:
18
stepsize:
1
firstorderopt:
3.5473e-07
algorithm:
[1x38char]
message:
[1x436char]
[3]DFP,混合二三次插值:
clear
clc
x0=[0.5,0.5];
opt1=optimset('LargeScale','off','MaxFunEvals',1000);
fopt=optimset(opt1,'HessUpdate','dfp');
[x3,v3,ef3,out3]=fminunc('jixiao',x0,fopt)
运行以上代码,得到以下结果:
x2=
-0.0000 0.5030
v2=
4.6614e-13
ef2=
1
out2=
iterations:
5
funcCount:
18
stepsize:
1
firstorderopt:
3.4229e-07
algorithm:
[1x38char]
message:
[1x436char]
[4]DFP,三次插值:
clear
clc
x0=[0.5,0.5];
opt1=optimset('LargeScale','off','MaxFunEvals',1000);
opt2=optimset(opt1,'LineSearchType','cubicpoly');
fopt=optimset(opt2,'HessUpdate','dfp');
[x4,v4,ef4,out4]=fminunc('jixiao',x0,fopt)
运行以上代码,得到以下结果:
x5=
-0.0000 0.5030
v5=
4.6614e-13
ef5=
1
out5=
iterations:
5
funcCount:
18
stepsize:
1
firstorderopt:
3.4229e-07
algorithm:
[1x38char]
message:
[1x436char]
[5]STEEPDESC,混合二三次插值:
clear
clc
x0=[0.5,0.5];
opt1=optimset('LargeScale','off','MaxFunEvals',1000);
fopt=optimset(opt1,'HessUpdate','steepdesc');
[x5,v5,ef5,out5]=fminunc('jixiao',x0,fopt)
运行以上代码,得到以下结果:
x3=
0.0000 0.4957
v3=
3.9415e-12
ef3=
1
out3=
iterations:
68
funcCount:
207
stepsize:
1
firstorderopt:
9.9355e-07
algorithm:
[1x38char]
message:
[1x436char]
[6]STEEPDESC,三次插值:
clear
clc
x0=[0.5,0.5];
opt1=optimset('LargeScale','off','MaxFunEvals',1000);
opt2=optimset(opt1,'LineSearchType','cubicpoly');
fopt=optimset(opt2,'HessUpdate','steepdesc');
[x6,v6,ef6,out6]=fminunc('jixiao',x0,fopt)
运行以上代码,得到以下结果:
x3=
0.0000 0.4957
v3=
3.9415e-12
ef3=
1
out3=
iterations:
68
funcCount:
207
stepsize:
1
firstorderopt:
9.9355e-07
algorithm:
[1x38char]
message:
[1x436char]
将各种算法的计算结果列入下表:
函数f不同算法的计算结果
情况
搜索方向
步长搜索
最优解x1
最优解x2
最优值
目标函数调用次数
1
BFGS
混合二三
次插值
0.0000
0.5033
5.0074*10-13
18
2
DFP
0.0000
0.5030
4.6614*10-13
18
3
STEEPDESC
0.0000
0.4957
3.9415*10-12
207
4
BFGS
三次插值
0.0000
0.5033
5.0074*10-13
18
5
DFP
0.0000
0.5030
4.6614*10-13
18
6
STEEPDESC
0.0000
0.4957
3.9415*10-12
207
【结论】分析上表可知,对于不同的算法,通过有限次的循环最终都可以得到最优解x1=0。
当选择不同的搜索方向和步长时,要达到相同的精度要求,各种算法对于目标函数的调用次数差异较大。
BFGS和DFP对于目标函数的调用次数比STEEPDESC所用的少。
而对于同一种搜索方向,在不同步长搜索的情形下,对于目标函数的调用次数大致相等。
Action2:
分析方法:
对于函数
进行梯度分析:
通过分析方法计算梯度,对于函数进行修改,在Matlab中编程如下:
function[f,df]=jixiao(x)
f=((x
(1).*x
(2)).^2).*((1-x
(1)).^2).*((1-x
(1)-x
(2).*