最优化算法实验报告(附Matlab程序)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最优化方法(Matlab)实验报告
——Fibonacci 法
一、实验目的:
用MATLAB 程序实现一维搜索中用Fibonacc 法求解一元单峰函数的极小值问题。
二、实验原理:
(一)、构造Fibonacci 数列:设数列{}k F ,满足条件:
1、011F F ==
2、11
k k k F F F +-=+则称数列{}k F 为Fibonacci 数列。
(二)、迭代过程:
首先由下面的迭代公式确定出迭代点:
1
1
1
(),1,...,1(),1,...,1n k k k k k n k n k
k k k k n k F a b a k n F F u a b a k n F λ---+--+=+
-=-=+
-=-易验证,用上述迭代公式进行迭代时,第k 次迭代的区间长度缩短比率恰好为
1
n k
n k F F --+。
故可设迭代次数为n ,因此有11121211221111223231
()()......()()n n n n n n n n n
F 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 n
b a L
b a L
F -≤-≤,即
就是
111
()n
b 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 k
k k k k n k k k k k n k
a b b f f F
a b a F λλμλμμ++++--++++-=====+-计算1()k f μ+的值。
(2)()()k k f f u λ≤,则令
111121111,,()()
()
k k k k
k k k k n k k k k k n k
a a
b f f F
a b a F μμλμλλ++++--++++-=====+-计算1()k f λ+的值。
又因为第一次迭代确定出了两个迭代点,以后每迭代一次,新增加一个迭代点,这样在迭代n-1后便计算完了n 个迭代点。
因此第n 次迭代中,选用第n-1次的迭代点以及辨别常数δ构造n λ和n μ:
1
1n n n n λλμλδ
--==+再用同样的方法进行判断:(1)、若()n f λ>()n f μ则令
1
n n n n a b b λ-==(2)、若()n f λ<=()n f μ则令
1n n n n
a a
b μ-==这样便可确定出最优解的存在区间[,]n n a b 。
三、实验步骤:
(1)给定初始区间11[,]a b 和期望达到的精度L ,求迭代次数n ,使得
11
n b a F L
-≥
置判别系数0δ>,计算试探点11u λ 和 ,其中
2
1111()n n
F a b a F λ-=+
-1
1111()n n
F 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 +,
1
1111()n k k k k k n k
F 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 λ+,
2
1111()n k k k k k n k
F 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 n
a a
b λ-==停止计算,极小点含于[,]n n a b 。
四、算法流程图
五、用MATLAB 程序实现,并计算一个例题。
(程序见附录)例题:用Fibonacci 法求解问题
2min ()1
def
f 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.0000
1.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.4590
0.4853
0.5016
0.49530.50160.4992
0.49770.49920.50010.49960.50010.5001];
u=[0.23610.52790.70820.52790.59670.5279
0.48530.50160.51160.50160.50540.5016
0.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;
end
n=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));
else
a(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));
end
k=k+1;
end
r(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);
else
a(n)=a(n-1);
b(n)=u(n);
end
2、求解函数:
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;
end
title('y=t^2-t+1')%添加标题
grid on;
y=zeros(1,n);
for i=1:n
plot(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。