您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > matlab最小值优化问题中fminunc、fmincon的应用
工程最优化即最大(小)值问题1、无约束(无条件)的最优化(1)使用fminunc函数(un-condition)(2)可用于任意函数求最小值(3)将最大、最小问题统一为求最小值问题(即只能求最小值)。如求最大值,则要对函数取相反数而变成求最小值问题,最后再把函数值取反即为函数的最大值。(求最大值需两次取反(一前一后))(前后都是函数y两次取反,而自变量X不要取反)(4)使用格式x=fminunc(‘程序名’,x0)左边的结果还可以写成[x,fval]或[x,fval,exitflag]或必须预先把函数存入到一个程序中,(所编的程序一定是只有一个参数,则当为多元函数时,则x(1),x(2),x(3)…分别代表每个自变量)其中fval为函数的最小值,x0为自变量初始向量,一般不影响结果(如有n个变量(即n元函数),则x0中就有n个元素)exitflag为退出标志,当它大于0时表示函数收敛于x,当它等于0时表示迭代次数超过,当它小于0时表示函数不收敛(所以解完题后还必须判断exitflag的值是否0,以决定结果的正误/有效性)最好返回三个结果函数存在最值的条件:在闭区间连续,存在导数等(说明有很多函数不存在最值:有大、有小、有大小、都无)可以是任意函数、任意n元函数求最小值最后一定要看看exitflag........的值(判断结果是否有效)---所以结果最好返回三个结果函数可以用内联函数inline(‘表达式’)(程序中的.*./.^可要可不要,一般还是不要吧)(5)y=x2+4x+5的最小值(结果-2,1)其函数形式为:---可以@,内联函数inline(‘x2+4x+5’),functionf=a1(x)f=x^2+4*x+5;------最好不要.*.^./因为不是向量(一批数)的运算,初始x0就是变量的个数(调用该程序时,所提供的每个变量的初始值)函数名:’zhc1’或@zhc1或inline(‘…’)[x,f,g]=fminunc(inline('x^2+4*x+5'),1)还有学生f=y=x^2+4*x+5;??????edit[x,fval,exitflag]=fminunc('max1',1)Warning:Gradientmustbeprovidedfortrust-regionmethod;usingline-searchmethodinstead.Infminuncat241Optimizationterminated:relativeinfinity-normofgradientlessthanoptions.TolFun.x=-2.0000fval=1.0000exitflag=1[a,b,c]=fminunc('max1',1)Warning:Gradientmustbeprovidedfortrust-regionmethod;usingline-searchmethodinstead.Infminuncat241Optimizationterminated:relativeinfinity-normofgradientlessthanoptions.TolFun.a=-2.0000b=1.0000c=1[x,fval,exitflag]=fminunc('max1',0)[x,fval,exitflag]=fminunc('max1',5)[x,fval,exitflag]=fminunc(@max1,5)[x,fval,exitflag]=fminunc(inline('x^2+4*x+5'),1)[x,fval,exitflag]=fminunc(@(x)x^2+4*x+5,1)a=@(x)x^2+4*x+5;[x,fval,exitflag]=fminunc(a,1)(6)例如:求y=1+2x-x2的最大值(结果为:x=1,y=-(-2))---X不要取反,两次都是函数取反其函数形式为:functionf=a1(x)命令形式[x,y,z]=fminunc('a1',3)f=-(1+2*x-x^2)或负号展开—最后再取反------需两次取反a1(1)ans=-2a1(0)ans=-1(7)求函数f(x,y)=e2x(x+y2+2y)的最小值其函数形式为:functionf=a1(r)--fmin所要求的程序一定是一个参数x=r(1);y=r(2);f=exp(2*x)*(x+y^2+2*y);----有学生写成f(x,y)=……或functionf=a2(a)x=a(1);y=a(2);f=或f中直接用x(1),x(2)命令为:[x,fval,exitflag]=fminunc('a1',[2,1])—即a1调用时的参数x=0.5000-1.0000---即当x=0.5y=-1时取最小值fval=-1.3591(即-e/2)exitflag=1此题的x0也可为[1,1],[0,1],[1,0],[0,0],但不能用[1,2],如出问题,可尝试换一个初值----x0建议最好用[1,1,1]此题说明可对任意函数、任意n元求最小值(此题为二元,含exp函数)程序一定是只含一个形参,如是n元,则x视作一个向量,它的每个元素分别代表某一个自变量(可以a=x(1);b=x(2);…..)结果x也是一个向量,每个元素分别代表每个自变量此题不存在最大值。(可求一下,结果为x=1.0e+012*2.29230.2986fval=-Infexitflag=0)-----结果无效----说明最值不一定存在如为n元函数,则初始向量也必须为n个元素的向量如求最大值需前后两次取反=一定要变成=(都是小.)无条件的命令在实际问题中用的很少,一般还是使用下一条命令2、fminbnd(‘程序名’,x1,xn)求函数在区间[x1,xn]的最小值3、有约束条件的最优化问题使用fmincon函数(condition)这是优化(最值)的万能命令(1)左边(结果)可为:x=[x,fval]=[x,fval,exitflag]=(2)右边可为:fmincon(‘程序名’,x0,A,b)用于线性不等式约束,即A*x=b,A为系数矩阵,b为常数项列向量,x0为初始向量(一定要变成=)(都是小:求最小值,条件=)fmincon(‘程序名’,x0,A,b,Aeq,beq)用于线性不等式与线性等式约束,线性等式为Aeq*x=beq,其中Aeq为系数矩阵,为beq列向量A,b,Aeq,beq的形式类似于解线性方程组的形式fmincon(‘程序名’,x0,A,b,Aeq,beq,l,u)其中l、u为解的上下限(即解的范围l=x=u)(如为多元函数:则l=[x0,y0,z0,….],u=[xn,yn,zn,…])(条件顺序:(线性)不等式---(线性)等式---上下限---非线性条件)fmincon(‘程序名’,x0,A,b,Aeq,beq,l,u,‘程序2’)其中‘程序2’是用于非线性约束,它的格式为:c(x)=0ceq(x)=0程序形式为:function[c,ceq]=fxx(x)c=……;ceq=……;如有多个非线性条件---见下面的例3---方法1:可以返回2/4/6/8…个结果,结果分别为不1、等1、不2、等2、不3、等3……,没有的则用[]或0方法2:把c,ceq视作数组,即c=[不1,不2,不3,…];ceq=[等1,等2,等3,……]或c(1)=不1;c(2)=不2;……;ceq(1)=等1;……,建议最好使用最后一种形式,即c(1),c(2),c(3)…ceq(1),ceq(2),ceq(3)…(3)注意:前面的各向量(矩阵)如不使用,必须使用空的向量(后面的如不使用,则可以不管)(即每个参数的意义是由它们的位置来决定的,不是由变量决定的,变量名可以任意。)任意函数、任意n元函数都可用fmincon---万能的函数的形式:functionf=zha(r)一定是只有一个形参x=r(1);y=r(2);z=r(3);……f=函数表达式;都是求最小值,(如求最大值:则前后两次取反)不等式条件都.要变成成=-----都是小解完题后还必须判断exitflag的值是否0,以决定结果的正误---所以最好返回三个结果看一下exitflag,如无效则换一个初始向量x0先做好各种准备(目标函数表达式---编程序;线性条件(不等式、等式);非线性条件---编另一个程序)最后再执行命令fmincon条件分为:线性不等式、线性等式、上下限(范围)、非线性条件(不等式、等式)--程序返回两个结果一般是不等式居多(再多都不要紧),一般不会有太多的等式条件(否则都可以解方程了)(4)如1:f(x,y,z)=x2/2+xy+xz+y2+3yz+z3-6x-7y-8z求其最小值受约束于:x+y+3z=5x+2y+z=63x+y+2z=13答案为:(4,1,0,-18)(再添加2x+3y+4z=11;3x+5z=12;--------再添加上/下限:x—[1,10],y----[0,5],z---[-5,5])函数形式为:functionf=zhabc(x)a=x(1);b=x(2);c=x(3);%也可直接用(1),x(2),x(3)f=a^2/2+a*b+a*c+b^2+3*b*c+c^3-6*a-7*b-8*c;命令形式为:》a=[1,1,3;1,2,1;3,1,2];b=[5;6;13];[x,fval,exitflag]=fmincon('zhabc',[1,1,1],a,b)也可先x0x=4.00001.0000-0.0000fval=-18exitflag=1警告信息没有关系虽然程序中可以直接用x(1),x(2),x(3)…,但更麻烦。所以最好这样:functionf=zha(t)(用任意变量名都可以,但用其他字母代替x更好,因为函数表达式可以直接拷贝过来,省得去对应)x=t(1);y=t(2);z=t(3);……f=…….;[x,fval,exitflag]=fmincon('minzh1',[1,1,1],[1,1,3;1,2,1;3,1,2],[5;6;13])Warning:Large-scale(trustregion)methoddoesnotcurrentlysolvethistypeofproblem,switchingtomedium-scale(linesearch).x=4.00001.0000-0.0000fval=-18.0000exitflag=1如2:z=sqrt((x-12)2+(y-12)2)求其最小值受约束于:x+y=20y=143y-x=0(需转换)答案为:10,10;2.8284(再增加范围3=x=8,5=y=14)(l=[3,5]u=[8,14])---结果是一样的)a=[1,1;0,1;-1,3];a=[1,1;0,1;1,-3];b=[20;14;0];[x,fval,exitflag]=fmincon('minzh2',[1,2],a,b)x=10.00019.9999fval=2.8284exitflag=5函数形式为:functionf=zhabc(x)a=x(1);b=x(2);f=sqrt((a-12)^2+(b-12)^2);命令为:a=[1,1;0,1;1,-3];b=[20;14;0];[x,fval,exitflag]=fmincon('zhabc',[8,8],a,b,[],[],[5,5],[20,20])x=10.000010.0000fval=2.8284exitflag=[8,8][5,5][20,20]也可预先定义5[8,8]一定要在上下限的范围内[x,fval,exitflag]=fmincon(@minzh2,[1,1],a,b,[],[],[5,8],[10,15])如3:f(x)=x2+y2-xy-10x-4y+60求其最小值约束
本文标题:matlab最小值优化问题中fminunc、fmincon的应用
链接地址:https://www.777doc.com/doc-3975042 .html