matlab编程实现求解最优解

发布时间:2020-02-05 21:59:55

《现代设计方法》课程

关于黄金分割法和二次插值法的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%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.010.15分钟内没有算出来,特别是一开始步长取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试编的程序,用以实现现代设计方法中的进退法求搜索区间、黄金分割法和二维插值法实现求解最优解。平时还试编了梯度法等,不过这里面没有。想要的同学,发邮件给我。邮箱:luziwenlzl@163.com

希望大家能够喜欢,如有漏洞,请提出宝贵意见。我也是学生,大家相互学习,共同进步。

matlab编程实现求解最优解

相关推荐