matlab编程实现求解最优解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《现代设计方法》课程
关于黄金分割法和二次插值法的Matlab语言实现在《现代设计方法》的第二章优化设计方法中有关一维搜索的最优化方法的
一节里,我们学习了黄金非分割法和二次插值法。它们都是建立在搜索区间的优先确定基础上实现的。
为了便于方便执行和比较,我将两种方法都写进了一个程序之内,以选择的方式实现执行其中一个。下面以《现代设计方法》课后习题为例。见课本70页,第2—7题。原题如下:
求函数f(x)=3*x^2+6*x+4的最优点,已知单谷区间为[-3,4],一维搜索精度为0.4。
1、先建立函数f(x),f(x)=3*x^2+6*x+4。函数文件保存为:lee.m
源代码为:function y=lee(x)
y=3*x^2+6*x+4;
2、程序主代码如下,该函数文件保存为:ll.m
clear;
a=input('请输入初始点');
b=input('请输入初始步长');
Y1=lee(a);Y2=lee(a+b);
if Y1>Y2 %Y1>Y2的情况
k=2; Y3=lee(a+2*b);
while Y2>=Y3 %直到满足“大,小,大”为止
k=k+1;
Y3=lee(a+k*b);
end
A=a+b;B=a+k*b;
elseif Y1 k=1;Y3=lee(a-k*b); while Y1>=Y3 %直到满足“大,小,大”为止 k=k+1; Y3=lee(a-k*b); end A=a-k*b;B=a; else A=a;B=a+b; %Y1=Y2的情况 end disp(['初始搜索区间为',num2str([A,B])])%输出符合的区间 xuanze=input('二次插值法输入0,黄金分割法输入1');%选择搜索方式 T=input('选定一维搜索精度'); if xuanze==1 while B-A>T %一维搜索法使精度符合要求 C=A+0.382*(B-A);D=A+0.618*(B-A); %黄金分割法选点 if lee(C)>=lee(D); %缩小区间 A=C; else B=D; end end else while B-A>T %二次插值法是精度符合要求 C=(A+B)/2; W=[1,A,A^2;1,B,B^2;1,C,C^2]; w=[lee(A);lee(B);lee(C)]; x=W\w; %求线性方程组解,求拟合曲线 xx=perms(x)'; for n=1:(factorial(3)); %使解得值与a0,a1,a2一一对应 t=1+(n-1)*3; a0=xx(t);a1=xx(t+1);a2=xx(t+2); if a0+a1*A+a2*A^2~=lee(A)||a0+a1*B+a2*B^2~=lee(B)... ||a0+a1*C+a2*C^2~=lee(C); continue end break end xp=-a1/(2*a2); %拟合直线的最低点 if lee(C)>=lee(xp); %缩小区间 if C>=xp; %xp与C大小不定,导致缩小方式不同 B=C; else A=C; end else if C>=xp; A=xp; else B=xp; end end end end X=(A+B)/2;Y=lee(X); disp(['极小值点为',num2str(X),'极值为',num2str(Y)]);%输出结果 3、由于我编的程序,其搜索区间是自定的。不需要它提供的范围,只需要给出初始点,步长,搜索精度并确定方法即可。因此假设初始值为-5,步长为0.01,已知搜索精度为0.4。执行过程中遇到方法选择时二次插值法输入0,一维搜索法输入1,输入其它无效。 运行结果:(1)先用二次插值法,则输入0 (2)再次用黄金分割法(即“一维搜索法”),此时输入1 4.感想 (1)黄金分割法比二维插值法来得简单,运算快捷,至少是在在针对以议案二次函数的时候。我执行二维插值法程序时,当步长取0.01或0.1时5分钟内没有算出来,特别是一开始步长取0.01时,等了30分钟没结果,而CPU占用率却达到了50%左右,有时会跳到近100%附近。真受不了啊!应该是程序还有问题。黄金分割法在步长为0.01时之行也很快,不超过1s.截图如下: (2)黄金分割法从结果来看也比二维插值法精确些。 (3)调整搜索精度比较 当搜索精度分别为:0.4 0.1 0.01 0.001 二维插值法结果:极小值点为-1.1016极值为1.0309 极小值点为-1.0137极值为1.0006 极小值点为-1.0027极值为1 极小值点为-1.0004极值为1 黄金分割法结果:极小值点为-0.9286极值为1.0153 极小值点为-1.0342极值为1.0035 极小值点为-1.0802极值为1.0193 极小值点为-1.0001极值为1 通过上述比较可知,就收敛性而言,二维插值法比换进分割法好,准确性也更好。 (4)还有就是主程序以函数调用的形式执行后,总会提示错误。 如图:真不知是哪儿错了?望老师指正。如果在命令窗口直接运行的话,又是完全正确的。没有提示错误。 5.小结 这个程序是在很早以前就编好了,就是一直没等您说收。如图为证: 这是我用matlab试编的程序,用以实现现代设计方法中的进退法求搜索区间、黄金分割法和二维插值法实现求解最优解。平时还试编了梯度法等,不过这里面没有。想要的同学,发 邮件给我。邮箱:******************。 希望大家能够喜欢,如有漏洞,请提出宝贵意见。我也是学生,大家相互学习,共同进步。