斐波那契法(FibonaceiMethod)又称斐波那契分数法,是一种一维搜索区间消去法。
斐波那契法通过取代试探点和进行函数值的比较,使包含极小值点的搜索区间不断缩短,当区间长度缩短到一定程度时,区间上各点的函数值均接近极小值点的近似。该算法要求所考虑的区间上的目标函数是单峰函数,即在这个区间上只有一个局部极小值点的函数。
斐波那契算法的具体步骤如下:
(1)选取初始数据,确定单峰区间[a0,b0],给出搜索精度 δ>0,由步骤(4)确定搜索次数n。
(2) k=1,a = a0,b = b0,计算最初两个搜索点,按步骤(3)计算t1和t2。
(3)计算程序如下:
(4)当进行至 k= n-1时,t1 = t2 = -1/2(a+6),这就无法借比较函数值f(t1)和f(t2)
的大小来确定最终区间。为此,取
其中ε为任意小的数。在t1和t2这两点中,以函数值较小者为近似极小值点,相应的函
数值为近似极小值。并得最终区间为[a,t1]或[t2 ,b]。
由上述分析可知,斐波那契法使用对称搜索的方法,逐步缩短所考察的区间,它能以
尽量少的函数求值次数,达到预定的某一缩短率。
根据以上步骤,编写斐波那契算法MATLAB代码如下:
function[x,T,j]= Fibonacci(F_1,a1,b1,l,e)
n=1;j= 1;
a(n)=a1;b(n) = b1;
while(Fib(j)*l < (b1 -a1))
j=j+ 1;
end
r(1)= a(1) + (1- Fib(j- 1)/Fib(j))* (b(1)-a(1));
u(1) =a(1) +Fib(j- 1)/Fib(j) * (b(1) -a(1));
for n = 1:1:j-2
R(n) = feval(F_1,r(n));
U(n) = feval(F_1,u(n));
Z(n) = b(n)-a(n);
if R(n)> U(n)
a(n+ 1)= r(n);
b(n+ 1)= b(n);
r(n+ 1)= u(n);
u(n+1) = a(n+1)+ Fib(j-n-1)/Fib(j-n) * (b(n+1) -a(n+1));
else
a(n+ 1)=a(n);
b(n+ 1)= u(n);
u(n+ 1)= r(n);
r(n+1)=a(n+1)+ (1- Fib(j-n- 1)/Fib(j-n))* (b(n+1)-a(n+ 1));
end
end
R(j-1) = feval(F_1,r(j - 1));
U(j-1) = feval(F_1,u(j - 1));
r(j)=r(j-1);
u(j)=r(j-1) + e;
R(j) = feval(F_1,r(j));
U(j) = feval(F_1,u(j));
if R(j)> U(j)
a(j)=r(j);
b(j)=b(j-1);
else
a(j)=a(j-1);
b(j)=u(j);
end
Z(j- 1)=b(j-1)-a(j- 1);
Z(j) =b(j)-a(j);
x= (a(j) + b(j))/2;
T=[a',b',r',u',R',U',Z'];
end
function Fi= Fib(n)
i= 1;
Fib(2) = 2;
Fib(1) = 1;
if n==0
Fi= 1;
else
for i= 3:1:n
Fib(i)=Fib(i-1) +Fib(i-2);
end
i = n;
end
Fi = Fib(i);
end
例 使用斐波那契法 ,求函数f(x)=x2-4x+3在区间[-2,1]上,精度不大于0.15的最小值点,要求最终区间长度不大于原始区间长度的0.02倍。
解:使用MATLAB编辑函数f(x)代码如下:
[x,T,j] = Fibonacci('Fun',-2,1,0.15,0.02)
function y= Fun(x)
y=x^2-4*x+3;
运行结果:
即经过7次迭代,得到函数最小值为0.9286.