matlab最小化函数中的求解函数fminunc(线性以及非线性))

文章目录

        • 1.无约束(无条件)的最优化
          • fminunc函数
            • 实例表述
            • 关于exitflag matlab帮助文档说明
        • 2.有约束条件的最优化
          • fminunc函数
            • 实例表述

1.无约束(无条件)的最优化

fminunc函数

: - 可用于任意函数求最小值
- 统一求最小值问题
- 如求最大值问题:
>对函数取相反数而变成求最小值问题,最后把函数值取反即为函数的最大值。

  • 使用格式如下
    1.必须预先把函数存入到一个程序中,(所编的程序一定是只有一个参数, 则当为多元函数时,则x(1),x(2),x(3)… 分别代表每个自变量);
    2.fval 为函数的最小值,x0 为自变量初始向量,一般不影响结果(如有 n 个变量(即 n 元函数),则 x0 中就有 n 个元素);
    3.exitflag 为退出标志,当它大于 0 时表示函数收敛于 x,当它等于 0 时表示迭代次数超过,当它小于 0 时表示函数不收敛(所以解完题后还必须判断 exitflag 的值是否>0,以决定结果的正误/有效性)

x=fminunc(‘程序名’, x0)
[x,fval]=fminunc()
[x,fval,exitflag]=fminunc()
函数可以用内联函数 inline(‘表达式’)

实例表述
  • 例1:y= x^2+4x+5 的最小值

    %定义函数
    function f=fu(x)
    f=x^2+4*x+5; %最好不要.*	.^	./因为不是向量(一批数)的运算,初始 x0 就是变量的个数
    %函数调用(4种方式)
    [x,fval,exitflag]=fminunc(@fu,1)
    [x,fval,exitflag]=fminunc(inline('x^2+4*x+5'),2)
    [x,fval,exitflag]=fminunc(@(x)x^2+4*x+5,1)
    [x,fval,exitflag]=fminunc('x^2+4*x+5',2)
    %结果输出:
    % x =-2.0000
    % fval =1.0000
    % exitflag = 1
    
  • 例2:y= 2x-x^4+1的最大值

    %函数定义
    function f=fu(x)
    f=2*x-x^4+1;
    %函数调用
    [x,fval,exitflag]=fminunc(@fu,1)
    [x,fval,exitflag]=fminunc(inline('2*x-x^4+1'),2)
    [x,fval,exitflag]=fminunc(@(x)2*x-x^4+1,1)  %初始值x0=1,不影响结果输出
    [x,fval,exitflag]=fminunc('2*x-x^4+1',2)  %初始值x0=2
     %结果输出:
     x = 597872
     fval =  -1.2777e+23
     exitflag =-3
    
    关于exitflag matlab帮助文档说明

    1
    Magnitude of gradient is smaller than the OptimalityTolerance tolerance.
    2
    Change in x was smaller than the StepTolerance tolerance.
    3
    Change in the objective function value was less than the FunctionTolerance tolerance.
    5
    Predicted decrease in the objective function was less than the FunctionTolerance tolerance.
    0
    Number of iterations exceeded MaxIterations or number of function evaluations exceeded MaxFunctionEvaluations.
    -1
    Algorithm was terminated by the output function.
    -3
    Objective function at current iteration went below ObjectiveLimit.

  • 例3: f ( x , y ) = e 2 x ( x + y 2 + 2 y ) f(x, y)=e^{2 x}\left(x+y^{2}+2 y\right) f(x,y)=e2x(x+y2+2y)的最小值

    %函数定义
    function f=fu(a)  %要求参数只能是一个,可以采用矩阵形式传递
    x=a(1);y=a(2);
    f=exp(2*x)*(x+y^2+2*y);
    %函数调用
    [x,fval,exitflag]=fminunc('fu',[2,1])
    %函数结果
    x =0.5000   -1.0000
    fval = -1.3591
    exitflag =1
    
  • fminbnd(‘程序名’,x1,xn) 求函数在区间[x1,xn]的最小值

2.有约束条件的最优化

fminunc函数
(条件顺序:(线性)不等式—(线性)等式—上下限—非线性条件)
  • 左边可为:

    x=
    [x,fval]=
    [x,fval,exitflag]=

  • 右边可为
    (1) fmincon(‘程序名’,x0,A,b)
    用于线性不等式约束, 即 Ax< =b,A 为系数矩阵,b 为常数项列向量,x0 为初始向量*
    (2) fmincon(‘程序名’,x0,A,b,Aeq,beq)
    用于线性不等式与线性等式约束,线性等式为 Aeq*x=beq, 其中 Aeq 为系数矩阵,为 beq 列向量
    (3) fmincon(‘程序名’,x0, A,b,Aeq,beq, l,u)
    其中 l、u 为解的上下限(即解的范围 l<=x<=u)
    (如为多元函数:则 l=[x0,y0,z0,….], u=[xn,yn,zn,…])
    (4)fmincon(‘程序名’,x0, A,b,Aeq,beq, l,u, ‘程序 2’)
    其中 ‘程序 2’ 是用于非线性约束,它的格式为:c(x)<=0 ceq(x)=0
    程序形式为:

    function [c,ceq]=fu(x)
     c=……;ceq=……;
    
  • 注意
    1 如果不使用,必须使用空向量[ ]
    2. 完题后还必须判断 exitflag 的值是否>0,以决定结果的正误—所以最好返回三个结果,看一下 exitflag, 如无效则换一个初始向量 x0

    实例表述
  • 例1: min ⁡ ⋅ f ( x , y , z ) = x 2 / 2 + x y + x z + y 2 + 3 y z + z 3 − 6 x − 7 y − 8 z  s.  t ⋅ x + y + 3 z < = 5 x + 2 y + z < = 6 3 x + y + 2 z < = 13 \begin{aligned} &\min \cdot f(x, y, z)=x^{2} / 2+x y+x z+y^{2}+3 y z+z^{3}-6 x-7 y-8 z\\ &\text { s. } t \cdot x+y+3 z<=5\\ &\begin{array}{l} x+2 y+z<=6 \\ 3 x+y+2 z<=13 \end{array} \end{aligned} minf(x,y,z)=x2/2+xy+xz+y2+3yz+z36x7y8z s. tx+y+3z<=5x+2y+z<=63x+y+2z<=13

    %函数定义
    function f=fu(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;
     %调用函数
    format long g
    x0=[1,1,1]  %赋初值
    A=[1 1 3;1 2 1;3 1 2]   %函数对应的A
    b=[5;6;13]   %函数对应的b
    [x,fval,exitflag]=fmincon(@fu,x0,A,b)  %方法一
    [x,fval,exitflag]=fmincon('fu',[1,1,1],[1,1,3;1,2,1;3,1,2],[5;6;13])   %方法二
    
  • 例2: min ⁡ z = sqrt ⁡ ( ( x − 12 ) 2 + ( y − 12 ) 2 )  s.t.  x + y < = 20 y < = 14 3 y − x > = 0 \begin{aligned} &\min \mathbf{z}=\operatorname{sqrt}\left((\mathbf{x}-12)^{2}+(\mathbf{y}-12)^{2}\right)\\ &\text { s.t. } \quad \mathbf{x}+\mathbf{y}<=\mathbf{2 0}\\ &\begin{array}{c} \mathbf{y}<=\mathbf{1 4} \\ 3 \mathbf{y}-\mathbf{x}>=\mathbf{0} \end{array} \end{aligned} minz=sqrt((x12)2+(y12)2) s.t. x+y<=20y<=143yx>=0
    注意:3y-x>=0,需要写成:-3y+x<=0

    %函数定义
    function f=fu(a) 
    x=a(1);y=a(2);
    f=sqrt((x-12)^2+(y-12)^2);
    %函数调用
    format short g
    x0=[1,1]
    A=[1 1;0 1;-3 1]
    b=[20;14;0]
    [x,fval,exitflag]=fmincon(@fu,x0,A,b)
    %结果如下:
    x = 10  10
    fval = 2.8284
    exitflag =1
    
  • 例3 min ⁡ f ( x ) = x 2 + y 2 − x y − 10 x − 4 y + 60  s.t.  x + y = 8 − 5 < x < 10 ; 0 < y < 5 ; \begin{array}{l} \min \mathrm{f}(x)=x^{2}+y^{2}-x y-10 x-4 y+60 \\ \text { s.t. } x+y=8 \\ \qquad-5minf(x)=x2+y2xy10x4y+60 s.t. x+y=85<x<10;0<y<5;

    %函数定义
     function f=fu(a) 
     x=a(1);y=a(2);
     f=x^2+y^2-x*y-10*x-4*y+60;
    %函数调用
    format short g
    x0=[1,1];
    A=[];
    b=[];  %没有参数,函数里面也需要写上[]或者先定义一个空矩阵
    Aeq=[1 1];
    beq=8;
    I=[-5,0];
    u=[10,5];
    [x,fval,exitflag]=fmincon(@fu,x0,A,b,Aeq,beq,I,u)
    %结果如下:
    x =5  3
    fval = 17
    exitflag = 1
    
  • 例4:具有非线性条件求解
    min ⁡ f ( x ) = x 2 + y 2 − x y − 10 x − 4 y + 60  s.t.  x + y = 8 x ∧ 2 + y ∧ 2 = 34 exp ⁡ ( y ) < = 64 \begin{array}{l} \min f(x)=x 2+y 2-x y-10 x-4 y+60 \\ \text { s.t. } \quad x+y=8 \\ \quad \begin{array}{l} x^{\wedge} 2+y^{\wedge} 2=34 \\ \quad \exp (y)<=64 \end{array} \end{array} minf(x)=x2+y2xy10x4y+60 s.t. x+y=8x2+y2=34exp(y)<=64

    %定义函数(2个)
     function f=fu(a) 
     x=a(1);y=a(2);
     f=x^2+y^2-x*y-10*x-4*y+60;
     
     function [c,d]=fuu(a)  %c:放不等式约束条件  d:放等式的约束条件
     x=a(1);y=a(2); 
     c=exp(y)-64;
     d=x^2+y^2-34;
    
     %函数调用
     format short g
     x0=[1,1];
     A=[];
     b=[];
     Aeq=[1 1];
     beq=8;
     I=[-5,0];
     u=[10,5];
     [x,fval,exitflag]=fmincon(@fu,x0,A,b,Aeq,beq,I,u,'fuu') %条件顺序:(线性)不等式---(线性)等式---上下限---非线性条件
    
     %输出结果:
     x =5  3
     fval =17
     exitflag = 1
    
  • 例5:具有多个线性条件求解

    %定义函数(2个)
    方法一(定义非线性约束条件)
     function  [c,d,c2,d1,d2]=fuu(a)  %先不等式后等式
      x=a(1);y=a(2); 
      c=exp(y)-64;
      d=sin(x)+exp(y)-70; 
      c2=-x*y+14;
      d1=x^2+y^2-34;
      d2=x+y^2-14;
     方法二(定义非线性约束条件)
     function [c,ceq]=fuu(a)
      x=a(1);y=a(2); 
      c(1)=exp(y)-64;
      c(2)=sin(x)+exp(y)-70; 
      c(3)=-x*y+14;
      ceq(1)=x^2+y^2-34;
      ceq(2)=x+y^2-14;
    
     function f=fu(a) 
     x=a(1);y=a(2);
     f=x^2+y^2-x*y-10*x-4*y+60;
     
    %函数调用
    format short g
    x0=[1,1];
    A=[];
    b=[];
    Aeq=[1 1];
    beq=8;
    I=[-5,0];
    u=[10,5];
    [x,fval,exitflag]=fmincon(@fu,x0,A,b,Aeq,beq,I,u,'fuu')
    x = 5   3
    fval =17
    exitflag =2
    
    

你可能感兴趣的:(MATLAB数据分析)