• 数学建模——非线性规划


    目录

    基本概念

    凸规划

    判别定理

    二次规划模型

    非线性规划的求解

    无约束极值问题

    有约束极值问题

    基于求解器的解法

    基于问题的求解

    其他


    非线性规划:描述目标函数或约束条件条件的数学表达式中,至少有一个是非线性函数。

    基本概念

    x=[x_{1},x_{2},...,x_{n}]^{T}是n维欧式空间R^{n}中的一个点(n维向量),f(x)g_{i}(x),i=1,2,...,ph_{j}(x),j=1,2,...,q是定义在R^{n}上的实值函数。若f,g,h函数中至少有一个是x的非线性函数,则称如下为非线性规划模型的一般形式:

     全局最优解:若x^{*}\in K,并且\forall x\in K都有f(x^{*} )\leq f(x),则称x^{*}为全局最优解。

     局部最优解:x的邻域内(也包含于可行域),x所对应的函数值是最小的,则x为局部最优解。

    无约束非线性规划问题可以具体表示为:

    minf(x),x\in R^{n}

    凸规划

    凸规划是一类特殊的非线性规划问题,可以求得全局最优解。

    凸集:

     凸函数:

    定义在凸集上的有限个凸函数的非负线性组合仍为凸函数

    判别定理

    半正定矩阵的行列式非负。

    黑塞矩阵:

     对于非线性规划模型的一般形式,若f(x)为凸函数,g(x)为凸函数,h(x)为线性函数,则称该非线性规划问题为凸规划。凸规划局部最优解即为全局最优解,最优解的集合形成一个凸集。当目标函数为严格凸函数时,其最优解必定唯一。

    例子

    f(x)和g2(x)的黑塞矩阵的行列式:

     其他约束条件为线性函数,所以是一个凸规划问题

    1. clc,clear
    2. prob = optimproblem;
    3. x = optimvar('x',2,'LowerBound',0);
    4. prob.Objective = sum(x.^2)-4*x(1)+4;
    5. con = [-x(1)+x(2)-2 <= 0
    6. x(1)^2-x(2)+1 <= 0];
    7. prob.Constraints.con = con;
    8. x0.x = rand(2,1)%非线性规划必须赋初值,x0名字随便取
    9. [s,f,flag,o] = solve(prob,x0);
    10. s.x

    ans =

        0.5536
        1.3064

    二次规划模型

    目标函数是关于决策向量的二次函数,约束条件是线性的,则该模型称为二次规划模型,一般形式:

     其中:

     当H正定时,目标函数最小化时,模型为凸二次规划,凸二次规划局部最优解就是全局最优解。如果不是凸规划,则建议使用fmincon函数。

    例子

    目标函数是最小化,但是H为负定矩阵,所以不是凸规划。

    1. clc,clear
    2. x = optimvar('x',2,'LowerBound',0);
    3. h = [-1,-0.15;-0.15,-2];
    4. f = [98;277];
    5. a = [1,1;1,-2];
    6. b = [100;0];
    7. prob = optimproblem('Objective',x'*h*x+f'*x);
    8. prob.Constraints = a*x <= b;
    9. [s,f,flag,o] = solve(prob);
    10. s.x

    ans =

         1
         1

    [1,1]是局部最优解,使用fmincon函数:

    1. fx = @(x)x'*h*x+f'*x;
    2. [x,y] = fmincon(fx,rand(2,1),a,b,[],[],[0;0],[])

    x =

       1.0e-07 *

        0.2533
        0.3400
    y =

       1.1901e-05

    非线性规划的求解

    无约束极值问题

    MATLAB工具箱中用于求解无约束极小值的函数有:

     例子

    1. clc,clear
    2. f = @(x) x(1)^3-x(2)^3+3*x(1)^2+3*x(2)^2-9*x(1);
    3. g = @(x) -f(x);
    4. [m1,n1] = fminunc(f,[0,0])%求极小值
    5. [m2,n2] = fminsearch(g,[0,0]);%求极大值
    6. m2,-n2

    m1 =

        1.0000   -0.0000
    n1 =

        -5
    m2 =

       -3.0000    2.0000
    ans =

       31.0000

    有约束极值问题

    同样有基于求解器的求解方法和基于问题的求解方法

    基于求解器的解法

    数学模型的标准形式为:

     例:

    1. clc,clear
    2. fun1 = @(x) sum(x.^2)+8;
    3. [x,y] = fmincon(fun1,rand(3,1),[],[],[],[],zeros(3,1),[],@fun2)
    4. function [c,ceq] = fun2(x)
    5. c = [-x(1)^2+x(2)-x(3)^2
    6. x(1)+x(2)^2+x(3)^3-20];
    7. ceq = [-x(1)-x(2)^2+2
    8. x(2)+2*x(3)^2-3];
    9. end

    基于问题的求解

    1. clc,clear
    2. x = optimvar('x',3,'LowerBound',0);
    3. prob = optimproblem('Objective',sum(x.^2)+8);
    4. con1 = [-x(1)^2+x(2)-x(3)^2 <= 0
    5. x(1)+x(2)^2+x(3)^3 <= 20];
    6. con2 = [-x(1)-x(2)^2+2 == 0
    7. x(2)+2*x(3)^2 == 3];
    8. prob.Constraints.con1 = con1;
    9. prob.Constraints.con2 = con2;
    10. x0.x = rand(3,1);
    11. [s,f,flag,out] = solve(prob,x0);
    12. s.x,f

     

    其他

    匿名函数的返回值只能有一个,可以是向量。

  • 相关阅读:
    Linux网络配置
    Mac中隐私安全性设置-打开任何来源
    生产者消费者模型+仓储模型及Java自带的线程池
    0020__如何获取windows系统的串口列表
    Revit中模型填充图案与绘图填充图案的区别
    【Leetcode】1246. Palindrome Removal
    Roson的Qt之旅 #122 Qt信号与槽的所有connect方法说明
    springboot配置swagger
    【Shell】Shell 脚本自动输入密码的三种方式
    vue--push,pop,unshift,shift,reverse,splice,sort数组修改产生视图更新
  • 原文地址:https://blog.csdn.net/m0_51311105/article/details/125411850