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} min⋅f(x,y,z)=x2/2+xy+xz+y2+3yz+z3−6x−7y−8z s. t⋅x+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((x−12)2+(y−12)2) s.t. x+y<=20y<=143y−x>=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-5<x<10 ; 0<y<5 ; \end{array} minf(x)=x2+y2−xy−10x−4y+60 s.t. x+y=8−5<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+y2−xy−10x−4y+60 s.t. x+y=8x∧2+y∧2=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
-