• 数学建模:线性与非线性优化算法


    🔆 文章首发于我的个人博客:欢迎大佬们来逛逛

    数学建模:线性与非线性优化算法

    优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值

    优化的两个关键点:

    1.明确优化的目标函数
    2.明确优化变量之间需要满足的约束

    线性优化

    使用函数:linprog

    函数原型:

    [x,fval]=linprog(f,A,b,Aeq,Beq,LB,UB)
    
    • 1
    • x:求得最优情况下变量的解
    • fval:求得最优目标值
    • f:目标函数的系数(符号按最小值标准,若目标是求解机大值可以通过添加负号改成求极小值)
    • A:不等式约束的变量系数(符合按小于标准,如果是大于约束可通过加负号变成小于)
    • b:不等式约束的常量
    • Aeq:等式约束的变量系数
    • Beq:等式约束的常量
    • LB:变量的下限
    • UB:变量的上限

    例如我们需要计算求解如下线性函数的最优解:

    m i n { − x 1 − 2 x 2 + 3 x 3 } x 1 + x 2 ⩾ 3 x 2 + x 3 ⩾ 3 x 1 + x 3 = 4 0 ≤ x 1 , x 2 , x 3 ≤ 2

    min{x12x2+3x3}x1+x23x2+x33x1+x3=40x1,x2,x32" role="presentation">min{x12x2+3x3}x1+x23x2+x33x1+x3=40x1,x2,x32
    min{x12x2+3x3}x1+x23x2+x33x1+x3=40x1,x2,x32

    clc;clear;
    
    f = [-1;-2;3];
    %% 不等式约束
    A = [-1,-1,0;0,-1,-1];
    B = [-3,-3];
    
    %% 等式约束
    Aeq = [1,0,1];
    Beq = [4];
    
    %% 上下限
    LB = zeros(3,1);
    UB = 2*ones(3,1);
    
    %% 线性优化
    [x,fval] = linprog(f,A,B,Aeq,Beq,LB,UB);
    
    %% 输出结果
    
    objstr = ['目标函数最优值:',num2str(fval)];
    disp(objstr);
    for i = 1:length(x)
        xstr = ['x',num2str(i),'的系数为: ',num2str(x(i))];
        disp(xstr);
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    非线性优化

    fmincon是MATLAB的非线性规划求解函数

    [x,fval]=fmincon(fun,x0,A,b,Aeq,Beq,LB,UB,nonlcon)
    
    • 1
    • x:求得最优情况下变量的解
    • fval:求得最优目标值
    • fun:目标函数(符号按最小值标准,若目标是求解机大值可以通过添加负号改成求极小值)
    • x0:初始解
    • A:不等式约束的变量系数(符合按小于标准,如果是大于约束可通过加负号变成小于)
    • b:不等式约束的常量
    • Aeq:等式约束的变量系数
    • Beq:等式约束的常量
    • LB:变量的下限
    • UB:变量的上限
    • nonlcon :非线性约束函数表达式

    m a x { x 1 2 − x 2 2 + x 2 x 3 } 2 x 1 + x 2 + 3 x 3 ≤ 6 x 1 2 + x 1 x 2 + x 2 x 3 ≤ x 2 + 6 0 ≤ x 1 , x 2 , x 3 ≤ 1

    max{x12x22+x2x3}2x1+x2+3x36x12+x1x2+x2x3x2+60x1,x2,x31" role="presentation">max{x12x22+x2x3}2x1+x2+3x36x12+x1x2+x2x3x2+60x1,x2,x31
    max{x12x22+x2x3}2x1+x2+3x36x12+x1x2+x2x3x2+60x1,x2,x31

    clc;clear;
    
    % 指定初始解
    x0 = zeros(3,1);
    %% <线性>不等约束
    A = [2,1,3];
    B = [6];
    
    %% <线性>等式约束
    Aeq = [];
    Beq = [];
    
    %% 变量上下限
    LB = zeros(3,1);
    UB = 1*ones(3,1);
    
    %% 整体非线性优化目标函数
    fun = @(x) -x(1)^2-x(2)^2+x(2)*x(3);
    
    %% 取得非线性不等式约束函数
    nonlcon = @noLinearLimited;
    [x,fval] = fmincon(fun,x0,A,B,Aeq,Beq,LB,UB,nonlcon);
    
    objstr=['目标函数最优值:',num2str(-fval)];
    disp(objstr)
    for i=1:length(x)
        xstr=['x',num2str(i),'的值为:',num2str(x(i))];
        disp(xstr)
    end
    
    %% 非线性不等式约束的表达式,如果有多个,则在C后面加; 补充即可
    function [C,Ceq] = noLinearLimited(x)
        C = [x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6];
        Ceq = [];
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    66 跳跃游戏
    [附源码]java毕业设计大学生心理健康系统
    测试时间不够,你会如何处理?
    arguments
    [附源码]计算机毕业设计JAVA新冠疫苗线上预约系统
    Python: 初识Python
    LeetCode 202. 快乐数
    GBASE 8s 高可用RSS集群搭建
    爬虫项目(八):自动获取CSDN博客文章质量评分
    Tomcat详解
  • 原文地址:https://blog.csdn.net/jj6666djdbbd/article/details/132645990