鲍威尔算法matlab程序f.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
function f=fun(x)
f=10*(x(1)+x(2)-5)^2+(x(1)-x(2))^2; function f=fx(x0,alpha,s)
x1=x0+alpha*s;
f=fun(x1);
function f=fsearch(x0,s)
%利用进退法确定高低高区间
alpha1=0;
h=0.1;
alpha2=alpha1+h;
f1=fx(x0,alpha1,s);
f2=fx(x0,alpha2,s);
if f1>f2
alpha3=alpha2+h;
f3=fx(x0,alpha3,s);
while f2>f3
alpha1=alpha2;
alpha2=alpha3;
alpha3=alpha3+h;
f2=f3;
f3=fx(x0,alpha3,s);
end
else
h=-h;
v=alpha1;
alpha1=alpha2;
alpha2=v;
v=f1;
f1=f2;
f2=v;
alpha3=alpha2+h;
f3=fx(x0,alpha3,s);
while f2>f3
alpha1=alpha2;
alpha2=alpha3;
alpha3=alpha3+h;
f2=f3;
f3=fx(x0,alpha3,s);
end
end
a=min(alpha1,alpha3);
b=max(alpha1,alpha3);
%利用黄金分割点法求解
alpha1=a+0.382*(b-a);
alpha2=a+0.618*(b-a);
f1=fx(x0,alpha1,s);
f2=fx(x0,alpha2,s);
while abs(a-b)>0.001
if f1>f2
a=alpha1;
alpha1=alpha2;
f1=f2;
alpha2=a+0.618*(b-a);
f2=fx(x0,alpha2,s);
else
b=alpha2;
alpha2=alpha1;
f2=f1;
alpha1=a+0.382*(b-a);
f1=fx(x0,alpha1,s);
end
end
f=0.5*(a+b);
clear
%初始点
x0=[0;0];
%搜索方向
e1=[1;0];
e2=[0;1];
G0=fun(x0);
F0=G0;
%第一次迭代
%沿着e1
alpha1=fsearch(x0,e1);
x1=x0+alpha1*e1;
F1=fun(x1);
delta1=F0-F1;
% 沿着方向e2;
alpha2=fsearch(x1,e2);
x2=x1+alpha2*e2;
F2=fun(x2);
G2=F2;
delta2=F1-F2;
deltam=max(delta1,delta2);
%映射点
x3=2*x2-x0;
G3=fun(x3);
if G3 ^2 s=x2-x0; %方向替换 e1=e2; e2=s; % 沿着方向s 进行搜索 alpha3=fsearch(x2,s); x3=x2+alpha2*s; x0=x3; else if F2>G3 x0=x3; else x0=x2; end End 子文件JT,JH 进退法程序代码56555 . function [minx,maxx] = minJT(f,x0,h0,eps) format long; if nargin == 3 eps = 1.0e-6; end x1 = x0; k = 0; h = h0; while 1 x4 = x1 + h; k = k+1; f4 = subs(f, findsym(f),x4); f1 = subs(f, findsym(f),x1); if f4 < f1 x2 = x1; x1 = x4; f2 = f1; f1 = f4; h = 2*h; else if k==1 h = -h; x2 = x4; f2 = f4; else x3 = x2; x2 = x1; x1 = x4; break; end end end minx = min(x1,x3); maxx = x1+x3 - minx; format short; 黄金分割法程序代码56555 . function [x,minf] = minHJ(f,a,b,eps) format long; if nargin == 3 eps = 1.0e-6; end l = a + 0.382*(b-a); u = a + 0.618*(b-a); k=1; tol = b-a; while tol>eps && k<100000 fl = subs(f , findsym(f), l); fu = subs(f , findsym(f), u); if fl > fu a = l; l = u; u = a + 0.618*(b - a); else b = u; u = l; l = a + 0.382*(b-a); end k = k+1; tol = abs(b - a); end if k == 100000 disp('ÕÒ²»μ½215 ?î208 ?¡214 Oμ£¡); x = NaN; minf = NaN; return; end x = (a+b)/2; minf = subs(f, findsym(f),x);