确定函数的在区间 的极小点,要求极小点所在的区间的长度压缩到0.3之内。
目标函数为一元单值函数,该问题即为一维问题,可用一维搜索法进行迭代求解,下面用MATLAB实现黄金分割法、斐波那契数列法和二分法的求解。
1、黄金分割法,程序代码如下:
fx=@(x)x^4-14*x^3+60*x^2-70*x;
a0=0;b0=2; %搜索区间
d=0.3; %要求区间长度
p=(3-sqrt(5))/2;
N=0; %初始化迭代次数
while abs(b0-a0)>d
a=a0+p*(b0-a0);
b=a0+(1-p)*(b0-a0); %(1-p)为压缩比
fa=fx(a);
fb=fx(b);
if fa<fb %压缩搜索区间
b0=b;
else
a0=a;
end
N=N+1; %迭代次数+1
end
该方法迭代4次,即可找到满足要求的极小点所在的区间,为 。
2、斐波那契数列法,程序代码如下:
fx=@(x)x^4-14*x^3+60*x^2-70*x;
a0=0;b0=2;
Fk_2=0;Fk_1=1; %生成斐波那契数列
e=0.1;
d=0.3
for i=1:10
Fk(i)=Fk_1+Fk_2;
Fk_2=Fk_1;
Fk_1=Fk(i);
end
m=find(((1+2*e)./Fk)<(d/2));
N=min(m);
%压缩比
for i=N:-1:2
p(i-1)=Fk(i-1)/Fk(i);
end
p=fliplr(p); %按索引倒序排列
%搜索
a=a0+(1-p(1))*(b0-a0);
b=a0+p(1)*(b0-a0);
fa=fx(a);
fb=fx(b);
for i=2:length(p)
if p(i)==0.5
p(i)=p(i)-e;
end
if fa<fb
b0=b;
b=a;
a=a0+(1-p(i))*(b0-a0);
fb=fa;
fa=fx(a);
else
a0=a;
a=b;
b=a0+p(i)*(b0-a0);
fa=fb;
fb=fx(b);
end
end
在令的情况下,迭代4次,即可得到满足要求的搜索区间,为 。
3、二分法,程序代码如下:
fx=@(x) 4*x^3 - 42*x^2 + 120*x - 70;
a0=0;b0=2;
d=0.3; %要求区间长度
N=0;
while abs(b0-a0)>d
x0=(a0+b0)/2;
fx0=fx(x0);
if fx0>0 %压缩搜索区间
b0=x0;
else
a0=x0;
end
N=N+1;
end
该方法迭代2次即可得到满足要求的搜索区间,为 。