1.算法原理
设目标函数为F(x),则黄金分割算法的实现过程如下:
(1)给定初始区间[a1,b1],精度要求tol>0,黄金分割系数T=0.618,k=1。
(2)令c1=a1+(1-T)(b1-a1),d1=b1-(1-T)(b1-a1),计算Fc=F(c1),Fd=F(d1)。
(3)若b(k+1)-a(k+1) >= tol,转到步骤(4),否则停止搜索,得到的结果为(a(k+1)+b(k+1))/2。
(4)若Fc<Fd,转到(5);否则转到(6)。
(5)a(k+1)=a(k);b(k+1)=d(k);d(k+1)=c(k),Fd=Fc;令c(k+1)=a(k+1)+(1-T)(b(k+1)-a(k+1));计算Fc=F(c(k+1)),转到(7)。
(6)a(k+1)=c(k);c(k+1)=d(k);b(k+1)=b(k),Fc=Fd;令d(k+1)=b(k+1)- (1-T)(b(k+1)-a(k+1));计算Fd=F(d(k+1)),转到(7)。
(7)置k=k+1;返回(3)。
2.算法流程图
3.算法实现
<span style="font-size:18px;">%Gold Segment
a = 1;
b = 4;
Err = 0.001;
T = 0.618;
c = a+(1-T)*(b-a);
d = b-(1-T)*(b-a);
Fc = Fx(c);
Fd = Fx(d);
while(1)
if(abs(b-a)<Err)
x=0.5*(a+b);
break;
end
if(Fc<Fd)
a = a;
b = d;
d = c;
Fd = Fc;
%%%%%%%%%
c = a+(1-T)*(b-a);
Fc = Fx(c);
else %Fc>Fd
b = b;
a = c;
c = d;
Fc = Fd;
%%%%%%%%%%
d = b-(1-T)*(b-a);
Fd = Fx(d);
end
end
x
minFx = Fx(x)
function y = Fx(x)
y = x*x-6*x+9;
end
</span>
输出结果:
<span style="font-size:18px;">x =
3.0000
minFx =
3.8376e-11</span>