进退法是确定函数单峰区间的一种方法,本文以求一个函数的单峰区间为例,介绍进退法求解单峰区间的流程、及MATLAB代码。
MATLAB代码如下:
syms a1 a2 a3 h f1 f2 f3 X Y section sign k;%所需变量,section为单峰区间
Y=(X-1) *(X-3) *(X-9) *(X-12);%所求单峰区间对应的函数
sign=1;
a1=10;h=0.1;%初始点及初始步长
a2=a1+h;
f1=double(subs(Y,X,a1));f2=double(subs(Y,X,a2));%计算f1、f2
if(f1 >= f2)%开始分情况讨论
h=2*h;%假如条件:f1 >= f2成立,则极值点在a2右边,做前进运算,步长加倍
a3=a2+h;%生成a3
f3=double(subs(Y,X,a3));%计算f3
while(sign==1)
if(f2 >= f3)%假如条件:f2 >= f3成立,则极值点在a3右边,做前进运算,步长加倍
a1=a2;%将a2的值赋予原来的a1
a2=a3;%以a3替换赋予原来的a2
f1=f2;%以f2替换原来的f1
f2=f3;%以f3替换原来的f2
h=2*h;
a3=a2+h;%重新生成a3
f3=double(subs(Y,X,a3));%重新计算f3
else
section=[a1 a3];
sign=0;
end
end
else%假如条件:f1 >= f2不成立,则极值点在a1左边,做后退运算
h=(-1)*h;%极值点在a1左边,做后退运算
k=a1+a2;
a1=k-a1;%对调a1、a2
a2=k-a2;%对调a1、a2
k=f1+f2;
f1=k-f1;%对调f1、f2
f2=k-f2;%对调f1、f2
a3=a2+h;%重新生成a3
f3=double(subs(Y,X,a3));%重新计算f3
while(sign==1)
if(f3 <= f2)%假如条件:f3 <= f2成立,则极值点在a3左边,做后退运算
a1=a2;%舍弃原来a1,将a2的值赋予原来的a1
a2=a3;%舍弃原来a2,以a3替换原来的a2
f1=f2;%舍弃原来f1,以f2替换原来的f1
f2=f3;%舍弃原来f2,以f3替换原来的f2
h=2*h;%步长加倍
a3=a2+h;%重新生成a3
f3=double(subs(Y,X,a3));%重新计算f3
else
section=[a3 a1];
sign=0;
end
end
end
进退法也是一种局部算法,只能求出函数的一个单峰区间,而不能求出所有单峰区间。单峰区间的宽度与初始点、初始步长有关。
有关单峰区间的相关知识可以参考:
http://t.csdn.cn/EUpLX;http://t.csdn.cn/IHlLc