• 数学建模| 非线性规划(Matlab)


    非线性规划

    非线性规划:约束条件和目标函数存在非线性函数。简单点说,约束条件和目标函数中至少一个决策变量不是一次方,例如三角函数、对数、多次方等。

    线性规划和非线性在解决上的不同:线性规划可以有通用方法,但是非线性规划的求解是没有特定算的,只能用近似的算法,每种算法都有自己适用的范围。这些算法有很多,Matlab内部已经实现好了,有现成的函数,如果想了解内部具体的实现可以另寻查找,本文就只介绍如何调用Matlab中的函数达成求非线性规划。

    Matlab函数

    Matlab函数:

    [x,value]=fmincon(func,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
    
    • 1

    参数解释:

    • func 表示目标函数。
    • A 表示不等式约束条件系数矩阵,b 表示不等式约束条件常数矩阵。
    • Aeq 表示等式约束条件系数矩阵,beq 表示等式约束条件常数矩阵。
    • lb 表示决策变量的下限数组,ub表示决策变量的上限数组。
    • x 表示目标函数 func 取得最小值时的决策变量取值数组。
    • value 表示目标函数 func 取得的最小值。
    • x0表示初始值。
    • nonlcon 非线性约束,包括不等式和等式。
    • options是优化参数。

    Matlab中线性规划的标准形式:C(x)和Ceq(x)是非线性约束的不等式和等式。

    min ⁡ f ( x ) \min f(x) minf(x)
    s . t . { A x ⩽ b A e q ⋅ x = b e q l b ⩽ x ⩽ u b C ( x ) ⩽ 0 C e q ( x ) = 0 s.t. {AxbAeqx=beqlbxubC(x)0Ceq(x)=0 s.t. AxbAeqx=beqlbxubC(x)0Ceq(x)=0

    使用注意:

    • 对于不存在的约束用空矩阵[]。
    • 使用前需要把目标函数和约束对象化成Matlab标准形式。
    • func和nonlcon需要用M文件定义,因为非线性涉及多少次幂,线性规划中只需要给系数矩阵即可。
    • x0初始值按决策变量维度取实数即可,对求解速度会有影响,例如一下子就选中最小值的点为初始值。
    • options可以不填。
    • A、b、Aeq、beq依旧是修饰线性约束的。

    Matlab使用例子

    步骤:按照数模题目进行建模,得到目标函数和约束条件,然后把目标函数和约束条件化为标准形式,再化成matlab里面矩阵形式,最后填入代码中。

    目标函数+约束条件:
    m a x z = − x 1 2 − x 2 2 − x 3 2 + 6 max\quad z=-{x_1}^2-{x_2}^2-{x_3}^2+6 maxz=x12x22x32+6
    s . t . { x 1 2 − x 2 = 0 x 1 − x 2 2 + x 3 3 ≥ 2 x 1 + x 2 2 − 2 x 3 ≤ 5 x 1 , x 2 , x 3 ≥ 0 s.t. {x12x2=0x1x22+x332x1+x222x35x1,x2,x30 s.t. x12x2=0x1x22+x332x1+x222x35x1,x2,x30

    Matlab标准格式化:
    m i n f ( x ) = x 1 2 + x 2 2 + x 3 2 − 6 min\quad f(x)={x_1}^2+{x_2}^2+{x_3}^2-6 minf(x)=x12+x22+x326
    s . t . { x 1 2 − x 2 + 0 ∗ x 3 = 0 − x 1 + x 2 2 − x 3 3 + 2 ≤ 0 x 1 + x 2 2 − 2 x 3 − 5 ≤ 0 x 1 , x 2 , x 3 ≥ 0 s.t. {x12x2+0x3=0x1+x22x33+20x1+x222x350x1,x2,x30 s.t. x12x2+0x3=0x1+x22x33+20x1+x222x350x1,x2,x30

    func.m

    function f=func(x)
    func=sum(x.^2)-6;
    
    • 1
    • 2

    nonlcon.m

    function [C,Ceq]=nonlcon(x)
    C=[-x(1)+x(2)^2-x(3)^2+2;
    x(1)+x(2)^2-2*x(3)-5]
    Ceq=[x(1)^2-x(2)]
    
    • 1
    • 2
    • 3
    • 4

    主文件代码

    [x,value]=fmincon('func',[2,1,0],[],[],[],[],[0,0,0],[],'nonlcon');
    
    • 1
  • 相关阅读:
    PHP代码审计入门-DVWA靶场CSRF篇
    二十三种设计模式(待更)
    双向TVS的符号及几个参数问题?
    Linux 进程概念和状态
    阿里的211是指什么?
    Go语言在机器学习中有未来吗?
    [附源码]Python计算机毕业设计Django病人跟踪治疗信息管理系统
    【毕业设计】基于Django的在线考试系统 python
    【JavaWeb】关于JWT做认证授权的十万个理由(JSON Web Token)
    PostMan接口测试教程
  • 原文地址:https://blog.csdn.net/qq_40306845/article/details/133078816