Matlab数学建模(五):优化模型之标准模型

article/2025/9/16 14:35:20

一、学习目标

(1)了解最优化模型。

(2)掌握线性规划的优化求解。

(3)掌握整数规划的优化求解。

(4)了解Matlab的图形化应用。

二、实例演练

     1、谈谈你对最优化模型的了解。

        最优化模型是数学建模大赛中最常见的问题类型之一。一般说来,凡是寻求最大、最小、最远、最近、最经济、最丰富、最高效、最耗时的目标,都可以划入优化问题的范畴。MATLAB 优化工具箱和全局优化工具箱对多个优化问题提供了完整的解决方案,前者涵盖了线性规划、混合整型线性规划、二次规划、非线性优化、非线性最小二乘的求解器,后者囊括了全局搜索、多初始点、模式搜索、遗传算法等求解算法。

       最优化即在一定的条件下,寻求使目标最小(大)的设计参数或决策。在优化问题中有两个关键对象:目标函数约束条件。哈哈哈,这让笔者想起来高中学到的线性规划,其实,本节谈到的最优化模型跟高中的线性规划还真有点像。不过,高中的线性规划问题约束条件很少,一般是通过作图法来求解。本节的最优化模型约束条件一般比高中的线性规划多很多,并且我们要通过写代码去求解,而不是作图。常规优化问题,其数学表达可以描述为:

其中x 为长度n的决策变量向量,f(x) 为目标函数,G(x) 为约束函数。

以上数学表达式看不明白也没关系,因为下面我们会通过两个具体的例子去讲解分析。

求解目标函数的最小(大)值,一个高效而精确的解决方案不仅取决于约束条件和变量数量,更取决于目标函数和约束函数的特性。明确优化类型是确认优化方案的前提,让我们看一下这些特性如何划分:

常见的目标函数有:

线性规划:被广泛的应用于变量之间可线性表示的财务、能源、运营研究等现代管理领域中。

混合整数线性规划:扩展了线性规划问题,增加了最优解中部分或全部变量必须是整数的约束。例如,如果一个变量代表要认购的股票数量,则只应取整数值。同样,如果一个变量代表发电机的开/关状态,则只应取二进制值(0 或 1)。

二次规划:目标函数或约束函数为多元二次函数。此优化应用于财务金融中投资组合优化、发电厂发电优化、工程中设计优化等领域。

最小二乘:分为线性和非线性,通过最小化误差的平方和寻找变量的最优函数匹配。非线性最小二乘优化还可用于曲线拟合。

 

对 MATLAB 提供的各类优化问题的算法,我们称之为求解器(Solver)。根据其求解目标,被分为四大组:

  • 极小值优化组:找到目标函数出发点 x0 附近的局部极小值

  • 多目标优化组:找到最小化一组函数的最大值或指定的值

  • 方程求解组:找到非线性方程 f(x) = 0 出发点 x0 附近的解

  • 最小二乘法(曲线拟合)组:最小化平方和

仅优化工具箱就提供了近 20 种求解器,面对如此繁多的选项,用户往往一头雾水。幸好,MATLAB 提供了简单明了的参考工具 —— 优化决策表。可谓一表在手,优化不愁:

上表中*表示算法由全局工具箱提供。

我的天呀,你是不是已经被上面的内容吓傻了。看不太懂?没关系。我们现在只需知道有那么一回事即可,不必苦恼。等遇到相应的问题时我们再去结合具体的例子去深入学习和理解。

    2、已知目标函数和约束条件如下,试求解目标函数的最小值。

                             

       初一看,HPS、PP、EP、P1、I1,……等等,这些是什么东东?别紧张,它们只是变量,把它们当成x,y,z这种常见的变量去看待即可。我数了一下,约束函数中共有19条数学表达式,涉及16个变量。是挺难搞的,用高中的作图法怕是解决不了。别怕,我们有Matlab,通过代码去搞定它。

       好,现在我们开始一步步去求解它。

a. 首先,根据题目确认这是一个线性规划问题。而线性规划的通用数学表达式和MATLAB标准形式为:

这个标准形式很重要,上面的A,b,Aeq,beq,lb,ub我们后面要用到。

b. 对于线性规划的优化求解步骤(也适用于其他优化方案),建议如下:

    1 ) 选择优化求解器

    2 ) 将所有变量合并为一个向量

    3 ) 创建边界约束(lb,ub)

    4 ) 创建线性不等式约束(A,b)

    5 ) 创建线性等式约束(Aeq,beq)

    6 ) 创建目标函数

    7 ) 优化问题求解

    8 ) 结果检验

上面的求解步骤非常重要,我们的代码整体框架跟求解步骤差不多。

现在我们按照上面的求解步骤去求解:

(1)选择优化求解器。

这道题目是这是一个线性规划问题。求解线性规划问题,我们一般选用linprog。linprog在写代码将要写完才需用到。在第一步我们只需要知道一个线性规划问题,代码按照求解线性规划问题去写即可。

(2)将所有变量合并为一个向量。

目标函数和约束条件中共有HPS、PP、EP、P1、I1等16个变量,我们需要将其合并为一个向量。除了合并为一个向量外,我们还将每个变量依次分别赋值1,2,3,4,……16。

%% 将所有变量合并为一个向量,共16个变量
variables = {'I1','I2','HE1','HE2','LE1','LE2','C','BF1','BF2','HPS','MPS','LPS','P1','P2','PP','EP'}
N = length(variables)
for v = 1:Neval([variables{v},'=',num2str(v),';'])
end

(3)创建边界约束(lb,ub)

lb是指low boundary,即最低边界。ub是指up boundary,即最高边界。在这一步中,我们需要把约束条件里的不等式(该不等式只含单个变量,如2500<=P1<=6250,3000<=P2<=9000)找出来,并根据它们的上下边界写代码。

%% 设置上下限约束(lb<=x<=ub)
% 设置下限约束,即lb<=x
lb = zeros(size(variables)); % 1x16的矩阵,每个数都是0
lb([P1,P2,MPS,LPS]) = [2500,3000,271536,100623];
% 设置上限约束,即x<=ub
ub = Inf(size(variables)); % 1想6的矩阵,每个数都是无穷大
ub([P1,P2,I1,I2,C,LE2])= [6250,9000,192000,244000,62000,142000];

(4)创建线性不等式约束(A,b)。

在这一步需要将约束条件里的不等式(该不等式含两个或两个以上变量)找出来,并根据它们的上下边界写代码。

%% 创建线性不等式约束(A*x<=b)
A = zeros(3,16); % 3x16的矩阵,每个数均为0,为什么是3x16,因为约束条件有3个不等式
% 由不等式I1-HE1<=132000得到下面一行代码
A(1,I1)=1; A(1,HE1)=-1; b(1) = 132000;
% 由不等式-EP-PP<=12000得到下面一行代码
A(2,EP)=-1; A(2,PP)=-1; b(2) = -12000;
% 由不等式-P1-P2-PP<=-24550得到下面一行代码
A(3,[P1,P2,PP])=[-1,-1,-1];b(3)=-24550;

(5)创建线性等式约束(Aeq,beq)。

在这一步需要把约束条件中的等式找出来,并通过移项,让等式的右边为0。

%% 创建线性等式约束(Aeq*x=beq)
Aeq=zeros(8,16);beq=zeros(8,1) % 约束条件中共有8个等式
% 把等式I2=LE2+HE2转化为LE2+HE2-I2=0后,得到下面一行代码
Aeq(1,[LE2,HE2,I2])=[1,1,-1];
Aeq(2,[LE1,LE2,BF2,LPS])=[1,1,1,-1];
Aeq(3,[I1,I2,BF1,HPS])=[1,1,1,-1];
Aeq(4,[C,MPS,LPS,HPS])=[1,1,1,-1];
Aeq(5,[LE1,HE1,C,I1])=[1,1,1,-1];
Aeq(6,[HE1,HE2,BF1,BF2,MPS])=[1,1,1,-1,-1];
Aeq(7,[HE1,LE1,C,P1,I1])=[1267.8,1251.4,192,3413,-1359.8];
Aeq(8,[HE2,LE2,P2,I2])=[1267.8,1251.4,3413,-1359.8];

(6)创建目标函数。

%% 创建目标函数
f = zeros(size(variables));
% 由目标函数0.002614HPS+0.0239PP+0.009825EP
f([HPS,PP,EP]) = [0.002614,0.0239,0.009825];

(7) 求解问题

%% 由linprog实现线性规划问题求解
options = optimoptions('linprog','Algorithm','dual-simplex');
% 将前面已经确定的各个参数传入linprog()中
[x, fval] = linprog(f,A,b,Aeq,beq,lb,ub,options);
for d=1:Nfprintf('%12.2f\t%s\n',x(d),variables{d})
end

fprintf函数是将求解后每个变量的打印出来。

求解结果如下:

下面把完整的源代码贴上:

clc,clear,close all
%% 选择优化求解器,线性规划求解可由linprog实现%% 将所有变量合并为一个向量,共16个变量
variables = {'I1','I2','HE1','HE2','LE1','LE2','C','BF1','BF2','HPS','MPS','LPS','P1','P2','PP','EP'}
N = length(variables)
for v = 1:Neval([variables{v},'=',num2str(v),';'])
end%% 设置上下限约束(lb<=x<=ub)
% 设置下限约束,即lb<=x
lb = zeros(size(variables)); % 1x16的矩阵,每个数都是0
lb([P1,P2,MPS,LPS]) = [2500,3000,271536,100623];
% 设置上限约束,即x<=ub
ub = Inf(size(variables)); % 1想6的矩阵,每个数都是无穷大
ub([P1,P2,I1,I2,C,LE2])= [6250,9000,192000,244000,62000,142000];%% 创建线性不等式约束(A*x<=b)
A = zeros(3,16); % 3x16的矩阵,每个数均为0,为什么是3x16,因为约束条件有3个不等式
% 由不等式I1-HE1<=132000得到下面一行代码
A(1,I1)=1; A(1,HE1)=-1; b(1) = 132000;
% 由不等式-EP-PP<=12000得到下面一行代码
A(2,EP)=-1; A(2,PP)=-1; b(2) = -12000;
% 由不等式-P1-P2-PP<=-24550得到下面一行代码
A(3,[P1,P2,PP])=[-1,-1,-1];b(3)=-24550;%% 创建线性等式约束(Aeq*x=beq)
Aeq=zeros(8,16);beq=zeros(8,1) % 约束条件中共有8个等式
% 把等式I2=LE2+HE2转化为LE2+HE2-I2=0后,得到下面一行代码
Aeq(1,[LE2,HE2,I2])=[1,1,-1];
Aeq(2,[LE1,LE2,BF2,LPS])=[1,1,1,-1];
Aeq(3,[I1,I2,BF1,HPS])=[1,1,1,-1];
Aeq(4,[C,MPS,LPS,HPS])=[1,1,1,-1];
Aeq(5,[LE1,HE1,C,I1])=[1,1,1,-1];
Aeq(6,[HE1,HE2,BF1,BF2,MPS])=[1,1,1,-1,-1];
Aeq(7,[HE1,LE1,C,P1,I1])=[1267.8,1251.4,192,3413,-1359.8];
Aeq(8,[HE2,LE2,P2,I2])=[1267.8,1251.4,3413,-1359.8];%% 创建目标函数
f = zeros(size(variables));
% 由目标函数0.002614HPS+0.0239PP+0.009825EP
f([HPS,PP,EP]) = [0.002614,0.0239,0.009825];%% 由linprog实现线性规划问题求解
options = optimoptions('linprog','Algorithm','dual-simplex');
% 将前面已经确定的各个参数传入linprog()中
[x, fval] = linprog(f,A,b,Aeq,beq,lb,ub,options);
for d=1:Nfprintf('%12.2f\t%s\n',x(d),variables{d})
end

  3、下面是一个整数规划问题,已知目标函数和约束条件如下,求解目标函数的最大值。

                                      

     求解最大值问题和求解最小值问题本质上是一致的,求解最大值也可以转换为求解最小值。

例如:本题要求解z=3*x1-2*x2+5*x3的最大值,也就是要求解y=-3*x1+2*x2-5*x3的最小值。求解线性规划最小值问题我们在上面已经学过。本题还有一个比较特殊的问题是,约束条件中的三个变量均为整数,而且是0或1,这也是所谓的0-1规划问题。

求解整值问题要用到专门的求解器 intlinprog。

clc,clear,close all
% 求z=3*x1 - 2*x2 + 5*x3的最大值转化为求y=-3*x1 + 2*x2 - 5*x3的最小值。
f = [-3;2;-5]; % 创建目标函数
intcon=[1,2,3];
A=[1 2 -1; 1 4 1; 1 1 0; 0 4 1]; % 四个不等式中的变量系数
b=[2;4;3;6]; % 约束条件中不等式右边的常数
lb=[0,0,0]; % x1,x2,x3=0
ub=[1,1,1]; % x1,x2,x3=1
Aeq=[0,0,0];
beq=0;
x=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

我想提一下intcon=[1,2,3]这句代码是怎么回事。

下面我举一个简单的例子来说明intcon的用法。

X=[x1,x2,x3,x4,x5,x6],其中x2, x3, x6只能取整数
intcon = [2,3,6]
如果所有变量都只能取整数,则:intcon = [1,2,3,4,5,6]; 比较方便的写法是:intcon = 1:6
如果只有x4取整数,则:intcon = 4;就是约束整形变量

在本题中,除了x1,x2,x3=0或1外,没有其它的等式了。故Aeq=[0,0,0];beq=0;

 4、图形化应用

在数学建模竞赛中,我们一般通过代码来进行求解问题,图形化应用可以用来检验结果是否正确。

MATLAB 在数据分析领域如此受欢迎,除了其提供丰富的内置算法集,还有各类友好的应用界面。在优化工具箱中,也有这么一个强大的工具—— Optimization App,可以在 MATLAB Apps 窗口或者运行 optmitool 命令打开。它是一个交互式的图形化应用工具,无需手写代码,直接在图形界面中设置各类求解器、配置目标函数、约束条件,即可运行优化算法并使中间结果和最终结果可视化。

在 Optimization App 中,只需点击菜单栏中的 File > Generate Code,即可将 App 中的各项设置自动生成 MATLAB 代码,用户可实现算法的复用和二次开发。


http://chatgpt.dhexx.cn/article/bT7ZB7fP.shtml

相关文章

Matlab 数学建模算法大全

Matlab 数学建模算法大全 第一章 线性规划…1 第二章 整数规划…16 第三章 非线性规划…32 第四章 动态规划…56 第五章 图与网络…68 第六章 排队论…118 第七章 对策论…154 第八章 层次分析法…167 第九章 插值与拟合…175 第十章 数据的统计描述和分析…201 第十一章 方差分…

数学建模专栏 | 第三篇:MATLAB数据建模方法(上) —常用方法

以数据为基础而建立数学模型的方法称为数据建模方法&#xff0c; 包括回归、统计、机器学习、深度学习、灰色预测、主成分分析、神经网络、时间序列分析等方法&#xff0c; 其中最常用的方法还是回归方法。 本讲主要介绍在数学建模中常用几种回归方法的 MATLAB 实现过程。 根据…

快速MATLAB学习,数学建模

文章目录 MATLAB1.简单加减乘除2.help的用法3.数据类型3.1整数3.2浮点数3.3复数3.4逻辑型3.5矩阵1 普通矩阵2转置矩阵3拉伸4逆矩阵6三维矩阵7等差矩阵8重复矩阵7全一的矩阵9结构体 4.变量的使用4.1特殊变量4.2>>iskeyword 5.矩阵的四则运算矩阵下标 6.程序结构6.1for循环…

利用MATLAB进行数学建模

一、用给定的多项式&#xff0c;如yx3-6x25x-3&#xff0c;产生一组数据(xi,yi&#xff0c;i1,2,…,n),再在yi上添加随机干扰(可用rand产生(0,1)均匀分布随机数,或用rands产生N(0,1)分布随机数)&#xff0c;然后用xi和添加了随机干扰的yi作的3次多项式拟合&#xff0c;与原系数…

【数学建模】常用模型算法及MATLAB代码汇总

大家好&#xff0c;我是程序员史迪仔。 这篇文章是在大学准备数学建模比赛时&#xff0c;整理的学习笔记&#xff0c;没想到阅读量、点赞量和收藏量还是可以的&#xff0c;很高兴我的文章能给大家带来帮助&#xff01; 一、蒙特卡洛算法二、数据拟合三、数据插值四、图论1、最…

2022数学建模国赛备赛阶段性记录(1-1)

数学建模国赛培训记录&#xff0c;主要使用软件为MATLAB&#xff0c;主要内容为在数学建模竞赛中常用的操作、数学与模型以及部分练习题的解析。 一、常规操作 1、基本运算 MATLAB内四则运算相当于计算机的加减乘除&#xff0c;对应输入数字、运算符&#xff0c;回车即可得出…

Matlab与数学建模

一、学习目标。 (1)了解Matlab与数学建模竞赛的关系。 (2)掌握Matlab数学建模的第一个小实例—评估股票价值与风险。 (3)掌握Matlab数学建模的回归算法。 二、实例演练。 1、谈谈你对Matlab与数学建模竞赛的了解。 Matlab在数学建模中使用广泛:MATLAB 是公认的最优秀的数…

MATLAB在数学建模中的应用

MATLAB在数学建模中的应用 一.预备知识 1.1.关于MATLAB软件 由于科学技术及计算机的飞速发展,各类数学软件不断涌现&#xff0c;这使在解决各类复杂的问题变得非常简单。常用的数学软件有Mathematica、MATLAB、SAS等软件。MATLAB是“Matrix Laboratory"的缩写&#xff…

数学建模——matlab基本使用

一&#xff1a;命令窗口两个常用基本命令 清除工作区&#xff1a;clear。清屏&#xff1a;clc。 二&#xff1a;变量与基本运算 圆周率表示&#xff1a;pi。lnx代码化&#xff1a;log(x)。e^x代码化&#xff1a;exp(x) x代表次数。sin(x):sin(x);cos(x):cos(x);tan(x):tan(x…

MATLAB数学建模-规划模型总结| MATLAB求解

目录 1 线性规划问题&#xff08;LP&#xff09; 风格1 风格2 2 非线性规划 3 动态规划 A星算法 基于dijkstra的概率路线图 4 多目标规划 帕累托最优 支配&#xff08;Dominace&#xff09; 不可支配解集 帕累托最优解集 帕累托最优前沿面 线性加权法 约束转化法…

MATLAB--数学建模作图大全及代码说明

目录 1、二维曲线 2、二维渐变图 3、二维散点图 4、条形图 5、填充图 6、多Y轴图 7、三维曲线图 8、三维散点图 9、三维伪彩图 10、裁剪伪彩图 11、等高线图 12、三维等高线图 13、等高线填充图 14、三维矢量场图 15、伪彩图投影图 16、热图 17、分子模型图 1…

如何查询Opencv的版本

环境&#xff1a;Win10 方法&#xff1a; 参考文章上写的很详细&#xff0c;在这里重新编辑一下&#xff0c;保存下来&#xff1a; 1、找到OpenCV的安装主文件夹&#xff0c;在主文件夹中找到“build”文件夹。 2、进入build文件夹以后&#xff0c;在文件夹中找到名为“Ope…

Linux查看opencv 版本

命令如下&#xff1a; [plain] view plain copy print ? pkg-config --modversion opencv 库文件一般放在&#xff1a; /usr/local/lib &#xff08;PS&#xff0c;系统装的OpenCV版本太多&#xff0c;查找也让人头疼&#xff09; 头文件一般在&#xff1a; /usr/local/inc…

ubuntu系统下如何查看opencv版本

打开终端&#xff0c;在终端输入&#xff1a; pkg-config --modversion opencv 可以看出&#xff0c;我安装的是opencv 2.4.13版本的。

在pycharm中查看opencv版本

import cv2 print(cv2.__version__)运行后如下图为自己各自安装的版本&#xff1a;

linux下查看opencv版本

直接使用命令 pkg-config --modversion opencv

opencv查看版本路径

1、查看ubuntu下的OpenCV安装版本&#xff1a; pkg-config opencv --modversion 2、查看ubuntu的opencv安装路径&#xff1a; sudo find / -iname "*opencv*" 在全盘上不区分大小写&#xff0c;搜索带有关键字opencv的所有文件及文件夹都会输出到终端&#xff0c;如…

Windows查看OpenCV版本

打开命令提示符 winr 键打开运行窗口&#xff0c;输入cmd&#xff0c;即可看到弹出的命令提示符窗口输入指令 python import cv2 cv2.__version__得到结果

http 请求 返回状态码 405 的问题

状态码为405表示请求的方式不对&#xff0c; 请求的方式有get、post、head、put…… 常用的为post和get。 代码里面我刚刚开始的时候使用的是HttpPost发的请求&#xff0c;另外一边呢&#xff0c;刚刚开始的时候只有一个get请求在那等着呢。 等我看到405之后&#xff0c;哦&…

HTTP状态 405 - 方法不允许

错误描述&#xff1a; HTTP状态 405 - 方法不允许 类型 状态报告 消息 Request method ‘GET’ not supported 描述 请求行中接收的方法由源服务器知道&#xff0c;但目标资源不支持 此时的原因是请求类型错误&#xff0c;网页是get请求&#xff0c;但是实际上是post请求 解…