鲍威尔算法matlab程序 f
鲍威尔法matlab实现

鲍威尔法% 鲍威尔法-计算第2环起始点和搜索方向syms xy1 xy2 fyx m x1 x2 X s1s2 Sf=60-10*x1-4*x2+x1^2+x2^2-x1*x2;disp ' 目标函数:f=60-10*x1-4*x2+x1^2+x2^2-x1*x2.'pretty(f);% 第1环沿e2方向搜索x01=0;x02=0;X0=[x01 x02]; % 第1环初始点x1=5.0000;x2=0;X=[x1 x2]; % 第1环沿e2方向初始点fy1=60-10*x1-4*x2+x1^2+x2^2-x1*x2; % 第1环e2方向初始点函数值e1=[1,0];e2=[0,1]; % 坐标轴单位方向s1=e2(1);s2=e2(2);S=[s1 s2];m=0;% 计算影射点及其函数值xs1=2*xy1-x01;xs2=2*xy2-x02;Xs=[xs1 xs2];fxs=60-10*xs1-4*xs2+xs1^2+xs2^2-xs1*xs2;fx0=60-10*x01-4*x02+x01^2+x02^2-x01*x02; % 第1环初始点函数值disp ' 第1环影射点坐标'disp (Xs)% 判断第1环搜索函数值下降最大方向df01=fx0-fy1; % 第1环沿e1方向初始点函数值-第1环沿e1方向终点函数值df02=fy1-fyx; % 第1环沿e2方向起始点函数值-第1环沿e2方向始点函数值if df01>df02dfm=df01;m=1;elsedfm=df02;m=2;end% 计算POWELL判别式f1=fx0;f2=fyx;f3=fxs;f123=[f1 f2 f3];disp ' 第1环初始点、终点、影射点函数值'disp (f123)fP1=(f1-2*f2+f3)*(f1-f2-dfm)^2;fP2=0.5*dfm*(f1-f3)^2;fP=[fP1 fP2];disp ' 两个POWELL判别式的值'fprintf(1,' POWELL判别式1的值 fP1= %10.4f \n',fP1)fprintf(1,' POWELL判别式1的值 fP2= %10.4f \n',fP2)fprintf(1,' 函数值下降最大方向 m= %2.0f \n',m)if f1>f3 & fP2>fP1sx1=xy1-X0(1); % 同时不满足两个判别式时56428 .产生新方向sx2=xy2-X0(2);sx=[sx1 sx2];if m==1S=[e2,sx]; % 新方向取代上环搜索中函数值下降最大方向m=1elseS=[e1,sx]; % 新方向取代上环搜索中函数值下降最大方向m=2 endelseS=[e1,e2]; % 满足某个判别式时56428 .保留上环搜索方向enddisp ' @@@@ 第2环搜索方向 @@@@'disp (S)% 第1环沿新方向搜索x1=xy1;x2=xy2;X=[x1 x2];s1=xy1-x01;s2=xy2-x02; S=[s1 s2];[xy1,xy2,fyx]=powell(m,x1,x2,X,s1,s2,S);disp '@@@@ 第2环搜索起始点 @@@@'if fyx<fxsx20=[xy1 xy2];disp ' (第1环极小点)'elsex20=[xs1 xs2];disp ' (第1环影射点)'enddisp (x20)% 鲍威尔法-第1环计算% 目标函数中常数项、步长的一次项和二次项系数fxs0=60-10*x1-4*x2+x1^2+x2^2-x1*x2;fxs1=-10*s1-4*s2+2*x1*s1+2*x2*s2-x1*s2-x2*s1;fxs2=s1^2+s2^2-s1*s2;fxs210=[fxs2 fxs1 fxs0];% 计算最优步长af=-fxs1/(2*fxs2);% 计算终点函数值(关于最优步长)fya=fxs0+fxs1*af+fxs2*af^2;% 计算终点坐标值和函数值(关于终点)xy1=x1+s1*af;xy2=x2+s2*af;Xopt=[xy1 xy2];fyx=60-10*xy1-4*xy2+xy1^2+xy2^2-xy1*xy2;if m==0disp ' ******** 计算第1环沿e2方向搜索 ********'elsedisp ' ******** 计算第1环沿新方向搜索 ********'enddisp ' 初始点'disp (X)disp ' 搜索方向'disp (S)disp ' 步长二次项一次项系数常数项'disp (fxs210)disp ' 最优步长'disp (af)if m==0disp ' 终点坐标'disp (Xopt)elsedisp ' 极小点坐标'disp (Xopt)disp ' 极小点函数值(关于最优步长)' disp (fya)disp ' 极小点函数值(关于极小点)' disp (fyx)end。
基于MATLAB的鲍威尔法求极值问题

基于MATLAB的鲍威尔法求极值问题:xxx 学号:xxx(理工大学机械与车辆学院车辆工程,100081)摘要:无约束优化方法主要有七种,按照求导与否把这些方法分为间接法和直接法。
牛顿法的成败与初始点选择有极大关系,其可靠性最差;坐标轮换法、单纯形法和最速下降法对于高维优化问题计算效率很低,有效性差;由于编制变尺度法程序复杂,其简便性不足。
综合考虑后,鲍威尔法、共轭梯度法具有较好的综合性能。
本文首先对鲍威尔法的原理进行阐述,根据其迭代过程给出流程图,并编写MATLAB程序。
最后用此MATLAB程序求解实际的极值问题,并对求解结果进行简要分析。
1.鲍威尔法的基本思想1.1其他优化方法对鲍威尔法形成的影响通过对鲍威尔法的学习,可以很明显看出来其迭代思想中汲取了其他几种优化方法的核心思想。
为了更全面、更深入的学习鲍威尔法,很有必要对其他有影响的优化思想进行学习和梳理。
由最基本的数学基础知识可知,梯度方向是函数增加最快的方向,负梯度方向是函数下降最快的方向,于是,利用这个下降最快方向产生了最速下降法。
每次迭代都沿着负梯度方向进行一维搜索,直到满足精度要求为止。
其特点是相邻两个搜索方向互相正交,所以很明显的一个现象就是刚开始搜索步长比较大,愈靠近极值点其步长愈小,收敛速度愈慢,特别当二维二次目标函数的等值线是较扁的椭圆时,迭代速度更慢。
这时,倘若目标函数是等值线长、短轴都平行于坐标轴的椭圆形,则通过坐标轮换法可以很高效的解决问题。
通过两次分别沿坐标轴进行一维搜索,便可达到极值点。
但对于目标函数的等值线椭圆的长、短轴倾斜于坐标轴时,坐标轮换法的搜索效率也显得极低。
抛开这两种特殊情况,对于一般形态的目标函数,如果在某些明显可以直达最优点的情况下(一般为靠近极值点区域),迭代过程完全可以不沿负梯度方向搜索,取而代之的是找到直达最优点的方向,一步到位。
但这样的直达方向应该如何去找呢?共轭梯度法由此产生。
其基本原理是:任意形式的目标函数在极值点附近的特性都近似一个二次函数,其等值线在极值点附近为近似的同心椭圆簇,而同心椭圆簇有一个特性便是任意两条平行线与椭圆簇切点的连线必通过椭圆的中心。
matlab实验鲍威尔法

实验报告实验名称:鲍威尔法院(系):机电学院专业班级:机械制造及其自动化姓名:学号:2013年5 月13 日实验一:鲍威尔法实验日期:2013年5 月13 日一、实验目的了解MATLAB的基本运用了解MATLB在优化中的使用二、实验原理鲍威尔法也是一种共轭法,利用函数值来构造共轭方向,同时引入坐标轮换的概念,利用搜索前后两个点之间的连线形成新的共轭方向,替换旧的共轭方向。
三、实验内容鲍威尔法程序:x0=[12;10];xk=x0;ie=10^(-7);ae=1;%初始化搜索方向d=zeros(2,2);d(:,1)=[1;0];d(:,2)=[0;1];Inc=zeros(2,1);k=0;MLN=100;%迭代求解while (ae>ie&&k<MLN)syms x1syms x2xktemp=xk;fun1=fun(x1,x2);fun1=inline(fun1);f0=feval(fun1,xk(1),xk(2));F0=f0;if k>0F0=eval(F0);end%沿d1方向进行一维搜索syms asyms x1;syms x2;xk1=xk+a*d(:,1);x1=xk1(1);x2=xk1(2);fun1=fun(x1,x2);fxa=diff(fun1,'a');a=solve(fxa);xk1=inline(xk1);xk1=feval(xk1,a);xk1(1)=eval(xk1(1));xk1(2)=eval(xk1(2));syms x1;syms x2;fun1=fun(x1,x2);fun1=inline(fun1);f1=feval(fun1,xk1(1),xk1(2)); f1=eval(f1);Inc(1)=f0-f1;%沿d2方向进行搜索syms a;syms x1;syms x2;xk2=xk1+a*d(:,2);x1=xk2(1);x2=xk2(2);fun1=fun(x1,x2);fxa=diff(fun1,'a');a=solve(fxa);xk2=inline(xk2);xk2=feval(xk2,a);xk2(1)=eval(xk2(1));xk2(2)=eval(xk2(2));syms x1;syms x2;fun1=fun(x1,x2);fun1=inline(fun1);f2=feval(fun1,xk2(1),xk2(2));f2=eval(f2);F2=f2;Inc(2)=f1-f2;[Incm,row]=max(Inc);x3=2*xk2-xk;%计算反射点syms x1;syms x2;fun1=fun(x1,x2);fun1=inline(fun1);f3=feval(fun1,x3(1),x3(2));f3=eval(f3);F3=f3;temp1=(F0-2*F2+F3)*(F0-F2-Incm)^2; temp2=0.5*Incm*(F0-F3)^2;%判断是否更换搜索方向if (F3<F0&&temp1<temp2)syms a;syms x1;syms x2;d(:,row)=xk2-xk;xk=xk2+a*d(:,row);x1=xk(1);x2=xk(2);fun1=fun(x1,x2);fxa=diff(fun1,'a');a=solve(fxa);xk=inline(xk);xk=feval(xk,a);%不更换搜索方向else if F2<F3xk=xk2;elsexk=x3;endendxkerror=eval(xk2-xktemp); ae=norm(xkerror);k=k+1;endx=eval(xk)函数程序:function [f]=fun(x1,x2)f=2*x1^2+4*x1*x2+x2^2执行结果:x =四、实验小结通过本实验了解了了matlab的基本操作方法,了解鲍威尔法的原理与基本运用。
鲍威尔算法

一阶导数
变尺度法
d k = − Ak g k
A =A
k
k −1
+ ∆A
k −1
一阶导数,使 A k ≈ [G k ]−1
(d j )T ( g k − g k +1 ) = (d j )T G ( x k +1 − x k ) = 0
取 d k = x k +1 − x k 这说只要沿dj 方向分别对函作两次一维搜索, 得到两个极小点xk 和xk+1 ,那么这两点的连线 所给出的方向dk就是与dj一起对G共轭的方向。
k x0k , xnk , xn+1( xnk+1 = xnk + ( xnk − x0k ) = 2 xnk − x0k )
分别称为一轮迭代的始点、终点和反射点 。
f i = f ( xik ) (i = 0,1, 2,L, n) 记:
∆ i = f i −1 − f i (i = 1, 2,L, n)
因此 F0 = f 0 , F2 = f n
则在循环中函数下降最多的第m次迭代是
∆ m = max ∆ i = f m−1 − f m
1≤i ≤ n
k 相应的方向为d m 。
为了构成共轭性好的方向组,须遵循下列准则: 在k次循环中,若满足条件:
F3 < F0
和 ( F0 − 2 F2 + F3 )( F0 − F2 − ∆ m ) 2 < 0.5∆ m ( F0 − F3 ) 2
1 d3 方向进行一维搜索得 沿
4 x = 2
2
f ( x 2 ) = −8
检验终止条件
x 2 − x02 = (4 − 3.8) 2 + (2 − 1.7) 2 = 0.36 > ε
鲍威尔算法matlab程序-f

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>f2alpha3=alpha2+h;f3=fx(x0,alpha3,s);while f2>f3alpha1=alpha2;alpha2=alpha3;alpha3=alpha3+h;f2=f3;f3=fx(x0,alpha3,s);endelseh=-h;v=alpha1;alpha1=alpha2; alpha2=v;v=f1;f1=f2;f2=v;alpha3=alpha2+h;f3=fx(x0,alpha3,s); while f2>f3alpha1=alpha2; alpha2=alpha3; alpha3=alpha3+h;f2=f3;f3=fx(x0,alpha3,s); endenda=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>f2a=alpha1;alpha1=alpha2;f1=f2;alpha2=a+0.618*(b-a); f2=fx(x0,alpha2,s); elseb=alpha2;alpha2=alpha1;f2=f1;alpha1=a+0.382*(b-a); f1=fx(x0,alpha1,s); endendf=0.5*(a+b);clear%初始点x0=[0;0];%搜索方向e2=[0;1];G0=fun(x0);F0=G0;%第一次迭代%沿着e1alpha1=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<G0 & (G0-2*G2+G3)*(G0-G2-deltam)^2<0.5*deltam*(G0-G3) ^2%方向替换e1=e2;e2=s;% 沿着方向s 进行搜索alpha3=fsearch(x2,s);x3=x2+alpha2*s;x0=x3;elseif F2>G3x0=x3;elsex0=x2;endEnd子文件JT,JH进退法程序代码�56555 .function [minx,maxx] = minJT(f,x0,h0,eps) format long;if nargin == 3eps = 1.0e-6;endk = 0;h = h0;while 1x4 = x1 + h;k = k+1;f4 = subs(f, findsym(f),x4); f1 = subs(f, findsym(f),x1); if f4 < f1x2 = x1;x1 = x4;f2 = f1;f1 = f4;h = 2*h;elseif k==1h = -h;x2 = x4;f2 = f4;elsex3 = x2;x2 = x1;break;endendendminx = min(x1,x3);maxx = x1+x3 - minx;format short;黄金分割法程序代码�56555 . function [x,minf] = minHJ(f,a,b,eps) format long;if nargin == 3eps = 1.0e-6;endl = a + 0.382*(b-a);u = a + 0.618*(b-a);k=1;tol = b-a;while tol>eps && k<100000fl = subs(f , findsym(f), l);fu = subs(f , findsym(f), u);a = l;l = u;u = a + 0.618*(b - a);elseb = u;u = l;l = a + 0.382*(b-a);endk = k+1;tol = abs(b - a);endif k == 100000disp('ÕÒ²»μ½215 ?î208 ?¡214 Oμ£¡); x = NaN;minf = NaN;return;endx = (a+b)/2;minf = subs(f, findsym(f),x);format short;。
机械优化设计——鲍威尔法

机械优化设计——鲍威尔法机械优化设计是指在构筑机械产品或系统时,通过优化设计、算法分析等手段,使得机械产品或系统达到最佳的性能和效率。
鲍威尔法(Broyden-Fletcher-Goldfarb-Shanno algorithm,简称BFGS算法)是一种求解非线性最优化问题的拟牛顿法,广泛应用于机械优化设计中。
鲍威尔法是由四位科学家共同提出的,在非线性优化问题中具有很高的效率和可靠性。
它与传统的牛顿法相比,具有更好的收敛性能和更小的存储需求。
鲍威尔法是一种迭代的方法,通过不断更新设计变量的值,使得目标函数的值不断接近最优值。
鲍威尔法的核心思想是利用目标函数的梯度信息来指导方向和步长的选择。
在每一次迭代中,鲍威尔法通过构造一个正定的Hessian矩阵的近似来逼近目标函数的二次泰勒展开式,从而求取方向。
而步长的选择则通过线方法来确定,确保目标函数值在每次迭代中都能够下降。
在机械优化设计中,鲍威尔法可以应用于多种问题,如结构优化、参数优化等。
以结构优化为例,鲍威尔法可以通过不断调整结构的几何形状或内部结构的参数,来使得结构的重量最小或强度最大。
在进行参数优化时,鲍威尔法可以通过调整设计变量的取值,使得可以在给定约束条件下,最大化或最小化一些性能指标。
机械优化设计中的鲍威尔法需要满足一定的数学条件才能保证其收敛性和稳定性。
首先,目标函数必须是连续可微的。
其次,初始设计点的选取对于迭代过程的收敛性也有一定的影响。
一般情况下,选择一个合适的初始设计点可以加快鲍威尔法的收敛速度。
总结起来,鲍威尔法是机械优化设计中一种常用的求解非线性最优化问题的方法。
它可以通过迭代更新设计变量的值,使得目标函数达到最优值。
鲍威尔法不仅具有较好的收敛性能和计算效率,而且对于各种类型的机械优化设计问题都具有很好的适应性。
鲍威尔算法

dj
设xk,
xk+1为从不
x
k
g k+1 dk
同点出发,沿同 一方向dj进行一维 搜索而到的两个 极小点.
x
k+1
梯度和等值面相垂直的性质, dj和 xk, xk+1两点 处的梯度gk,gk+1之间存在关系:
(d j )T g k = 0, (d j )T g k +1 = 0
另一方面,对于上述二次函数,其xk, xk+1 两点处 的梯度可表示为: g k = Gx k + b, g k +1 = Gx k +1 + b 因而有
由于满足Powell条件,则淘汰函数值下降量最 d30 大的方向e1,下一轮的基本方向组为e2, 。 构成新的方向
3 1 2 d = x − x = − = 1.5 1 0.5
0 3 0 2 0 0
d30 方向一维搜索得极小点和极小值 沿 3.8 1 x = , f ( x1 ) = −7.9 1.7
3.96 3.8 4.12 x = 2x − x = 2 − 1.7 = 2.18 1.94
1 3 1 2 1 0
1 F3 = f ( x3 ) = −7.964
检验Powell条件,淘汰函数值下降量最大的方 1 d30 ,d3 。 向e2,下一轮的基本方向组应为 构成新的方向 3.96 3.8 0.16 1 1 1 d 3 = x 2 − x0 = − 1.7 = 0.24 1.94
1 1 d 2 = x 2 − x0
1 0
x2 d1
1 x0
x1 2
x*
0 x2
鲍威尔算法matlab程序f.doc

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>f2alpha3=alpha2+h;f3=fx(x0,alpha3,s);while f2>f3alpha1=alpha2;alpha2=alpha3;alpha3=alpha3+h;f2=f3;f3=fx(x0,alpha3,s);endelseh=-h;v=alpha1;alpha1=alpha2;alpha2=v;v=f1;f1=f2;f2=v;alpha3=alpha2+h;f3=fx(x0,alpha3,s);while f2>f3alpha1=alpha2;alpha2=alpha3;alpha3=alpha3+h;f2=f3;f3=fx(x0,alpha3,s);endenda=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.001if f1>f2a=alpha1;alpha1=alpha2;f1=f2;alpha2=a+0.618*(b-a);f2=fx(x0,alpha2,s);elseb=alpha2;alpha2=alpha1;f2=f1;alpha1=a+0.382*(b-a);f1=fx(x0,alpha1,s);endendf=0.5*(a+b);clear%初始点x0=[0;0];%搜索方向e1=[1;0];e2=[0;1];G0=fun(x0);F0=G0;%第一次迭代%沿着e1alpha1=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<G0 & (G0-2*G2+G3)*(G0-G2-deltam)^2<0.5*deltam*(G0-G3)^2s=x2-x0;%方向替换e1=e2;e2=s;% 沿着方向s 进行搜索alpha3=fsearch(x2,s);x3=x2+alpha2*s;x0=x3;elseif F2>G3x0=x3;elsex0=x2;endEnd子文件JT,JH进退法程序代码56555 .function [minx,maxx] = minJT(f,x0,h0,eps) format long;if nargin == 3eps = 1.0e-6;endx1 = x0;k = 0;h = h0;while 1x4 = x1 + h;k = k+1;f4 = subs(f, findsym(f),x4);f1 = subs(f, findsym(f),x1);if f4 < f1x2 = x1;x1 = x4;f2 = f1;f1 = f4;h = 2*h;elseif k==1h = -h;x2 = x4;f2 = f4;elsex3 = x2;x2 = x1;x1 = x4;break;endendendminx = min(x1,x3);maxx = x1+x3 - minx;format short;黄金分割法程序代码56555 .function [x,minf] = minHJ(f,a,b,eps) format long;if nargin == 3eps = 1.0e-6;endl = a + 0.382*(b-a);u = a + 0.618*(b-a);k=1;tol = b-a;while tol>eps && k<100000fl = subs(f , findsym(f), l);fu = subs(f , findsym(f), u);if fl > fua = l;l = u;u = a + 0.618*(b - a);elseb = u;u = l;l = a + 0.382*(b-a);endk = k+1;tol = abs(b - a);endif k == 100000disp('ÕÒ²»μ½215 ?î208 ?¡214 Oμ£¡); x = NaN;minf = NaN;return;endx = (a+b)/2;minf = subs(f, findsym(f),x);format short;。
- 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<G0 & (G0-2*G2+G3)*(G0-G2-deltam)^2<0.5*deltam*(G0-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);
format short;。