最优化方法(Matlab)实验报告——Fibonacci 法一、实验目的:用MATLAB 程序实现一维搜索中用Fibonacc 法求解一元单峰函数的极小值问题。
二、实验原理:(一)、构造Fibonacci 数列:设数列{}k F ,满足条件:1、011F F ==2、11k k k F F F +-=+则称数列{}k F 为Fibonacci 数列。
(二)、迭代过程:首先由下面的迭代公式确定出迭代点:111(),1,...,1(),1,...,1n k k k k k n k n kk k k k n k F a b a k n F F u a b a k n F λ---+--+=+-=-=+-=-易验证,用上述迭代公式进行迭代时,第k 次迭代的区间长度缩短比率恰好为1n kn k F F --+。
故可设迭代次数为n ,因此有11121211221111223231()()......()()n n n n n n n n nF F F F F F b a b a b a b a b a F F F F F F F ------=-=⨯-==⨯-=-若设精度为L ,则有第n 次迭代得区间长度111()n n nb a Lb a LF -≤-≤,即就是111()nb a L F -≤,由此便可确定出迭代次数n 。
假设第k 次迭代时已确定出区间[,]k k a b 以及试探点,[,]k k k k u a b λ∈并且k k u λ<。
计算试探点处的函数值,有以下两种可能:(1)若()()k k f f u λ>,则令111111111,,()()()k k k kk k k k n k k k k k n ka b b f f Fa b a F λλμλμμ++++--++++-=====+-计算1()k f μ+的值。
(2)()()k k f f u λ≤,则令111121111,,()()()k k k kk k k k n k k k k k n ka ab f f Fa b a F μμλμλλ++++--++++-=====+-计算1()k f λ+的值。
又因为第一次迭代确定出了两个迭代点,以后每迭代一次,新增加一个迭代点,这样在迭代n-1后便计算完了n 个迭代点。
因此第n 次迭代中,选用第n-1次的迭代点以及辨别常数δ构造n λ和n μ:11n n n n λλμλδ--==+再用同样的方法进行判断:(1)、若()n f λ>()n f μ则令1n n n n a b b λ-==(2)、若()n f λ<=()n f μ则令1n n n na ab μ-==这样便可确定出最优解的存在区间[,]n n a b 。
三、实验步骤:(1)给定初始区间11[,]a b 和期望达到的精度L ,求迭代次数n ,使得11n b a F L-≥置判别系数0δ>,计算试探点11u λ 和 ,其中21111()n nF a b a F λ-=+-11111()n nF u a b a F -=+-计算函数值11()()f f u λ和,置k =1;(2)若()()k k f f u λ>,则转(3);若()()k k f f u λ≤,则转(4);(3)令1111,,,()()k k k k k k k k a b b u f f u λλλ++++====,计算试探点1k u +,11111()n k k k k k n kF u a b a F --++++-=+-若k =n -2,则转步骤(5);否则,计算1()k f u +,置k=k+1,转步骤(2);(4)令1111,,,()()k k k k k k k k a a b u u f u f λλ++++====,计算1k λ+,21111()n k k k k k n kF a b a F λ--++++-=+-若k =n -2,则转步骤(5);否则,计算1()k f λ+,置k=k+1,转步骤(2);(5)令11,n n n n u λλλδ--==+,计算()()n n f f u λ和若()()n n f f u λ>,则令1,n n n n a b b λ-==若()()n n f f u λ≤,则令1,n n n na ab λ-==停止计算,极小点含于[,]n n a b 。
四、算法流程图五、用MATLAB 程序实现,并计算一个例题。
(程序见附录)例题:用Fibonacci 法求解问题2min ()1deff x t t =-+设初始区间11[,][1,1]a b =-,精度L=0.001,辨别常数0.0001δ=六、实验结果:函数图像及迭代点变动图像如下图所示:y=t 2-t+1由运行结果看出,迭代进行18次便达到期望的精度,其迭代点序列向量如下:a=[-1.0000-0.23610.23610.23610.41640.41640.41640.45900.48530.48530.49530.49530.49530.49770.49920.49920.49960.4996];b=[1.00001.0000 1.00000.70820.70820.59670.52790.52790.52790.51160.51160.50540.50160.50160.50160.50060.50060.5001];r=[-0.23610.23610.52790.41640.52790.48530.45900.48530.50160.49530.50160.49920.49770.49920.50010.49960.50010.5001];u=[0.23610.52790.70820.52790.59670.52790.48530.50160.51160.50160.50540.50160.49920.50010.50060.50010.50010.5001];最优值存在区间为:[0.4996,0.5001]。
七、附录:算法程序如下:1、Fibonacci算法编程如下:function[a,b,r,u,fr,fu,n]=Fibonacci(f,a1,b1,L,e)%函数功能:用Fibonacci法进行一维搜索,求解单峰函数f的极小值问题;%初始条件:初始区间为[a1,b1],给定精度为L>0,辨别常数e>0;%下面构造Fibonacci数列F=[];t=(b1-a1)/L;F(1)=1;F(2)=1;i=1;while(F(i)<t)F(i+2)=F(i+1)+F(i);i=i+1;endn=i;%n为迭代次数%下面进行迭代a=[];b=[];a(1)=a1;b(1)=b1;r=[];u=[];r(1)=a(1)+(F(n-1)/F(n+1))*(b(1)-a(1));u(1)=a(1)+(F(n)/F(n+1))*(b(1)-a(1));fr=[];fu=[];fr(1)=f(r(1));fu(1)=f(u(1));k=1;while(k~=n)if(fr(k)<fu(k))a(k+1)=a(k);b(k+1)=u(k);u(k+1)=r(k);fu(k+1)=fr(k);r(k+1)=a(k+1)+(F(n-k-1)/F(n-k+1))*(b(k+1)-a(k+1));fr(k+1)=f(r(k+1));elsea(k+1)=r(k);b(k+1)=b(k);r(k+1)=u(k);fr(k+1)=fu(k);u(k+1)=a(k+1)+(F(n-k)/F(n-k+1))*(b(k+1)-a(k+1));fu(k+1)=f(u(k+1));endk=k+1;endr(n)=r(n-1);u(n)=r(n-1);fr(n)=f(r(n));fu(n)=f(u(n));if(fr(n)>fu(n))a(n)=r(n);b(n)=b(n-1);elsea(n)=a(n-1);b(n)=u(n);end2、求解函数:function y=f(t)y=t^2-t+1;3、函数求解及绘制动态模拟图程序如下:a1=-1;b1=1;L=0.001;e=0.0001;[a,b,r,u,fr,fu,n]=Fibonacci(@f,a1,b1,L,e)disp('极小值存在区间为:');a(n)b(n)for x=(-1):0.01:1;x1=x;x2=x1+0.01;axis([-1,1,0,3]);%设置坐标y1=f(x1);y2=f(x2);grid on;plot([x1,x2],[y1,y2],'b');pause(0.001);hold on;endtitle('y=t^2-t+1')%添加标题grid on;y=zeros(1,n);for i=1:nplot(a(i),y(i),'m.');hold on;plot(b(i),y(i),'b.');hold on;plot(r(i),y(i),'gp');hold on;plot(u(i),y(i),'cp');hold on;pause(1);end。