最优化 马昌凤 第二章作业.docx
- 文档编号:20157846
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:31
- 大小:60.35KB
最优化 马昌凤 第二章作业.docx
《最优化 马昌凤 第二章作业.docx》由会员分享,可在线阅读,更多相关《最优化 马昌凤 第二章作业.docx(31页珍藏版)》请在冰豆网上搜索。
最优化马昌凤第二章作业
最优化方法及其Matlab程序设计
习题作业暨实验报告
学院:
数学与信息科学学院
班级:
12级信计一班
姓名:
李明
学号:
1201214049
第二章线搜索技术
1、上机问题与求解过程
1、用0.618法求解
初始区间
,区间精度为
.
解:
当初始时不限制近似迭代函数值得大小,编写程序运行结果为:
极小点(s)
迭代次数
搜索区间误差
函数值误差
0.5016
9
0.0426
0.0006
从结果可以看出迭代次数为
次,极小点为
,极小点的函数值为
。
根据人工手算,极小值点应该为
,所以在设计程序的时候添加函数值误差范围,并取范围为
。
编写的设计函数程序并调试改正如下:
function[s,fs,k,G,FX,E]=gold(f,a,b,H,F)
%输入:
%f:
目标函数,a:
搜索区间左侧端点;b:
搜索区间右侧端点;
%H:
搜索区间允许范围;F:
搜索区间函数值允许范围;
%输出:
%s:
近似极小值点:
fa:
近似极小点数值;k:
迭代次数:
%FX:
近似迭代函数值;E=[h,fh],h为近似区间误差,fh为函数值误差
t=(sqrt(5)-1)/2;h=b-a;
p=a+(1-t)*h;q=a+t*h;
fa=feval(f,a);fb=feval(f,b);
fp=feval(f,p);fq=feval(f,q);
k=1;G(k,:
)=[a,p,q,b];
%初始时错误语句:
G(1,:
)=[a,p,q,b];
%初始调试的时候没有注意到后面需要开辟k行空间
FX(k,:
)=[fa,fp,fq,fb];
while(abs(fa-fb)>F)((b-a)>H)
if(fp b=q;fb=fq;q=p;fq=fp;h=b-a;p=a+(1-t)*h;fp=feval(f,p); %初始时错误语句: b=q;fb=fq;h=b-a;q=a+t*h;fq=feval(f,q); %初始调试的时候对0.618方法没有充分理解所以出现错误 else a=p;fa=fp;p=q;fp=fq;h=b-a;q=a+t*h;fq=feval(f,q); %初始时错误语句: a=p;fa=fp;h=b-a;p=a+(1-t)*h;fp=feval(f,p); %初始调试的时候对0.618方法没有充分理解所以出现错误 end k=k+1;G(k,: )=[a,p,q,b]; %初始时错误语句: G(1,: )=[a,p,q,b]; %初始调试的时候没有注意到前面已经开辟k行空间 FX(k,: )=[fa,fp,fq,fb]; end if(fp s=p;fs=fp; else s=q;fs=fq; end h=b-a;fh=abs(fb-fa); %选取试探点最小的数值为近似点,并且计算出以上为搜索区间的的最后误差以及函数值误差 E=[h,fh]; 在命令窗口内输入如下命令: [s,fs,k,G,FX,E]=gold(inline('s^2-s-1'),-1,1,0.05,1e-10) 回车之后得到如下数据结果: 极小点 极小点数值 迭代次数 搜索区间误差 函数值误差 0.500 -1.2500 24 附: 在窗口中输出的结果如下 >>[s,fs,k,G,FX,E]=gold(inline('s^2-s-1'),-1,1,0.05,1e-10) s= 0.5000 fs= -1.2500 k= 24 G= -1.0000-0.23610.23611.0000 -0.23610.23610.52791.0000 0.23610.52790.70821.0000 0.23610.41640.52790.7082 0.41640.52790.59670.7082 0.41640.48530.52790.5967 0.41640.45900.48530.5279 0.45900.48530.50160.5279 0.48530.50160.51160.5279 0.48530.49530.50160.5116 0.49530.50160.50540.5116 0.49530.49920.50160.5054 0.49530.49770.49920.5016 0.49770.49920.50010.5016 0.49920.50010.50060.5016 0.49920.49970.50010.5006 0.49970.50010.50030.5006 0.49970.50000.50010.5003 0.49970.49990.50000.5001 0.49990.50000.50000.5001 0.50000.50000.50000.5001 0.50000.50000.50000.5000 0.50000.50000.50000.5000 0.50000.50000.50000.5000 FX= 1.0000-0.7082-1.1803-1.0000 -0.7082-1.1803-1.2492-1.0000 -1.1803-1.2492-1.2067-1.0000 -1.1803-1.2430-1.2492-1.2067 -1.2430-1.2492-1.2406-1.2067 -1.2430-1.2498-1.2492-1.2406 -1.2430-1.2483-1.2498-1.2492 -1.2483-1.2498-1.2500-1.2492 -1.2498-1.2500-1.2499-1.2492 -1.2498-1.2500-1.2500-1.2499 -1.2500-1.2500-1.2500-1.2499 -1.2500-1.2500-1.2500-1.2500 -1.2500-1.2500-1.2500-1.2500 -1.2500-1.2500-1.2500-1.2500 -1.2500-1.2500-1.2500-1.2500 -1.2500-1.2500-1.2500-1.2500 -1.2500-1.2500-1.2500-1.2500 -1.2500-1.2500-1.2500-1.2500 -1.2500-1.2500-1.2500-1.2500 -1.2500-1.2500-1.2500-1.2500 -1.2500-1.2500-1.2500-1.2500 -1.2500-1.2500-1.2500-1.2500 E= 1.0e-04 *0.31210.0000 2、用0.618法求解 的近似最优解,初始搜索区间为 ,区间精度为 . 解: 当初始时不限制近似迭代函数值得大小,编写程序运行结果为: 极小点(s) 迭代次数 搜索区间误差 函数值误差 0.8115 8 0.1003 0.0040 从结果可以看出迭代次数为 次,极小点为 ,极小点的函数值为 。 由第一题目可以发现当增加函数值限制时,最小近似值的误差会减小,所以在设计程序的时候添加函数值误差范围,并取范围为 。 具体源程序与上一题相同,在此处不做详细列出。 在命令窗口内输入如下命令: >>[s,fs,k,G,FX,E]=gold(inline('s^3-2*s+1'),0,3,0.15,1e-10) 回车之后得到如下数据结果: 极小点 极小点数值 迭代次数 搜索区间误差 函数值误差 0.8165 -0.0887 26 附: 在窗口中输出的结果如下 >>[s,fs,k,G,FX,E]=gold(inline('s^3-2*s+1'),0,3,0.15,1e-10) s= 0.8165 fs= -0.0887 k= 26 G= 01.14591.85413.0000 00.70821.14591.8541 00.43770.70821.1459 0.43770.70820.87541.1459 0.70820.87540.97871.1459 0.70820.81150.87540.9787 0.70820.77210.81150.8754 0.77210.81150.83590.8754 0.77210.79650.81150.8359 0.79650.81150.82080.8359 0.81150.82080.82660.8359 0.81150.81730.82080.8266 0.81150.81510.81730.8208 0.81510.81730.81860.8208 0.81510.81640.81730.8186 0.81510.81590.81640.8173 0.81590.81640.81680.8173 0.81590.81620.81640.8168 0.81620.81640.81660.8168 0.81640.81640.81650.8166 0.81640.81650.81650.8166 0.81640.81650.81650.8165 0.81650.81650.81650.8165 0.81650.81650.81650.8165 0.81650.81650.81650.8165 FX= 1.00000.21293.665622.0000 1.0000-0.06120.21293.6656 1.00000.2085-0.06120.2129 0.2085-0.0612-0.08000.2129 -0.0612-0.0800-0.01990.2129 -0.0612-0.0886-0.0800-0.0199 -0.0612-0.0839-0.0886-0.0800 -0.0839-0.0886-0.0877-0.0800 -0.0839-0.0877-0.0886-0.0877 -0.0877-0.0886-0.0886-0.0877 -0.0886-0.0886-0.0884-0.0877 -0.0886-0.0887-0.0886-0.0884 -0.0886-0.0887-0.0887-0.0886 -0.0887-0.0887-0.0887-0.0886 -0.0887-0.0887-0.0887-0.0887 -0.0887-0.0887-0.0887-0.0887 -0.0887-0.0887-0.0887-0.0887 -0.0887-0.0887-0.0887-0.0887 -0.0887-0.0887-0.0887-0.0887 -0.0887-0.0887-0.0887-0.0887 E= 1.0e-04* 0.17880.0000 3、用抛物线法求 的近似极小点,给定初始点 ,初始步长 解: 运用书上的算法框架,进行自我编写程序,并输出近似极小点值与近似极小点函数值,程序调制修改后如下: function[s,fs,k,G,E]=paowu1(f,s0,h0,H,F) %输入: %f: 目标函数;s0: 初始迭代点;h0: 初始选择步长; %H: 搜索区间容许误差值;F: 函数值容许误差值; %输出: %s: 近似极小数值点;fs: 近似极小点函数值;k: 迭代次数; %G: k行4列矩阵;E[hb,fc,m]分别为最终步长、搜索函数值误差、搜索区间误差 s1=s0+h0;s2=s0+2*h0;h=h0; fs0=feval(f,s0);fs1=feval(f,s1);fs2=feval(f,s2); k=1;G(k,: )=[s0,s1,s2]; if((fs1 fprintf('itiserror,pleasechangeanotheranableh0'); else fprintf('itisOK,pleasegoon'); end %调试错误分析: 调试时候将书中的数据进行带入,改变函数输入步长,发现不同步长的 %结果不一样,并且误差较大。 后来发现在一开始的时候,步长较短不能保证 %三个插值函数点中间低两边高,所以在进行测验时,特此编写此判断控制语句。 %如果正确,则可运用此结果;反之,则改变原来输入数值。 if(abs(s2-s0) sb=s1;fsb=fs1;hb=h0; k=1;G(k,: )=[s0,s1,s2]; else %调试错误分析: 在进行第二次调试的时候,发现没有考虑当初始的时候,搜索区间初始值 %小于给定搜索区间数值,即: 2倍的步长小于给定区间允许误差,所以在此 %处特此加入判断语句,进行改正。 while(abs(fs0-fs2)>F)|(abs(s0-s2)>H) sb=s0+(((3*fs0-4*fs1+fs2)*h)/(2*(fs0-2*fs1+fs2))); hb=((4*fs1-3*fs0-fs2)*h)/(2*(2*fs1-fs0-fs2)); fsb=feval(f,sb); %调试错误分析: 在初始的时候,sb,hb(分别代表下一步搜索点和搜索步长)的公式记错, %出现结果计算不出现象,特此在调试的时候进行改正。 if(fs1<=fsb) if(s1 s2=sb;fs2=fsb; else s0=sb;fs0=fsb; end else if(s1>sb), s2=s1;s1=sb;fs2=fs1;fs1=fsb; else s0=s1;s1=sb;fs0=fs1;fs1=fsb; end end k=k+1;G(k,: )=[s0,s1,s2]; end end s=s1;fs=fs1; fc=fs2-fs0; c=abs(s2-s0); E=[hb,c,fc]; %调试错误分析: 在初始调试的时候,令其输出的是sb,fsb但结果算出的不正确。 我对算法 %没能够完全理解,其实再算出的中间的时候,数值已经赋值给s1,所以应该 %输出s1值,并且增加了输出最后一步步长的数值功能。 在此处我选取,抛物线方法搜索区间允许误差为0.005,函数值允许误差为0.001,并在窗口内输入如下语句: >>[s,fs,k,G,E]=paowu1(inline('s^2-6*s+2'),1,0.1,0.005,0.01) 回车之后得到如下数据结果: 极小点 极小点数值 迭代次数 搜索区间误差 函数值误差 3.0000 -7.0000 3 0.0027 0.0097 附: 在窗口中输出的结果如下 >>[s,fs,k,G,E]=paowu1(inline('s^2-6*s+2'),1,0.1,0.005,0.01) itisOK,pleasegoon s= 3.0000 fs= -7.0000 k= 3 G= 1.00001.10001.2000 1.10003.00001.2000 1.20273.00001.2000 E= 0.10270.00270.0097 4、用抛物线法求 的近似最优解,初始搜索区间为 ,初始插值点 ,终止条件为 . 解: 首先对函数作出图像,观察其最小值点在给定区间的大致位置,如下所示,在命令窗口中输入命令: >>f='s^3-2*s+1'; fplot(f,[02]) holdon; title(f) 从函数图像可以看出,最小值点大致在0.8左右,所以根据给出的初始点为1,所以步长取负数假设为-0.15,由于区间为[0,3],所以在程序中加入,判断控制语句,当插入的点有小于0时,程序停止。 在上一题的基础上编写的修正程序为: function[s,fs,k,G,E]=paowu1(f,s0,h0,H,F) %输入: %f: 目标函数;s0: 初始迭代点;h0: 初始选择步长; %H: 搜索区间容许误差值;F: 函数值容许误差值; %输出: %s: 近似极小数值点;fs: 近似极小点函数值;k: 迭代次数; %G: k行4列矩阵;E[hb,fc,m]分别为最终步长、搜索函数值误差、搜索区间误差 s1=s0+h0;s2=s0+2*h0;h=h0; fs0=feval(f,s0);fs1=feval(f,s1);fs2=feval(f,s2); k=1;G(k,: )=[s0,s1,s2]; if((fs1>fs0)||(fs1>fs2)), fprintf('itiserror,pleasechangeanotheranableh0'); else fprintf('itisOK,pleasegoon'); end %调试错误分析: 调试时候将书中的数据进行带入,改变函数输入步长,发现不同步长的 %结果不一样,并且误差较大。 后来发现在一开始的时候,步长较短不能保证 %三个插值函数点中间低两边高,所以在进行测验时,特此编写此判断控制语句。 %如果正确,则可运用此结果;反之,则改变原来输入数值。 if(abs(s2-s0) sb=s1;fsb=fs1;hb=h0; k=1;G(k,: )=[s0,s1,s2]; else %调试错误分析: 在进行第二次调试的时候,发现没有考虑当初始的时候,搜索区间初始值 %小于给定搜索区间数值,即: 2倍的步长小于给定区间允许误差,所以在此 %处特此加入判断语句,进行改正。 while(abs(fs0-fs2)>F)||(abs(s0-s2)>H) if(((s0)<0)&(s1)<0&((s2)<0)), break else continue end sb=s0+(((3*fs0-4*fs1+fs2)*h)/(2*(fs0-2*fs1+fs2))); hb=((4*fs1-3*fs0-fs2)*h)/(2*(2*fs1-fs0-fs2)); fsb=feval(f,sb); %调试错误分析: 在初始的时候,sb,hb(分别代表下一步搜索点和搜索步长)的公式记错, %出现结果计算不出现象,特此在调试的时候进行改正。 if(fs1<=fsb) if(s1 s2=sb;fs2=fsb; else s0=sb;fs0=fsb; end else if(s1>sb), s2=s1;s1=sb;fs2=fs1;fs1=fsb; else s0=s1;s1=sb;fs0=fs1;fs1=fsb; end end k=k+1;G(k,: )=[s0,s1,s2]; end end s=s1;fs=fs1; fc=fs2-fs0; c=abs(s2-s0); E=[hb,c,fc]; 在窗口中输入命令语句: >>[s,fs,k,G,E]=paowu1(inline('s^3-2*s+1'),1,-0.15,0.01,0.01) 得到的结果为: 最小值近似点为0.8127,函数值为: -0.0886,迭代6次,允许误差均在控制范围之内。 附: 命令窗口语句如下 >>[s,fs,k,G,E]=paowu1(inline('s^3-2*s+1'),1,-0.15,0.01,0.01) itisOK,pleasegoon s= 0.8127 fs= -0.0886 k= 6 G= 1.00000.85000.7000 1.00000.81270.8500 0.77950.81270.8500 0.62310.81270.8500 0.40290.81270.8500 0.17910.81270.8500 E= -0.22500.00010.0000 5、分别用书中所给的0.618法和抛物线法matlab程序计算下列问题的近似最优解: 解: (1) 由函数图像可知极小近似点大约在0.5左右,所以应用第一题程序,选取区间为[-1,1],计算出结果如下: 近似极小值点: 0,3517;近似点函数值: 0.8272;迭代次数: 23;误差为1.0e-04*0.5050。 其中在命令窗口输入指令如下: >>[s,fs,k,G,FX,E]=gold(inline('exp(-s)+s^2'),-1,1,0.15,1e-10) s= 0.3517 fs= 0.8272 k= 23 G= -1.0000-0.23610.23611.0000 -0.23610.23610.52791.0000 -0.23610.05570.23610.5279 0.05570.23610.34750.5279 0.23610.34750.41640.5279 0.23610.30500.34750.4164 0.30500.34750.37380.4164 0.30500.33130.34750.3738 0.33130.34750.35760.3738 0.34750.35140.35370.3576 0.34750.34990.35140.3537 0.34990.35140.35230.3537 0.34990.35080.35140.3523 0.35080.35140.35170.3523 0.35140.35170.35190.3523 0.35140.35160.35170.3519 0.35160.35170.35180.3519 0.35160.35170.35170.3518 0.35170.35170.35170.3518 0.35170.35170.35180.3518 0.35170.35170.35170.3518 FX= 3.71831.32200.84551.3679 1.32200.84550.86851.3679 1.32200.9489
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最优化 马昌凤 第二章作业 优化 第二 作业
![提示](https://static.bdocx.com/images/bang_tan.gif)