Matlab优化(求极值)
- 格式:doc
- 大小:137.50 KB
- 文档页数:6
matlab计算多元函数极值极其极值点《从简到繁,深入探讨matlab计算多元函数极值极其极值点》1. 引言在数学中,多元函数是一种以多个变量为自变量的函数,它与一元函数有着本质的区别。
而计算多元函数的极值及其极值点是数学分析中一个重要且复杂的问题。
本文将从简到繁地探讨如何利用matlab来计算多元函数的极值及其极值点,以帮助读者更深入地理解这一数学概念。
2. 多元函数的极值我们需要明确什么是多元函数的极值。
对于一个多元函数,如果在某一点处的函数值大于或小于其邻域内所有其他点处的函数值,那么这个点就是该多元函数的极大值点或极小值点。
而这个极值点所对应的函数值就是多元函数的极值。
在matlab中,可以通过最优化工具箱中的相关函数来计算多元函数的极值,比如fmincon函数用于求解约束极小化问题。
3. 计算多元函数的极值为了更具体地说明如何在matlab中计算多元函数的极值,我们以一个简单的二元函数为例:z = f(x, y) = x^2 + y^2。
我们希望找到这个函数的极值及其极值点。
我们需要定义这个函数并选定初始点,然后利用matlab中的优化函数进行计算。
具体的代码如下:```matlab% 定义目标函数fun = @(x) x(1).^2 + x(2).^2;% 设定初始点x0 = [1, 2];% 求解极小值[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon);```在这段代码中,我们首先利用@(x)定义了目标函数f(x, y) = x^2 + y^2,然后设定了初始点x0 = [1, 2]。
最后利用fmincon函数计算了函数的极小值x和其对应的函数值fval。
通过这个简单的例子,读者可以初步了解如何在matlab中计算多元函数的极值。
4. 深入探讨除了简单的二元函数外,实际应用中常常遇到更复杂的多元函数,这时利用matlab计算极值就显得尤为重要。
matlab计算两个极值点的方法摘要:一、引言二、Matlab计算极值点的原理1.导数法2.二次规划法3.梯度下降法三、具体操作步骤1.导入数据2.计算导数3.寻找极值点四、实例演示1.简单的二维函数2.复杂的三维函数五、总结与展望正文:一、引言在工程实践中,经常会遇到需要求解极值点的问题。
Matlab作为一款强大的数学计算软件,为我们提供了多种求解极值点的方法。
本文将详细介绍如何在Matlab中计算两个极值点,以及具体的操作步骤。
二、Matlab计算极值点的原理1.导数法求解极值点的一种常用方法是利用函数的导数。
Matlab中提供了求导函数`fprintf`,可以方便地对函数进行求导。
找到函数的零点,即为极值点。
2.二次规划法二次规划法是一种求解无约束优化问题的方法。
通过构建一个目标函数和相应的约束条件,利用Matlab中的优化工具箱求解。
找到目标函数的极值点。
3.梯度下降法梯度下降法是一种迭代算法,通过不断更新变量值,使目标函数值逐步逼近极值。
Matlab中的梯度下降函数`fminbnd`可以用于求解极值点。
三、具体操作步骤1.导入数据首先,我们需要导入所需的函数和数据。
例如,我们可以使用`load`函数导入一个已经保存的矩阵或使用`x=1:10`创建一个区间数据。
2.计算导数对于简单的函数,我们可以直接使用`fprintf`函数求导。
例如,假设我们有函数`f(x)=x^3-6x^2+9`,可以计算其导数`df(x)=3x^2-12x`。
3.寻找极值点利用Matlab中的`zeros`函数找到导数为零的点,这些点即为极值点。
例如,求解方程`3x^2-12x=0`,得到极值点x=0和x=4。
4.对于复杂函数或三维函数,可以使用`fminbnd`函数求解极值点。
首先,定义目标函数和约束条件。
然后,调用`fminbnd`函数,得到极值点。
四、实例演示1.简单的二维函数假设我们有函数`f(x,y)=x^2+y^2-6x-8y+10`,在Matlab中可以按照以下步骤求解极值点:(1)计算导数:`df(x,y)=2x-6+2y-8`(2)寻找极值点:`zeros(2*10)`(3)求解极值点:使用`fminbnd`函数,设置初始猜测值`x0=y0=1`,得到极值点约为(2.24,3.24)。
基于MATLAB的鲍威尔法求极值问题:xxx 学号:xxx(理工大学机械与车辆学院车辆工程,100081)摘要:无约束优化方法主要有七种,按照求导与否把这些方法分为间接法和直接法。
牛顿法的成败与初始点选择有极大关系,其可靠性最差;坐标轮换法、单纯形法和最速下降法对于高维优化问题计算效率很低,有效性差;由于编制变尺度法程序复杂,其简便性不足。
综合考虑后,鲍威尔法、共轭梯度法具有较好的综合性能。
本文首先对鲍威尔法的原理进行阐述,根据其迭代过程给出流程图,并编写MATLAB程序。
最后用此MATLAB程序求解实际的极值问题,并对求解结果进行简要分析。
1.鲍威尔法的基本思想1.1其他优化方法对鲍威尔法形成的影响通过对鲍威尔法的学习,可以很明显看出来其迭代思想中汲取了其他几种优化方法的核心思想。
为了更全面、更深入的学习鲍威尔法,很有必要对其他有影响的优化思想进行学习和梳理。
由最基本的数学基础知识可知,梯度方向是函数增加最快的方向,负梯度方向是函数下降最快的方向,于是,利用这个下降最快方向产生了最速下降法。
每次迭代都沿着负梯度方向进行一维搜索,直到满足精度要求为止。
其特点是相邻两个搜索方向互相正交,所以很明显的一个现象就是刚开始搜索步长比较大,愈靠近极值点其步长愈小,收敛速度愈慢,特别当二维二次目标函数的等值线是较扁的椭圆时,迭代速度更慢。
这时,倘若目标函数是等值线长、短轴都平行于坐标轴的椭圆形,则通过坐标轮换法可以很高效的解决问题。
通过两次分别沿坐标轴进行一维搜索,便可达到极值点。
但对于目标函数的等值线椭圆的长、短轴倾斜于坐标轴时,坐标轮换法的搜索效率也显得极低。
抛开这两种特殊情况,对于一般形态的目标函数,如果在某些明显可以直达最优点的情况下(一般为靠近极值点区域),迭代过程完全可以不沿负梯度方向搜索,取而代之的是找到直达最优点的方向,一步到位。
但这样的直达方向应该如何去找呢?共轭梯度法由此产生。
其基本原理是:任意形式的目标函数在极值点附近的特性都近似一个二次函数,其等值线在极值点附近为近似的同心椭圆簇,而同心椭圆簇有一个特性便是任意两条平行线与椭圆簇切点的连线必通过椭圆的中心。
MATLAB极值点一、引言MATLAB是一种强大的数学建模和仿真软件,广泛应用于科学研究、工程设计和数据分析等领域。
在MATLAB中,寻找极值点是一项常见的任务,它对于优化问题的求解和函数的分析具有重要意义。
本文将详细介绍MATLAB中寻找极值点的方法和应用。
二、MATLAB中的极值点寻找方法2.1 梯度下降法梯度下降法是一种常用的优化算法,它通过迭代的方式逐步逼近函数的极小值点。
在MATLAB中,可以使用fminunc函数来实现梯度下降法。
该函数需要提供一个目标函数和初始点,然后通过迭代计算来寻找极小值点。
2.2 全局优化方法全局优化方法是一种寻找函数全局极小值点的算法。
MATLAB中提供了fmincon函数来实现全局优化。
该函数需要提供一个目标函数和约束条件,然后通过迭代计算来寻找全局极小值点。
2.3 网格搜索法网格搜索法是一种简单但有效的寻找函数极值点的方法。
在MATLAB中,可以使用gridsearch函数来实现网格搜索法。
该函数需要提供一个目标函数、搜索范围和步长,然后通过遍历搜索来寻找极值点。
三、MATLAB中极值点的应用3.1 函数优化在许多实际问题中,需要寻找一个函数的最优解。
例如,在工程设计中,需要找到一个函数的最小值点来满足设计要求。
MATLAB中的优化工具箱提供了丰富的函数和方法来解决这类问题。
3.2 数据分析在数据分析中,寻找极值点可以帮助我们理解数据的特征和趋势。
例如,我们可以通过寻找时间序列数据的极大值点来找到数据的峰值。
MATLAB中的统计工具箱提供了各种函数和方法来进行数据分析和极值点的寻找。
3.3 图像处理在图像处理中,寻找图像的极值点可以帮助我们定位图像的边缘和特征点。
例如,在边缘检测中,我们可以通过寻找图像的极小值点来找到图像的边缘。
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 软件求一元函数的导数和极(或最)值一、一元函数的导数1.调用格式一:diff(‘f(x)','x',n)式中,)(x f 为函数,x 为自变量,若未指明,按默认的自变量.n 为导数的阶数,缺省时,求一阶导数.例1 已知x x x f cos )(2=,求)(x f ′.解 在命令行中输入:dydx=diff('x^2*cos(x)') %未指明自变量,按默认的自变量输出导数结果结果如下:dydx =2*x*cos(x)-x^2*sin(x)即x x x x x f sin cos 2)(2−=′.例2 已知)arcsin(xt t y =(x 为常数),求22dty d . 解 在命令行中输入:d2ydt2=diff('t*asin(x*t)','t',2) %若不指明对t 求导,则默认对x 求导结果如下:d2ydt2 =2*x/(1-x^2*t^2)^(1/2)+t^2*x^3/(1-x^2*t^2)^(3/2)即3223222])(1[)(12xt t x xt x dt y d −+−=. 2.调用格式二:syms xdiff(f(x),x,n)例3 已知)arcsin(xt t y =(t 为常数),求2dx y d . 解 在命令行中输入:syms x td2ydx2=diff(t*asin(x*t),x,2)输出结果是:d2ydx2 =t^4/(1-x^2*t^2)^(3/2)*x即32422])(1[xt xt dx y d −=. 二、隐函数的导数在Matlab 中没有直接求隐函数导数的命令,但可调用Maple 中求隐函数导数的命令,调用格式如下:maple('implicitdiff(f(x,y)=0,y,x)')例4 求由方程05=−−+y x e xy 所确定的隐函数dxdy . 解 在命令行中输入:dydx=maple('implicitdiff(x*y-exp(x+y)-5=0,y,x)')运行结果是:dydx =-(y-exp(x+y))/(x-exp(x+y))即 yx yx e x e y dx dy ++−−−=. 三、一元函数的极(或最)值在Matlab 中只有求极(或最)小值命令的函数.若要求函数)(x f 在),(21x x 内的极(或最)大值,可转化为求)(x f −在),(21x x 内的极(或最)小值.求极(或最)小值点和极(或最)小值的调用格式是:[x,fual]=fminbnd(‘fun ’,x1,x2)式中,fun 为函数,x1,x2为x 的取值范围,x 为极(或最)小点,fual 为极(或最)小值.例5 求函数x e x f x sin 2)(−=在)5,2(的最小值点和最小值.解 在命令行中输入:[xmin,fmin]=fminbnd('2*exp(-x)*sin(x)',2,5)输出结果如下:x min=3.9270fmin =-0.0279例6 求函数231)(x x x f −−=在]9,10[−的最值点和最值.解 在命令行中输入:[xmin,fmin]=fminbnd('1-3*x-x^2',-10,9); %求)(x f 的最小值点和最小值[xmax,zmin]=fminbnd('-1+3*x+x^2',-10,9); %转化为求)(x f −的最小值点和最小值 fmax=-zmin; %))((x f −−的最大值xmin,fmin,xmax,fmax %输出最小值点、最小值和最大值点、最大值运行结果为:xmin =9fmin =-107xmax =-1.5000fmax =3.2500四、上机实验1.用help命令查看函数diff,fminbnd等的用法.2.上机验证上面各例.3.作相关小节练习中函数的导数和求函数的极(或最)值.。
用MATLAB求极值灵活的运用MATLAB的计算功能,可以很容易地求得函数的极值。
例3.6.1 求223441x xyx x++=++的极值解首先建立函数关系:s yms sy=(3*x^2+4*x+4)/( x^2+x+1); ↙然后求函数的驻点:dy=diff(y); ↙xz=solve(dy) ↙xz=[0] [-2]知道函数有两个驻点x1=0和x2=-2,考察函数在驻点处二阶导数的正负情况:d2y=diff(y,2); ↙z1=limit(d2y,x,0) ↙z1=-2z2=limit(d2y,x,-2) ↙z2=2/9于是知在x1=0处二阶导数的值为z1=-2,小于0,函数有极大值;在x2=-2处二阶导数的值为z2=2/9,大于0,函数有极小值。
如果需要,可顺便求出极值点处的函数值:y1=limit(y,x,0) ↙y1=4y2=limit(y,x,-2) ↙y2=8/3事实上,如果知道了一个函数的图形,则它的极值情况和许多其它特性是一目了然的。
而借助MA TLAB的作图功能,我们很容易做到这一点。
例3.6.2画出上例中函数的图形解syms x ↙y=(3*x^2+4*x+4)/( x^2+x+1); ↙得到如下图形ezplot(y) ↙如何用MATLAB求函数的极值点和最大值比如说y=x^3+x^2+1,怎样用matlab来算它的极值和最大值?求极值:syms x y>> y=x^3+x^2+1>> diff(y) %求导ans =3*x^2 + 2*x>> solve(ans)%求导函数为零的点ans =-2/3极值有两点。
求最大值,既求-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 for trust-region method;using line-search method instead.> In fminunc at 354Optimization terminated: relative infinity-norm of gradient less than options.TolFun.x =-0.6667>> f(x)ans =-1.1481在规定范围内的最大值是1.1481由于函数的局限性,求出的极值可能是局部最小(大)值。
Matlab二元函数求极值是一个常见的数学问题,而遗传算法作为一种优化方法,在解决这个问题上也发挥了重要作用。
在本文中,我将对matlab二元函数求极值和遗传算法的相互关系进行深度探讨,并共享我个人对这一主题的理解。
1. Matlab二元函数求极值的基本概念Matlab是一种用于数值计算和可视化的高级技术计算语言和交互式环境。
在数学建模和优化问题中,经常会遇到需要求解二元函数的极值的情况。
这就涉及到了寻找函数在给定范围内的最大值或最小值的问题。
通过利用Matlab中的优化工具箱和相关函数,我们可以高效地求解二元函数的极值点,从而得到函数在特定区域内的最优解。
2. 遗传算法在优化问题中的应用遗传算法是一种模拟自然选择与遗传机制的计算方法,常用于解决优化问题。
它通过模拟自然界中的进化过程,通过选择、交叉和变异等操作,逐步优化解的质量,最终找到问题的最优解。
在实际应用中,遗传算法被广泛应用于解决复杂的优化问题,包括函数极值求解、组合优化、参数优化等多个领域。
3. Matlab二元函数求极值中遗传算法的应用在Matlab中,我们可以利用遗传算法工具箱来解决二元函数的极值求解问题。
通过将二元函数极值求解问题转化为适应度函数的优化问题,我们可以使用Matlab中优化工具箱中的遗传算法求取最优解。
遗传算法能够在多样化的解空间中高效地搜索最优解,从而在众多解空间中找到最优的极值点。
4. 个人观点与理解我认为,Matlab二元函数求极值与遗传算法的结合,为解决复杂的优化问题提供了一种高效的方法。
遗传算法能够通过对解的多样性进行搜索,找到最优解的潜力非常大。
当我们将遗传算法与Matlab中强大的数值计算和优化工具箱相结合,就可以更快、更精确地求解二元函数的极值,从而解决实际问题中的优化难题。
在本文中,我对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函数,可以用来求单变量非线性方程的根。
0 引言通常,我们对数据节点得到的曲线(或折线),需要计算其波峰波谷,也就是极值点。
数学上是通过一阶导数等信息来获得极值点的,这里通过一阶微分来处理,得到极值信息。
1 极值计算输入节点数据,要求计算波峰波谷(极大值、极小值),并作出标记。
代码% By lyqmath% DLUT School of Mathematical Sciences% BLOG:/lyqmathclc; close all; clear;% 节点信息data=[105.03 99.18 84.965 72.445 68.994 77.265...91.052 100.61 98.215 86.363 74.439 71.625...80.061 92.18 97.823 91.483 80.241 73.616...78.547 89.084 94.924 89.689 79.898 75.485...81.544 89.485 90.578 83.712 77.401 80.18...86.904 88.721 83.468 78.971 81.983 86.25...85.224 80.901 80.808 84.488];% 微分变号信息IndMin=find(diff(sign(diff(data)))>0)+1;IndMax=find(diff(sign(diff(data)))<0)+1;figure; hold on; box on;plot(1:length(data),data);plot(IndMin,data(IndMin),'r^')plot(IndMax,data(IndMax),'k*')legend('曲线','波谷点','波峰点')title('计算离散节点的波峰波谷信息', 'FontWeight', 'Bold');本文来自: 高校自动化网() 详细出处参考(转载请保留本链接):/html/matlab/15853.html。
第七讲 Matlab 优化(求极值)理论介绍:算法介绍、软件求解. 一.线性规划问题1.线性规划问题是在一组线性约束条件的限制下,求一线性目标函数最大或最小值的问题,Matlab 中规定线性规划的标准形式为min s.t.T xc xAx b Aeq x beq lb x ub ≤⎧⎪⋅=⎨⎪≤≤⎩其中c 和x 为n 维列向量,A 、Aeq 为适当维数的矩阵,b 、beq 为适当维数的列向量。
注意:线性规划问题化为Matlab 规定中的标准形式。
求解线性规划问题的Matlab 函数形式为linprog(c,A,b),它返回向量x 的值,它的具体调用形式为:[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,x0,OPTIONS)这里fval 返回目标函数的值,LB 、UB 分别是变量x 的下界和上界,x0是x 的初始值,OPTIONS 是控制参数。
例1 求解线性规划问题123123123123123max 23572510s.t.312,,0z x x x x x x x x x x x x x x x =+-++=⎧⎪-+≥⎪⎨++≤⎪⎪≥⎩ 程序:c=[2;3;5];>> A=[-2,5,-1;1,3,1];b=[-10;12]; >> Aeq=[1,1,1];beq=[7]; >> LB=[0;0;0];(zeros(3,1))>> [x,fval]=linprog(c,A,b,Aeq,beq,LB,[]) 练习与思考:求解线性规划问题12312312123min 23+428s.t.3+26,,0z x x x x x x x x x x x =+++≥⎧⎪≥⎨⎪≥⎩ 注意:若没有不等式:b AX ≤存在,则令A=[ ],b=[ ]. 若没有等式约束, 则令Aeq=[ ], beq=[ ].2.可以转化为线性规划的问题规划问题12min||+||++||s.t.,n x x x Ax b ≤L 其中1=[],T n x x x L ,A b 为相应维数的矩阵和向量。
注意到对任意的i x 存在,>0i i u v 满足=-,||=+i i i i i i x u v x u v ,事实上只要取+||||-=,=22i i i i i i x x x xu v 就可以满足上面的条件。
这样,记11=[],=[],T T n n u u u v v v L L 从而可以把问题变成=1min (+)(-)s.t.,0ni i i u v A u v b u v ≤⎧⎨≥⎩∑例2 求解规划问题min{max||}iii x y ε,其中=-.i i i x y ε对于这个问题,如果取0=lim||ii y x ε,这样,上面的问题就变换成01100min s.t.-,,-n n x x y x x y x ≤≤L这是我们通常的线性规划问题。
练习与思考:规划问题1234123412341234min ||2||+3||+4||--+=0s.t.-+-3=11--2+3=-2z x x x x x x x x x x x x x x x x =+⎧⎪⎪⎨⎪⎪⎩二.非线性一元函数的最小值对于求一元函数的最小值问题,Matlab 提供了一个命令函数fminbnd ,fminbnd 函数的调用格式为:X=fminbnd(fun,x1,x2)和[X,fval]=fminbnd(fun,x1,x2)其中fun 为目标函数,x1,x2为变量的边界约束,即12[,]x x x ∈,X 为返回的满足fun 取得最小值的x 的值,fval 为目标函数值。
例3 计算函数321()x x x x f x e e-+-=+的最小值和f(x)取最小值时x 的值,[5,5].x ∈-程序:>> clear>> fun='(x^3+x^2-1)/(exp(x)+exp(-x))'; >> ezplot(fun,[-5,5]) >> [X,fval]=fminbnd(fun,-5,5)练习与思考:如何求一元函数的最大值 三.无约束非线性多元变量函数的优化对于无约束非线性多元变量函数的优化问题,主要采用命令函数fminsearch 和fminunc ,其中fminsearch 比较适合处理低阶多间断点的函数,fminunc 则对高阶连续函数有效。
1.命令函数fminsearch函数fminsearch 求解目标函数fun 的最小值和fun 取最小值时变量x 的值,调用格式为:X=fminsearch(fun,X0)和[X,fval]=fminsearch(fun,X0)其中X0为声明变量的初始值,X 为返回的x 的值,fval 为返回的fun 的值。
例4 求12[,],x x 使目标函数12()sin cos f x x x =+取得最小值。
程序:>> clear >> X0=[0,0];>> [X,fval]=fminsearch('sin(x(1))+cos(x(2))',X0)说明:声明变量初始值对返回的x 的值的影响。
X0=[100,100] 2.命令函数fminunc函数fminunc 通过计算寻找多变量目标函数fun 的最小值,调用格式为:X=fminunc(fun,X0)和[X,fval]=fminunc(fun,X0)其中X0为优化的初始值,X 为返回的x 的值,fval 为返回的fun 的值。
例5 对函数12212122()(42421)x f x e x x x x x =++++进行最小值优化。
程序:>> clear>> fun='exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1)'; >> x0=[0,0];>> [x,fval]=fminunc(fun,x0)注意:fminunc 函数只能处理实函数的优化问题,目标函数最好是连续函数,给出的解可能只是局部解。
四.有约束非线性多元变量函数的优化1.Matlab 命令函数fmincon 可以处理有约束的非线性多元变量的优化问题,有约束多元变量优化问题的数学模型为:求一组变量xi ,满足在给定的约束条件下,使目标函数f(xi)取得最小值。
目标函数一般为非线性函数,约束条件有线性不等式约束、线性等式约束、变量边界约束和非线性约束。
线性约束:i Ax B ≤,等式约束:i Aeq x Beq ⋅=,边界约束:i i i Lb x Ub ≤≤,fmincon 函数的调用格式为:[x,fval]=fmincon(fun,x0,A,B,Aeq,Beq,Lb,Ub,nonlcon,options)其中,nonlcon 表示非线性约束条件,options 为设置的控制优化过程的优化参数向量(可以用optionset 打开)。
非线性约束的表示形式为:把不等式和等式变换成小于号(或等号)左边是函数表达式右边为0的形式,然后以函数表达式作为元素分别组成不等式约束矩阵和等式约束矩阵。
当约束条件比较复杂时,常常先建立约束条件的M 文件。
例6求12[,],x x 使目标函数12212122()(42421)x f x e x x x x x =++++取得最小值,约束条件为:121212121.5*0;*10,0,0.x x x x x x x x +--≤-≤≥≥程序:(1)建立非线性约束的M 文件 function [c,ceq]=confun(x)c=[+x(1)*x(2)-x(1)-x(2);-x(1)*x(2)-10]; ceq=[];end(2)建立优化命令 >> clear x0=[-1,1];fun='exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1)'; lb=[0,0]; ub=[]; options=[];>> [x,fval,exitflag,output]=fmincon(fun,x0,[],[],[],[],lb,ub,'confun',options) 参数exitflag 有3种情况,exitflag>0表示优化结果收敛于解,exitflag<0表示优化结果不收敛于解,exitflag=0表示优化超过了声明的代入函数值的次数;output 包含优化过程的信息。
2.已知梯度条件的优化(例6的第二种解法)对于复杂的非线性优化问题,利用已知的梯度条件将会取得更加令人满意的结果。
例7利用梯度条件对12212122min ()(42421)x f x e x x x x x =++++进行优化,约束条件为:1212121.5*0;*10.x x x x x x +--≤-≤分析:(1)先写出目标函数和约束条件的梯度函数表达式:目标函数:12212122(42421)x objfun e x x x x x =++++ 目标函数的梯度:11122121221221[(42421)(84);(442)]x x x G e x x x x x e x x e x x =++++++++约束函数:121212[1.5*;*10]confun x x x x x x =+----梯度221111x x CG x x --⎧⎫=⎨⎬--⎩⎭程序:(1)编写目标函数及其梯度M 文件 function [f,G]=objfungrad(x)f=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);t=exp(x(1))*(4*x(1)^2+2*x(2)^2+4*x(1)*x(2)+2*x(2)+1);G=[t+exp(x(1))*(8*x(1)+4*x(2)),exp(x(1))*(4*x(1)+4*x(2)+2)];end(2)编写约束函数及其梯度M文件function [c,ceq,dc,dceq]=confungrad(x)c=[+x(1)*x(2)-x(1)-x(2);-x(1)*x(2)-10];ceq=[];dc=[x(2)-1,-x(2);x(1)-1,-x(1)];dceq=[];end(3)编写优化命令>> clear>> x0=[-1,1];>> options=[];[x,fval,exitflag,output]=fmincon('objfungrad',x0,[],[],[],[],[],[],'confungrad',options)。