基于MATLAB的鲍威尔法求极值问题

合集下载

利用MATLAB求多元函数的极值(2)

利用MATLAB求多元函数的极值(2)

利用MATLAB求多元函数的极值分两种情况,(1)无约束条件;(2)有约束条件。

(2)有约束条件下求极小值的方法:假设多变量非线性函数的数学模型为min f(x)c(x)<=0ceq(x)=0A·x<=bAeq·x<=x<=beqlb<=x<=ubX, b,beq,lb,ub为矢量,A,Aeq为矩阵,c(X),ceq(X)为函数(可非线性)。

命令格式:x = fmincon(fun,x0,A,b)x = fmincon(fun,x0,A,b,Aeq,beq)x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)[x,fval] = fmincon(...)[x,fval,exitflag] = fmincon(...)[x,fval,exitflag,output] = fmincon(...)[x,fval,exitflag,output,lambda] = fmincon(...)[x,fval,exitflag,output,lambda,grad] = fmincon(...) [x,fval,exitflag,output,lambda,grad,hessian]= fmincon(...) 例如求函数满足条件的极小值解:首先,编制M-file文件function f myfun(x)f=-x(1)*x(2)*x(3)然后重写约束条件为两个小于或等于一个常数的不等式,因为约束条件是线性的,用矩阵表示为Ax<=b 其中;其次,猜测估计提供一个起点,调用优化程序。

x0 = [10; 10; 10]; % 猜测可能的结果作为起点[x,fval] = fmincon(@myfun,x0,A,b)x =24.000012.000012.0000fval =-3.4560e+03A*x-b=-72当x1=24,x2=12,x3=12,时函数有极小值-3.4560e+03。

matlab计算函数极值,如何用MATLAB求函数的极值点和最大值

matlab计算函数极值,如何用MATLAB求函数的极值点和最大值

matlab计算函数极值,如何⽤MATLAB求函数的极值点和最⼤值两种⽅法:1、求导的⽅法:syms x y;>>y=x^3+x^2+1>>diff(y)ans =3*x^2 + 2*x>>solve(ans)ans=-2/3极值有两点。

同时也是最值;2、直接⽤最⼩值函数:求最⼤值,既求-y的最⼩值:>>f=@(x)(-x^3-x^2-1)f =@(x)(-x^3-x^2-1)>>x=fminunc(f,-3,3)%在-3;-3范围内找Warning: Gradient must be provided fortrust-region method; using line-search methodinstead. > In fminunc at354Optimization terminated: relative infinity-norm of gradient lessthan options.TolFun.x =-0.6667>> f(x)ans =-1.1481在规定范围内的最⼤值是1.1481由于函数的局限性,求出的极值可能是局部最⼩(⼤)值。

求全局最值要⽤遗传算法。

例⼦:syms xf=(200+5*x)*(0.65-x*0.01)-x*0.45;s=diff(f);%⼀阶导数s2=diff(f,2);%⼆阶导数h=double(solve(s));%⼀阶导数为零的点可能就是极值点,注意是可能,详情请见⾼数课本fori=1:length(h)ifsubs(s2,x,h(i))<0disp(['函数在' num2str(h(i))'处取得极⼤值,极⼤值为' num2str(subs(f,x,h(i)))])elseifsubs(s2,x,h(i))>0disp(['函数在' num2str(h(i))'处取得极⼩值,极⼩值为'num2str(subs(f,x,h(i)))])elsedisp(['函数在' num2str(h(i))'处⼆阶导数也为0,故在该点处函数可能有极⼤值、极⼩值或⽆极值'])%%%详情见⾼数课本endend。

matlab实验鲍威尔法

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的基本操作方法,了解鲍威尔法的原理与基本运用。

Matlab中如何求一个序列的极值

Matlab中如何求一个序列的极值

Matlab中如何求一个序列的极值?我们知道,在Matlab中有专门求序列最大值和最小值的函数,分别是Max 和Min,但是有时候我们不满足于求整个序列的最值,而是对序列的极值,也就是局部的最值感兴趣。

对于解析函数,这个比较简单,只要令一阶倒数为零求出对应的自变量就行了。

然而对于离散的序列,这种方法显然不可行,一个比较费劲或者说比较笨的方法就是手工查找,仔细考察序列的每一个值,用手工的方法将极值逐一挑出来。

然而对于比较长的序列,这种方法显然不可行。

我们期望有一个自动判断序列中某个点是极值点的函数,把这个艰巨的任务交给Matlab,让Matlab帮我们去找,这样可以节省我们宝贵的时间,把更多的时间放在更有意义的事情上面。

假设我们有一个长度为N的序列v(N,1),下面就是Matlab中实现求v的极值点的命令,其中用到了逻辑数组下标的方法:N = 100;v = rand (N,1);t = 0:length(v)-1;Lmax = diff(sign(diff(v)))== -2; % logic vector for the local max value Lmin = diff(sign(diff(v)))== 2; % logic vector for the local min value % match the logic vector to the original vecor to have the same lengthLmax = [false; Lmax; false];Lmin = [false; Lmin; false];tmax = t (Lmax); % locations of the local max elementstmin = t (Lmin); % locations of the local min elementsvmax = v (Lmax); % values of the local max elementsvmin = v (Lmin); % values of the local min elements% plot them on a figureplot(t,v);xlabel('t'); ylabel('v');hold on;plot(tmax, vmax, 'r+');plot(tmin,vmin, 'g+');hold off;结果如图所示:红色十字代表极大值,绿色十字代表极小值。

matlab函数求极值

matlab函数求极值

xx=-pi/2:pi/200:pi/2; yxx=(xx+pi).*exp(abs(sin(xx+pi))); plot(xx,yxx) xlabel('x'),grid on % 可以用命令[xx,yy]=ginput(1) 从局部图上取出极值点及相应函数
13 12 11 10 9 8 7 6 5 4 3 -2
例3: 求s1= 1

1 dx ,s2= 2 1 x
1 1 dx,s3= dx x 2 2 x 3 x 2 2 x 3

syms x x符号变量 f1=1/(1+x^2); f2=1/(x^2+2*x+3); f3=1/(x^2+2*x-3); s1=int(f1,1,inf) 1到正无穷 s2=int(f2,-inf,inf) int符号积分 s3=int(f3,-inf,inf) s1 = 1/4*pi s2 = 1/2*pi*2^(1/2) s3 = NaN 不确定的结果
1
0.95
0.9
0.85
0.8
0.75
0.7
0.65
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
2、 多元函数的极值
函数命令:fminsearch 调用格式:[x,feval,exitflag,output]=fminsearch(fun,x0,optipons) % 求在x0附近的极值 例4:求 f ( x, y) 100( y x 2 ) 2 (1 x) 2 的极小值.
(2) 采用编程计算: function I=myquad1(a,b,n) x=linspace(a,b,n); %把ab区间平均分成n等份 y=exp(-x.^2)*(b-a)/n; %高×底=每个取边梯形的面积 I=sum(y); I1=myquad1(0,1,10000) I2=myquad1(0,1,100000) I1 = 0.74681784375801 I2 = 0.74682350396218

MATLAB求函数零点与极值

MATLAB求函数零点与极值

MATLAB求函数零点与极值
1. roots函数
针对多项式求零点(详见MATLAB多项式及多项式拟合)
2. fzero函数
返回⼀元函数在某个区间内的的零点.
x0 = fzero(@(x)x.^2-3*x-4,[1,5]);
只能求区间⾥⾯的⼀个零点,并且要求在给定区间端点函数值异号,所以使⽤之前应该先作图,得出单个零点分布的区间,然后使⽤该函数求零点.若有多个零点,则需多次使⽤该函数.
如需求上例中的全部零点,先作图
fplot(@(x)x.^2-3*x-4,[-10,10]);
得知两个零点的分布区间,然后两次使⽤fzero函数求对应区间的零点.
x1 = fzero(@(x)x.^2-3*x-4,[-2,0]);
x2 = fzero(@(x)x.^2-3*x-4,[2,6]);
3. solve函数
求⼀元函数(⽅程)的零点.
x0 = solve('x^2-3*x-4=0','x');
注意⽅程需包含’=0’部分,另外,不建议直接将⽅程写在函数solve的参数部分,可以⽤符号运算的⽅法.
4. fminbnd函数
求⼀元函数在某个区间内的最⼩值和对应的最⼩值点.
[x0,fmin]=fminbnd(@(x)x+1/(x+1),-0.5,2);
求极值与极值点之前须估计极值点的区间,保证在该区间没有使得函数值趋于⽆穷的点.。

matlab求解非线性方程组及极值

matlab求解非线性方程组及极值

matlab求解非线性方程组及极值默认分类2010-05-18 15:46:13 阅读1012 评论2 字号:大中小订阅一、概述:求函数零点和极值点:Matlab中三种表示函数的方法: 1. 定义一个m函数文件, 2.使用函数句柄; 3.定义inline函数, 其中第一个要掌握简单函数编写, 二, 三中掌握一个。

函数的'常规'使用有了函数了, 我们怎么用呢, 一种是直接利用函数来计算, 例如: sin(pi), 还有我们提到的mysqr(3)...另一种是函数画图, 例如Plottools中提到的ezplot, ezsurf... 但是这也太小儿科了, 有没有想过定义函数后, 利用它来: 求解零点(即解f(x)=0方程), 最优化(求最值/极值点), 求定积分, 常微分方程求解等. 当然这里由于篇幅有限(空间快满了)以及这个只是'基础教程'的缘故, 只提及一些皮毛知识, 掌握这些后, 如果需要你可以进一步学习.解f(x)=0已知函数求解函数值=0所表示的方程, Matlab中有两个函数可以做到, fzero和fsolve前者只能解一元方程, 后者可以解多元方程组, 不过基本使用形式上差不多:解=fzero(函数, 初值, options)解=fsolve(函数, 初值, options)关于解: fzero给出的是x单值的解, fsolve给出的是解x可能处于的区间, 当然, 这个区间很窄.关于'函数', 还记得前面提到的三种表示方法吧, 在这里都可以用, 记住就是: 如果直接使用函数名, 要用单引号将它括起来, 而函数句柄, inline函数可以直接使用.关于'初值': 电脑比较笨, 它寻找解的办法是尝试不同地x值, 摸索解在哪里, 所以我们一开始就要给它指明从哪里开始下手, 初值这里, 可以只给它一个值, 让它在这个值附近找解, 也可以给它一个区间(区间用[下限,上限]这种方式表示), 它会在这个区间内找解.fzero的一些局限, 如果你给定的初值是区间, 而恰好函数在区间端点处同号, fzero会出错, 而如果你只给一个初值, fezro又有可能'走错方向', 例如给初值2让它解mysqr这个函数方程就出错了, FT!寻找函数极值/最值Matlab中也有两个函数可以做到, 是: fminbnd: 寻找一元函数极小值; fminsearch: 寻找多元函数极小值(当然一元也行). 别问我怎么没有找极大值的Matlab函数, 你把原函数取负数, 寻找它的极小值不就行了. 相关语法:x=fminbnd(函数, 区间起始值, 区间终止值)x=fminsearch(函数, 自变量初值)相关说明: fminbnd中指定要查找极小值的自变量区间, 好像不指定也行, 不过那样的话, 如果函数有多个极小值就可能比较难以预料结果了.fminsearch中要给定一个初值, 这个初值可以是自变量向量(将自变量依次排在一起组成向量)的初值, 也可以是表示向量初值区间的一个矩阵.函数: 那三种形式都适用, 但是记住, 直接使用函数名称需要加单引号!cite from:/qq529312840/blog/item/3687e4c7e7e2d6d9d0006049.html二、实例+讲解(1)非线性方程数值求解:1 单变量非线性方程求解在MATLAB中提供了一个fzero函数,可以用来求单变量非线性方程的根。

matlab极值点

matlab极值点

matlab极值点【最新版】目录1.MATLAB 简介2.极值点的概念3.MATLAB 中求解极值点的方法4.应用实例正文一、MATLAB 简介MATLAB(Matrix Laboratory)是一款强大的数学软件,广泛应用于科学计算、数据分析、可视化等领域。

它基于矩阵运算,可以方便地处理大量数据,同时提供了丰富的工具箱和函数,为用户提供了极大的便利。

二、极值点的概念极值点,又称为临界点,是指函数在某一点处取得最大值或最小值的点。

在数学、物理等科学领域中,寻找极值点是研究函数性质的一个重要任务。

三、MATLAB 中求解极值点的方法在 MATLAB 中,有多种方法可以求解极值点。

这里我们介绍两种常用的方法:fsolve 函数和 fmincon 函数。

1.fsolve 函数fsolve 函数可以用于求解非线性方程组或方程的根。

对于求解极值点问题,我们可以将极值点的条件转化为方程或方程组,然后使用 fsolve 函数求解。

例如,对于函数 f(x) = x^3 - 6x^2 + 9x,我们可以通过求解 f(x)= 0 得到极值点。

使用 fsolve 函数,代码如下:```matlabf = @(x) x^3 - 6*x^2 + 9*x;x0 = -1;[x, fval] = fsolve(f, x0);```2.fmincon 函数fmincon 函数可以用于求解带约束的最小值问题。

在求解极值点时,我们可以将极值点的条件转化为优化问题,并添加相应的约束条件,然后使用 fmincon 函数求解。

例如,对于函数 f(x) = x^3 - 6x^2 + 9x,我们可以通过求解 f(x) 的最小值得到极值点。

使用 fmincon 函数,代码如下:```matlabf = @(x) x^3 - 6*x^2 + 9*x;A = [1, -6, 9];b = [0, 0, 0];Aeq = [];beq = [];lb = [];ub = [];[x, fval] = fmincon(f, [], [], A, b, Aeq, beq, lb, ub);```四、应用实例假设我们要研究函数 g(x) = x^4 - 4x^3 + 3x^2 在区间 [0, 10] 上的极值点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于MATLAB的鲍威尔法求极值问题姓名:xxx 学号:xxx(北京理工大学机械与车辆学院车辆工程,北京 100081)摘要:无约束优化方法主要有七种,按照求导与否把这些方法分为间接法和直接法。

牛顿法的成败与初始点选择有极大关系,其可靠性最差;坐标轮换法、单纯形法和最速下降法对于高维优化问题计算效率很低,有效性差;由于编制变尺度法程序复杂,其简便性不足。

综合考虑后,鲍威尔法、共轭梯度法具有较好的综合性能。

本文首先对鲍威尔法的原理进行阐述,根据其迭代过程给出流程图,并编写MATLAB程序。

最后用此MATLAB程序求解实际的极值问题,并对求解结果进行简要分析。

1.鲍威尔法的基本思想1.1其他优化方法对鲍威尔法形成的影响通过对鲍威尔法的学习,可以很明显看出来其迭代思想中汲取了其他几种优化方法的核心思想。

为了更全面、更深入的学习鲍威尔法,很有必要对其他有影响的优化思想进行学习和梳理。

由最基本的数学基础知识可知,梯度方向是函数增加最快的方向,负梯度方向是函数下降最快的方向,于是,利用这个下降最快方向产生了最速下降法。

每次迭代都沿着负梯度方向进行一维搜索,直到满足精度要求为止。

其特点是相邻两个搜索方向互相正交,所以很明显的一个现象就是刚开始搜索步长比较大,愈靠近极值点其步长愈小,收敛速度愈慢,特别当二维二次目标函数的等值线是较扁的椭圆时,迭代速度更慢。

这时,倘若目标函数是等值线长、短轴都平行于坐标轴的椭圆形,则通过坐标轮换法可以很高效的解决问题。

通过两次分别沿坐标轴进行一维搜索,便可达到极值点。

但对于目标函数的等值线椭圆的长、短轴倾斜于坐标轴时,坐标轮换法的搜索效率也显得极低。

抛开这两种特殊情况,对于一般形态的目标函数,如果在某些明显可以直达最优点的情况下(一般为靠近极值点区域),迭代过程完全可以不沿负梯度方向搜索,取而代之的是找到直达最优点的方向,一步到位。

但这样的直达方向应该如何去找呢?共轭梯度法由此产生。

其基本原理是:任意形式的目标函数在极值点附近的特性都近似一个二次函数,其等值线在极值点附近为近似的同心椭圆簇,而同心椭圆簇有一个特性便是任意两条平行线与椭圆簇切点的连线必通过椭圆的中心。

而这个连线方向便是所寻找的直达方向。

通过对其迭代过程的分析,很明显可以看出需大量的求目标函数的一阶和二阶偏导数。

对于一些实际的机械优化问题,目标函数可能复杂到难以求取其偏导数或者根本就不存在,求取极值问题就显得无从下手。

所以,一个效率高的、适应性强的优化方法急需出现,而鲍威尔法便是这么一种综合的方法。

1964年,鲍威尔提出了对共轭方向法的改进方法——鲍威尔共轭方向法。

一维搜索法、共轭方向和坐标轮换法的思想在鲍威尔法中体现的淋漓尽致。

下面就对鲍威尔法的基本原理进行阐述。

1.2鲍威尔法的数学原理通过前文可知,鲍威尔法也算一种共轭方向法,但与共轭梯度法相比,不需要对函数求导,而是在迭代过程中逐次构造出用于搜索的共轭方法。

1). 对于二维无约束优化问题,采用鲍威尔法求解的迭代过程如图1-1所示。

任选一初始点0X ,令00X X =,按照坐标轮换法,选择两个单位向量1110d e ⎡⎤==⎢⎥⎣⎦和2201d e ⎡⎤==⎢⎥⎣⎦,以此作为搜索方向进行第一轮搜索得到02X 点。

2). 用00X 和02X 的连线方向构成新的搜索方向1d 。

从02X 点出发,沿1d 方向一维搜索得到10X 点,作为下一轮搜索的初始点。

3). 从10X 出发,依次沿1201d e ⎡⎤==⎢⎥⎣⎦和12d d =方向进行一维搜索,得到点11X 和点12X 。

4). 用点10X 和点12X 的连线方向21120d X X =-构成新的搜索方向。

10X 和12X 是从两个不同点出发沿相同方向1d 搜索得到的,所以1d 与10X 和12X 的连线方向2d 互为共轭方向。

从12X 点出发,沿2d 方向一维搜索得到20X 点。

因20X 是从02X 点出发依次沿两个互为共轭的方向1d 和2d 进行两次一维搜索得到的,所以20X 就是该二维二次函数的极小点*X 。

图1-1 二维情况下鲍威尔法的迭代过程将上述二维优化问题扩展到n 维的情况,得到鲍威尔法的基本迭代过程:从初始点出发依次沿n 个线性无关的方向组进行一维搜索得到一个终点,沿初始点和终点的连线方向一维搜索得到下一轮迭代的初始点,并以这个方向作为下一轮迭代方向组中的最后一个方向,同时去掉第一个方向,组成的新方向组进行第一轮迭代。

若目标函数是个n 维的正定二次函数,则经过这样的n 轮迭代以后,就可以收敛到最优点。

但是这种方法有一个缺陷,通过这种方法产生的n 个新方向,有可能是线性相关或近似线性相关的。

因为新方向01nkk k i ni i d X X d α==-=∑,如果其中出现了0i α=,则k d 就可以表示为2d ,3d ,…,n d 的线性组合,这样用新方向kd 替换1d 后,新的坐标轮换方向组就成为线性相关的一组向量,以后的各轮迭代计算将在维数下降了的空间内进行,这将导致算法收敛不到真正的最优点。

针对此现象,通过适当改进,产生了新的鲍威尔法。

1.3改进的鲍威尔法由上一小节讨论可知,如果对新方向组的形成加以适当的选择,防止其线性相关,则可以避免鲍威尔法的“退化”。

在这里直接给出是否用kd 方向替代m d 来组成新的搜索方向组的判别条件,供后面编程所用。

设()10k f f X =,()2k n f f X =,()302k k n f f X X =-。

其中最大者11max k k k m i m m i nf f -<<∆=∆=-。

若31f f <且221231213(2)()0.5()k k m m f f f f f f f -+--∆<∆-成立,则用kd 方向替代m d 方向,否则仍用原来的n 个搜索方向。

这样,改进后的鲍威尔法保证了对于非线性函数计算时收敛的可靠性。

2. 迭代过程和算法流程图2.1迭代过程1). 给定初值点0X ,n 个线性无关的初始向量组0100[,,,]n D d d d =及精度0ε>,置0k =。

2). 从0k k X X =点出发沿01[,,,]n k k D d d d =中的方向进行一维搜索:111111110()min ()k kj k kj j j j j k k j j j t X X X X d f X d f X d ααα--------≥⎧=⎪⎪=+⎨⎪+=+⎪⎩,其中1,2,,;j n =3). 判断是否满足收敛准则,若0k k n X X ε-<成立,则迭代停止,输出*k n X X =,*X 即为最优点;否则跳至第4步。

4). 计算第k 轮迭代中相邻两点目标函数值的下降量,并找出下降量最大者。

1k k k i i i f f -∆=-11max k k km i m m i nf f -<<∆=∆=-相应的方向:1kk km m m d X X -=-5). 沿共轭方向10kk kn n d X X +=-计算反射点。

102k k kn n X X X +=-6). 检验判别条件。

令()10kf f X =,()2k n f f X =,()31k n f f X +=,若同时满足:31f f <221231213(2)()0.5()k k m m f f f f f f f -+--∆<∆-则转第6步;否则转第7步。

7). 由k n X 出发沿1kn d +方向进行一维搜索,求出此方向极小点k X ,并令下一轮迭代初始点10k kX X +=。

同时令1111212111[,,,][,,,,,,]k k k kkkkkn m m n d d d d d d d d +++-++=,同时置1k k =+。

并转第2步。

8). 若32f f <,则101k k n X X ++=;否则10k kn X X +=。

置1k k =+,转第2步。

2.2算法流程图鲍威尔法的算法流程图如图2-1。

kki i d α沿方向一维搜索求最优步长1kk k k ii i i X X d α-=+1kk km m m d X X -=-n+1kd 沿方向一维搜索求最优步长1k n d X +=+110n 1kk k kn n X X dα++=+11(,1,,)k kii d d i m m n ++⇐=+1(1,2,,1)k k iidd i m +⇐=-图 2-1 鲍威尔法的算法流程图3. 鲍威尔法的MATLAB 程序function [x,minf,k,allX,allY] = Powell_Graphic(f,x0,D,var,eps) format long;if nargin == 4 %默认精度为1.0e-2 eps = 1.0e-2;endn = length(var)+1;k = 0;syms l;while 1tx = zeros(size(D));tx(:,1) = x0;for i=1:n-1 %在每个方向上开始一维搜索xv = tx(:,i) + l*D(:,i);fx = Funval(f, var,xv);[a,b] = minJT(fx,0,0.1); %一维搜索进退法确定搜索区间tl = minHJ(fx,a,b); %黄金分割法求最优点tx(:,i+1) = tx(:,i) + tl*D(:,i);endD(:,n) = tx(:,n) - tx(:,1); %判断收敛性是否满足精度要求if norm(D(:,n)) <= epsx = tx(:,n);allX(:,k*n+1:(k+1)*n) = tx(:,1:n);for j=1:nallY(:,k*n+j) = Funval(f, var,tx(:,j));endbreak;elsefor j=1:nFX(j) = Funval(f, var,tx(:,j));endmaxDF = -inf;m = 0;for j=1:n-1df = FX(j) - FX(j+1);if df > maxDFmaxDF = df;m = j+1;endendtmpF = Funval(f, var,2*tx(:,n)-tx(:,1));fl=(FX(1)-2*FX(n-1)+tmpF)*(FX(1)-FX(n-1)-maxDF)^2;if fl<0.5*maxDF*(FX(1)-tmpF)^2 && tmpF<FX(1)%检验判断条件决定换方向 xv = tx(:,n) + l*D(:,n);fx = Funval(f, var,xv);[a,b] = minJT(fx,0,0.1);tl = minHJ(fx,a,b);x0 = tx(:,n) + tl*D(:,n); D(:,m:(n-1)) = D(:,(m+1):n); elseif tmpF < FX(n-1)x0 = 2*tx(:,n)-tx(:,1); elsex0 = tx(:,n); end end k=k+1;allX(:,(k-1)*n+1:k*n) = tx(:,1:n); for j=1:nallY(:,(k-1)*n+j) = Funval(f, var,tx(:,j)); end end endminf = Funval(f,var,x); format short;程序中用到的函数minJT 、minHJ 和Funval 分别为进退法确定搜索区间函数、黄金分割法求极值函数和计算函数值函数,直接调用即可,由于篇幅限制,故不在此列出其代码。

相关文档
最新文档