一、算法的具体思想:
(1)选定初始点a 和步长h;
(2)计算并比较f(a)和f(a+h);有前进(1)和后退(2)两种情况
2.1 前进运算:
若f(a)>= f(a+h),则步长加倍h = 2*h,计算f(a+3h)。若f(a+h) ≤f(a+3h),令 a1=a, a2=a+3h, 停止运算;否则将步长加倍,并重复上述运算。
2.2 后退运算:
若f(a)<f(a+h),则将步长改为h=-0.25*h。计算f(a-h), f(a-h) ≥ f(a), 令 a1=a-h, a2=a+h, 停止运算;否则将步长加倍,并重复上述运算。
二、优缺点
缺点:效率低;
优点:可以求搜索区间;
注意:h 选择要适当,初始步长不能选得太小;
三、例子
3.1 前进例子
例 :利用“成功-失败”法求函数 f(x) = x^3 - 2x + 1 的搜索区间, 取初始点 x = -1/2,步长 h = 1/2。
3.2 后退例子
四、matlab代码实现----寻找搜索区间
%%这是function函数:
function f = myfun(x)
f = x^3 - 27*x + 10;
%%这是寻找搜索区间函数:
clear;
close all;
clc
x0 = 4.5;
h0 = 0.5;
h = h0;
t = x0 + h0;
f0 = myfun(x0);
f1 = myfun(t);
f2 = 0;
a1 = x0;
m = t;
a2 = t;
while 1
if f0 >= f1
h = 2*h;
f2 = myfun(t + h);
t = t + h;
a1 = m;
m = a2;
a2 = t;
if f1 <= f2
break;
end
f0 = f1;
f1 = f2;
elseif f0 < f1
h = -0.25*h0;
t = x0 + h;
f1 = myfun(t);
end
end
if h < 0
t = a1;
a1 = a2;
a2 = t;
end
a1,a2
运行结果:
五、matlab代码实现----寻找函数的最小值
clear;
close all;
clc
x0 = 4.5;
h = 0.5;
eps = 0.001;
f0 = myfun(x0);
while abs(h)>eps
x1 = x0 + h;
f1 = myfun(x1);
if f0 > f1
x0 = x0 + h;
f0 = f1;
h = 2*h;
else
h = -0.25*h;
end
x0
end
f0