提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、使用条件?
优化函数在搜索区间内为单峰函数。
二、算法及程序
1.算法
p=a+(1-t)*(b-a); q=a+t*(b-a);2.程序
代码如下(示例):
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%用0.618法求单变量函数在单峰区间[a,b]上的近似极小点
%在命令窗口输入函数:[s,phis,k,G,E]=gods(inline('(s-1)^2'),0,1,1e-4,1e-5)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [s,phis,k,G,E]=gods(phi,a,b,delta,epsilon)
%功能: 0.618法精确线搜索
%输入: phi是目标函数, a, b是搜索区间的两个端点
% epsilon,delta分别是自变量和函数值的容许误差
%输出: s, phis分别是近似极小点和极小值, G是nx4矩阵,
% 其第k行分别是a,p,q,b的第k次迭代值[ak,pk,qk,bk],
% E=[ds,dphi], 分别是s和phis的误差限.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 步0 确定初始搜索区间[a0,b0]和容许误差0\leq\epsilon\leq1.
% 令t=(sqrt(5)-1)/2
% 计算初始试探点p0=a0+(1-t)(b0-a0),q0=a0+t(b0-a0),
% 及相应的函数值phi(p0),phi(q0)。令k=0
% 步1 若phi(pi)<=phi(qi),转步骤2;否则,转步骤3
% 步2 计算左试探点. 若qi-ai<=epsilon,停算,输出pi;否则,令
% a{i+1}=ai,b{i+1}=qi,phi(q{i+1})=phi(pi),
% q{i+1}=pi,p{i+1}=a{i+1}+(1-t)(b{i+1}-a{i+1}).
% 计算phi(p{i+1}), i=i+1,转步骤1
% 步3 计算右试探点.若bi-pi<=epsilon,停算,输出qi;否则,令
% a{i+1}=pi,b{i+1}=bi,phi(p{i+1})=phi(qi),
% p{i+1}=qi,q{i+1}=a{i+1}+t(b{i+1}-a{i+1}).
% 计算phi(q{i+1}), i=i+1,转步骤1
t=(sqrt(5)-1)/2;
% h=b-a; % 自变量差
phia=feval(phi,a); phib=feval(phi,b); %求出a,b点出的函数值
p=a+(1-t)*(b-a); q=a+t*(b-a);
phip=feval(phi,p); phiq=feval(phi,q); %求出p,q点出的函数值
k=0;
G(k+1,:)=[a,p,q,b];
while(1) % 判断循环终止条件(abs(h)>epsilon) || (abs(phib-phia)>delta)
% 步1
if phip<=phiq
% 步3
if (abs(b-a)>epsilon)||(abs(phib-phia)>delta)
b=q; phib=phiq; phiq=phip; q=p;
% h=b-a;
p=a+(1-t)*(b-a); phip=feval(phi,p);
else
break;
end
else
% 步3
if (abs(b-a)>epsilon)||(abs(phib-phia)>delta)
a=p; phia=phip; phip=phiq; p=q;
% h=b-a;
p=a+t*(b-a); phiq=feval(phi,q);
else
break;
end
end
k=k+1;
G(k+1,:)=[a,p,q,b];
end
if phip<=phiq
s=p; phis=phip;
else
s=q; phis=phiq;
end
ds=abs(b-a);
dphi=abs(phib-phia);
E=[ds,dphi];
总结
结果好像不怎么正确,欢迎大佬指导。
s =
0.6525
phis =
0.0557
k =
106
G =
E =
1.0e-05 *
0.9252 0.6431