Matlab fmincon[通俗易懂]

Matlab fmincon[通俗易懂]fmincon的官方文档fmincon非线性优化

大家好,又见面了,我是你们的朋友全栈君。

参考:fmincon的官方文档

Syntax

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 = fmincon(problem)
[x,fval] = fmincon(___)
[x,fval,exitflag,output] = fmincon(___)
[x,fval,exitflag,output,lambda,grad,hessian] = fmincon(___)

Description

求解带约束的非线性优化问题。
求解 f ( x ) f(x) f(x) 满足约束的最小值,表达式如下:
min ⁡ x f ( x ) 满 足 { c ( x ) ≤ 0 c e q ( x ) = 0 A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b \min_{x} f(x) \quad 满足 \quad \left\{ \begin{array}{lr} c(x) \leq 0 & \\ ceq(x) = 0 & \\ A \cdot x \leq b & \\ Aeq \cdot x = beq & \\ lb \leq x \leq ub \end{array} \right. xminf(x)c(x)0ceq(x)=0AxbAeqx=beqlbxub
c ( x ) ≤ 0 c(x) \leq 0 c(x)0 是非线性不等式约束; c e q ( x ) = 0 ceq(x) = 0 ceq(x)=0 是非线性等式约束; A ⋅ x ≤ b A \cdot x \leq b Axb是线性不等式约束; A e q ⋅ x = b e q Aeq \cdot x = beq Aeqx=beq是线性等式约束; l b ≤ x ≤ u b lb \leq x \leq ub lbxub x x x的上下界约束。
⋅ \cdot “是点乘, b b b b e q beq beq 是向量, A A A A e q Aeq Aeq 是矩阵, c ( x ) c(x) c(x) c e q ( x ) ceq(x) ceq(x) 是返回一个向量,而 f ( x ) f(x) f(x) 是返回一个标量。 f ( x ) f(x) f(x) c ( x ) c(x) c(x) c e q ( x ) ceq(x) ceq(x) 可以是非线性函数。xlbub 可以是向量或矩阵;参见:Matrix Arguments


x = f m i n c o n ( f u n , x 0 , A , b ) x = fmincon(fun,x0,A,b) x=fmincon(fun,x0,A,b) x 0 x0 x0 开始,寻找一个 x x x , 满足 f ( x ) f(x) f(x) 最小且满足约束 A ⋅ x ≤ b A \cdot x ≤ b Axb x 0 x0 x0 可以是标量,向量或矩阵。

传递额外参数说明了如何将额外参数传递给目标函数和非线性约束函数。


x = f m i n c o n ( f u n , x 0 , A , b , A e q , b e q ) x = fmincon(fun,x0,A,b,Aeq,beq) x=fmincon(fun,x0,A,b,Aeq,beq) x 0 x0 x0 开始,寻找一个 x x x ,满足 f u n fun fun 最小且满足 A e q ⋅ x = b e q Aeq \cdot x = beq Aeqx=beq A ⋅ x ≤ b A \cdot x ≤ b Axb. 如果没有不等式约束, 置 A = [ ] A = [] A=[] b = [ ] b = [] b=[].


x = f m i n c o n ( f u n , x 0 , A , b , A e q , b e q , l b , u b ) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub) x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub) x 0 x0 x0 开始,寻找一个 x x x ,满足 f u n fun fun 最小且满足 A e q ⋅ x = b e q Aeq \cdot x = beq Aeqx=beq A ⋅ x ≤ b A \cdot x ≤ b Axb l b ≤ x ≤ u b lb ≤ x ≤ ub lbxub. 如果不存在等式约束, 设置 A e q = [ ] Aeq = [] Aeq=[] b e q = [ ] beq = [] beq=[]. 如果 x ( i ) x(i) x(i) 没有下界, 设置 l b ( i ) = − I n f lb(i) = -Inf lb(i)=Inf, 如果 x ( i ) x(i) x(i) 没有上界, 置 u b ( i ) = I n f ub(i) = Inf ub(i)=Inf.

如果问题的输入范围( l b lb lb u b ub ub )不一致(原文是inconsistent),则 f m i n c o n fmincon fmincon会抛出错误。 在这种情况下,输出 x x x x 0 x0 x0 f v a l fval fval [ ] [] []
对于默认的“interior-point”算法, f m i n c o n fmincon fmincon x x x 中超出边界( l b ≤ x ≤ u b lb ≤ x ≤ ub lbxub)的分量设置为边界值。 对于“trust-region-reflective”算法, f m i n c o n fmincon fmincon x x x 中超出边界的分量设置到边界内部。 对于其他算法, f m i n c o n fmincon fmincon x x x 中超出边界的分量设置为最小的边界值。 x x x 中满足边界调节的分量不会更改。 请参阅迭代可以违反约束


x = f m i n c o n ( f u n , x 0 , A , b , A e q , b e q , l b , u b , n o n l c o n ) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon) x 0 x0 x0 开始, 寻找一个 x x x , 满足线性约束 A e q ⋅ x = b e q Aeq \cdot x = beq Aeqx=beq A ⋅ x ≤ b A \cdot x ≤ b Axb l b ≤ x ≤ u b lb ≤ x ≤ ub lbxub 以及非线性约束 c ( x ) ≤ 0 c(x) ≤ 0 c(x)0 c e q ( x ) = 0 ceq(x) = 0 ceq(x)=0 c ( x ) c(x) c(x) c e q ( x ) ceq(x) ceq(x) 定义在 n o n l c o n nonlcon nonlcon(一个函数) 中. 如果不存在下界, 置 l b = [ ] lb = [] lb=[] ;如果不存在下界,置 u b = [ ] ub = [] ub=[].


x = f m i n c o n ( f u n , x 0 , A , b , A e q , b e q , l b , u b , n o n l c o n , o p t i o n s ) x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options) x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)使用指定的选项 o p t i o n s options options来优化问题. 使用 optimoptions来设置这些选项. 如果没有非线性约束,置 n o n l c o n = [ ] nonlcon = [] nonlcon=[].


x = f m i n c o n ( p r o b l e m ) x = fmincon(problem) x=fmincon(problem) 寻找 p r o b l e m problem problem 的最小值, p r o b l e m problem problem 是一种Input Arguments中描述的结构(structure). 可以通过从Optimization app导出一个 p r o b l e m problem problem , 参见Exporting Your Work.


[ x , f v a l ] = f m i n c o n ( _ _ _ ) [x,fval] = fmincon(\_\_\_) [x,fval]=fmincon(___) , 对于任何调用形式,返回解 x x x和在解 x x x处目标函数 f u n fun fun的值。


[ x , f v a l , e x i t f l a g , o u t p u t ] = f m i n c o n ( _ _ _ ) [x,fval,exitflag,output] = fmincon(\_\_\_) [x,fval,exitflag,output]=fmincon(___) e x i t f l a g exitflag exitflag表示 f m i n c o n fmincon fmincon退出的条件(退出的原因);output是一个结构(structure),描述了一些优化过程的信息。


[ x , f v a l , e x i t f l a g , o u t p u t , l a m b d a , g r a d , h e s s i a n ] = f m i n c o n ( _ _ _ ) [x,fval,exitflag,output,lambda,grad,hessian] = fmincon(\_\_\_) [x,fval,exitflag,output,lambda,grad,hessian]=fmincon(___) 额外返回:

l a m b d a lambda lambda — Structure with fields containing the Lagrange multipliers at the solution x.

g r a d grad grad f u n fun fun 在解 x x x处的梯度.

hessian — f u n fun fun 在解 x x x 处的Hessian矩阵. 参见 fmincon Hessian.

Examples

Linear Inequality Constraint

求Rosenbrock函数:
f ( x ) = 100 ( x 2 2 − x 1 2 ) 2 + ( 1 − x 1 ) 2 (1) f(x) = 100(x_2^2 – x_1^2 )^2 + (1 – x_1)^2 \tag{1} f(x)=100(x22x12)2+(1x1)2(1)
满足约束:
x 1 + 2 x 2 ≤ 1 (2) x_1+ 2x_2 \leq 1 \tag{2} x1+2x21(2)
取得最小值时的 x x x。Rosenbrock在无约束的情况下,最优解是 x 1 = 1 , x 2 = 1 x_1=1, x_2=1 x1=1,x2=1;但有约束2时, 1 + 2 ∗ 1 = 3 > 1 1 + 2*1 = 3 > 1 1+21=3>1,所以(1, 1)不是有约束2的情况下最优解。

求解步骤如下:

  • 目标函数
    编写一个目标函数 fun (就是 f ( x ) f(x) f(x),可以像下面一样写成一个匿名函数,也可以单独新建一个函数文件fun.m,在fun.m里编写目标函数的代码,并返回一个值):

    fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
    
  • 约束
    约束2是一个线性不等式,需要表达成 A ⋅ x ≤ b A \cdot x \leq b Axb 的形式。对于约束2, A = [ 1 , 2 ] , b = 1 A=[1, 2], b=1 A=[1,2],b=1。对于 x 0 x_0 x0的初值,这里取 x 0 = [ − 1 , 2 ] x_0 = [-1, 2] x0=[1,2];给 x 0 x_0 x0取初值时,如果知道 x x x的解所在范围,可以去一个附近的值,如果不知道,随机取非零值就行。

  • 完整代码(复制到Matlab中,即可运行)

    	fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
    	x0 = [-1,2];
    	A = [1,2];
    	b = 1;
    	x = fmincon(fun,x0,A,b)
    

    运行结果如下:

    Local minimum found that satisfies the constraints.
    
    Optimization completed because the objective function is non-decreasing in 
    feasible directions, to within the default value of the optimality tolerance,
    and constraints are satisfied to within the default value of the constraint tolerance.
    
    <stopping criteria details>
    
    
    x =
    
        0.5022    0.2489
    

    两段英文是调用 fmincon 的结束原因(非常重要!一定要仔细看,有时候优化次数不够,就会在英文中体现出来)。x 之后的就是优化的结果, x 1 = 0.5022 , x 2 = 0.2489 x_1 = 0.5022, x_2 = 0.2489 x1=0.5022,x2=0.2489

Linear Inequality and Equality Constraint

求Rosenbrock函数:
f ( x ) = 100 ( x 2 2 − x 1 2 ) 2 + ( 1 − x 1 ) 2 (3) f(x) = 100(x_2^2 – x_1^2 )^2 + (1 – x_1)^2 \tag{3} f(x)=100(x22x12)2+(1x1)2(3)
满足约束:
{ x 1 + 2 x 2 ≤ 1 2 x 1 + x 2 = 1 (4) \left\{ \begin{array}{lr} x_1+ 2x_2 \leq 1 & \\ 2x_1 + x_2 = 1 \end{array} \right.\tag{4} {
x1+2x212x1+x2=1
(4)

取得最小值时的 x x x

  • 目标函数
    目标函数和上面的一致:

    fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
    
  • 约束

    • x 1 + 2 x 2 ≤ 1 x_1+ 2x_2 \leq 1 x1+2x21是线性不等式约束,需要改写成 A ⋅ x ≤ b A \cdot x \leq b Axb的形式,故 A = [ 1 , 2 ] , b = 1 A=[1, 2], b=1 A=[1,2],b=1
    • 2 x 1 + x 2 = 1 2x_1 + x_2 = 1 2x1+x2=1是线性等式约束,需要改写成 A e q ⋅ x = b e q Aeq \cdot x = beq Aeqx=beq的形式,故 A e q = [ 2 , 1 ] , b e q = 1 Aeq=[2, 1], beq=1 Aeq=[2,1],beq=1
    • x 0 = [ 0.5 , 0 ] x_0=[0.5, 0] x0=[0.5,0]
  • 完整代码

    fun = @(x)100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
    x0 = [0.5,0];
    A = [1,2];
    b = 1;
    Aeq = [2,1];
    beq = 1;
    x = fmincon(fun,x0,A,b,Aeq,beq)
    

    运行结果:

    此处省略那两段英文
    
    x =
    
        0.4149    0.1701
    

Bound Constraints

求Rosenbrock函数:
f ( x ) = 100 ( x 2 2 − x 1 2 ) 2 + ( 1 − x 1 ) 2 (5) f(x) = 100(x_2^2 – x_1^2 )^2 + (1 – x_1)^2 \tag{5} f(x)=100(x22x12)2+(1x1)2(5)
满足约束:
{ 0 ≤ x 1 ≤ 1 0 ≤ x 2 ≤ 2 (6) \left\{ \begin{array}{lr} 0 \leq x_1 \leq 1 & \\ 0\leq x_2 \leq 2 \end{array} \right.\tag{6} {
0x110x22
(6)

取得最小值时的 x x x

  • 约束
    约束只有对 x 1 x_1 x1 x 2 x_2 x2的取值范围有约束,这叫边界约束。边界约束可以分别为每一个元素指定上界和下界。对于本例的边界约束,写成代码是:

    lb = [0,0]; % lb是下界
    ub = [1,2];	% ub是上界
    

    由于没有其他线性约束,故:

    A = [];
    b = [];
    Aeq = [];
    beq = [];
    
  • 完整代码
    x 0 = [ 0.5 , 1 ] x_0=[0.5 ,1] x0=[0.5,1]

    fun = @(x)1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));
    
    lb = [0,0];
    ub = [1,2];
    
    A = [];
    b = [];
    Aeq = [];
    beq = [];
    
    x0 = [0.5,1];
    x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub)
    

    运行结果:

    x =
    
    1.0000    2.0000
    

    另外,当初值 x 0 x_0 x0的取值不同时,得到的优化结果可能也不同。 参见: Obtain the Objective Function Value

  • 补充:如果 x x x 中某个元素的上界或者下界是无穷大?
    假如边界约束如下:
    { 1 ≤ x 1 x 2 ≤ 4 (7) \left\{ \begin{array}{lr} 1 \leq x_1 & \\ x_2 \leq 4 \end{array} \right. \tag{7} {
    1x1x24
    (7)

    改写成有上下界的形式就是:
    { 1 ≤ x 1 ≤ + ∞ − ∞ ≤ x 2 ≤ 4 (8) \left\{ \begin{array}{lr} 1 \leq x_1 \leq +\infty & \\ -\infty \leq x_2 \leq 4 \end{array} \right. \tag{8} {
    1x1+x24
    (8)

    那么有:

    lb = [1, -Inf];  % lb是下界
    ub = [Inf, 4];   % ub是上界
    

    如果没有上界,那么上界就是Inf;如果没有下界,下界就是-Inf。

Nonlinear Constraints

求Rosenbrock函数:
f ( x ) = 100 ( x 2 2 − x 1 2 ) 2 + ( 1 − x 1 ) 2 (9) f(x) = 100(x_2^2 – x_1^2 )^2 + (1 – x_1)^2 \tag{9} f(x)=100(x22x12)2+(1x1)2(9)
满足约束:
{ 0 ≤ x 1 ≤ 0.5 0 ≤ x 2 ≤ 0.8 ( x 1 − 1 3 ) 2 + ( x 2 − 1 3 ) 2 ≤ 1. 5 2 (10) \left\{ \begin{array}{lr} 0 \leq x_1 \leq 0.5 & \\ 0\leq x_2 \leq 0.8 & \\ (x_1 – \frac{1}{3})^2 + (x_2 – \frac{1}{3})^2 \leq 1.5^2 \end{array} \right. \tag{10} 0x10.50x20.8(x131)2+(x231)21.52(10)
取得最小值时的 x x x

  • 约束
    除了 x 1 x_1 x1 x 2 x_2 x2的边界有约束之外,还多了第三个非线性约束;含义是 x 1 x_1 x1 x 2 x_2 x2组成的点,在圆心为 ( 1 3 , 1 3 ) (\frac{1}{3}, \frac{1}{3}) (31,31) 半径为1.5的圆内。
    对于非线性约束,需要自己实现一个函数nonlcon,来计算 c ( x ) c(x) c(x) c e q ( x ) ceq(x) ceq(x)。对于约束 ( x 1 − 1 3 ) 2 + ( x 2 − 1 3 ) 2 ≤ 1. 5 2 (x_1 – \frac{1}{3})^2 + (x_2 – \frac{1}{3})^2 \leq 1.5^2 (x131)2+(x231)21.52,需要转换为 c ( x ) ≤ 0 c(x) \leq 0 c(x)0的形式,所以需要把 1. 5 2 1.5^2 1.52移动到表达式的左边,即: ( x 1 − 1 3 ) 2 + ( x 2 − 1 3 ) 2 − 1. 5 2 ≤ 0 (x_1 – \frac{1}{3})^2 + (x_2 – \frac{1}{3})^2 – 1.5^2 \leq 0 (x131)2+(x231)21.520,故 c ( x ) = ( x 1 − 1 3 ) 2 + ( x 2 − 1 3 ) 2 − 1. 5 2 c(x) = (x_1 – \frac{1}{3})^2 + (x_2 – \frac{1}{3})^2 – 1.5^2 c(x)=(x131)2+(x231)21.52

    新建一个函数nonlcon.m,输入以下代码:

    % nonlcon.m
    function [c,ceq] = nonlcon(x)
    c = (x(1)-1/3)^2 + (x(2)-1/3)^2 - (1.5)^2;
    ceq = [];
    

    c 就是 c ( x ) c(x) c(x)(非线性不等式约束)的值;ceq就是 c e q ( x ) ceq(x) ceq(x)(非线性等式约束)的值,因为本例中没有非线性等式约束,所以置为 [ ] [] []

  • 完整代码

    % example4.m
    fun = @(x)1+x(1)/(1+x(2)) - 3*x(1)*x(2) + x(2)*(1+x(1));
    lb = [0,0.2];
    ub = [0.5,0.8];
    A = [];
    b = [];
    Aeq = [];
    beq = [];
    x0 = [1/4,1/4];
    x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,@nonlcon)
    

    运行结果:

    x =
    
    0.0000    0.2000
    
  • 补充: 如果有多个非线性不等式约束或者多个非线性等式约束?
    假如函数的约束如下:
    { c 1 ( x ) ≤ 0 c 2 ( x ) ≤ 0 c e q 1 ( x ) = 0 c e q 2 ( x ) = 0 (11) \left \{ \begin{array}{lr} c_1(x) \leq 0 & \\ c_2(x) \leq 0 & \\ ceq_1(x) = 0 & \\ ceq_2(x) = 0 \end{array} \right. \tag{11} c1(x)0c2(x)0ceq1(x)=0ceq2(x)=0(11)
    那么,nonlcon.m的代码应是:

    % nonlcon.m
    function [c,ceq] = nonlcon(x)
    c1 = ...
    c2 = ...
    ceq1 = ...
    ceq2 = ...
    c = [c1; c2];
    ceq = [ceq1; ceq2];
    

    其中: c 1 = c 1 ( x ) , c 2 = c 2 ( x ) , c e q 1 = c e q 1 ( x ) , c e q 2 = c e q 2 ( x ) c1 = c_1(x), c2 = c_2(x), ceq1=ceq_1(x), ceq2=ceq_2(x) c1=c1(x),c2=c2(x),ceq1=ceq1(x),ceq2=ceq2(x)。就是说,有几个非线性不等式约束, c c c中就应该有几个元素, c e q ceq ceq同理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/130217.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • datagroup激活码[最新免费获取]

    (datagroup激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • LeetCode 700题 题解答案集合 Python

    LeetCode 700题 题解答案集合 Python2019.5.12更新至题号796,目前共有265题。2019.5.26更新至题号72,目前共有347题。2019.6.16更新至题号70,目前共有382题。2019.7.7更新至题号5120,目前共有442题。2019.8.5更新至题号1147,目前共有502题。2019.9.6更新至题号288,目前共有551题。2019.11.13更新至题号426,目前共有602题…

  • 试述Hadoop的HDFS及其组成_hadoop命令和hdfs命令区别

    试述Hadoop的HDFS及其组成_hadoop命令和hdfs命令区别hdfs命令,hadoop基本常用命令

  • spring任务调度scheduled_golang 任务调度

    spring任务调度scheduled_golang 任务调度1、任务调度接口TaskScheduler提供了多种方法来调度将来某个时间点要运行的任务。2、触发器Trigger实现PeriodicTrigger和CronTrigger。3、@Scheduled注解创建定时任务4、@Async注解异步方法执行,value属性指定任务执行器。5、task:scheduler、task:executor创建调度器和执行器…

    2022年10月11日
  • 02 、Solr7.3.1 在Win10平台下使用Tomcat9的部署及配置

    02 、Solr7.3.1 在Win10平台下使用Tomcat9的部署及配置

  • 重定向与转发的区别_响应重定向和请求转发的区别

    重定向与转发的区别_响应重定向和请求转发的区别重定向和转发的区别: 重定向和转发的区别就是请求服务器几次, 如果请求服务器地址没有变说明这是一次请求请求在自己的服务器里面流转这就是转发这是服务器行为。 如果请求服务器地址变了,说明这是请求了二次,第二次请求由客户端流浪器负责,在多台服务器之间流转这就是客户端行为。 重定向: 1、重定向的速度比较慢,需要跨越服务器 2、重定向是两次不同的请求 3、重定向是执行重定向之后的代码 4、地址栏的地址是会发生变化的 5、重定向不包含项目的根目录 6、重定向是会就是.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号