算法原理
进退法是用来寻找单谷函数(只有一个极值点)极值所在区间的算法。我们这里以极小值为例:
假设函数f(x)为单谷函数,初始点为x0,步长为h0:
(1)下一个迭代点x1=x0+h0,计算f(x1);
(2)若f(x1)<f(x0),说明前进方向为下降方向;
1.x2=x1+h0,将x1作为新的起始点,定义i=1;
2.若f(x2)<f(x1),x2=x1+i*h0,,i=i+1,迭代搜索。直到,f(x2)<f(x1),f(x)经历了一个先递减后递增的过程,(x1,x2)即为极小值点所在的区间。
(3)若f(x1)>f(x0),说明前进方向为上升方向;
1.取h0=-h0,交换x1,x0的值,反向搜索即可。
MATLAB程序
%% 进退法 寻找搜索区间
clc
clear
close
fx=@(x) x^2+1;
fplot(fx,[-100 100]); %绘制出图形,查看极值点所在区间,用来验证结果。
[a,b]=Min_jintui(fx,-1,0.1);
function [a,b]=Min_jintui(f,x1,h0)
%f为函数句柄
%x1为初始点
%h0为步长
x2=x1+h0;
i=1;
if f(x2) < f(x1) %该方向为下降方向
x3=x2+h0;
h=h0;
while f(x3) < f(x2) %进入循环,不断迭代,直至f(x3) > f(x2)
x3=x2+h;
h=i*h;
i=i+1;
end
a=x1; %x1,x3即为极值所在区间
b=x3;
else %该方向为上升方向
Temp=x1; %交换x1,x2的位置
x1=x2;
x2=Temp;
h=-h0; %改变方向
x3=x2+h;
while f(x3) < f(x2) %进入循环,不断迭代,直至f(x3) > f(x2)
x3=x2+h;
h=i*h;
i=i+1;
end
a=x3;
b=x1;
end
end