数学建模--Matlab求解线性规划问题&&两种类型&&实际应用

1.约束条件的符号一致

(1)约束条件的符号一致的意思就是指的是这个约束条件里面的,像这个下面的实例里面的三个约束条件,都是小于号,这个我称之为约束条件符号一致;

(2)下面的就是上面的这个线性规划问题的代码,我们首先要把这个目标函数的系数矩阵表示出来,就是这个代码里面的第三行的c向量,然后表示这个约束条件的系数矩阵,因为第三个约束条件是x2<=7.因此这个x1前面的系数就是0,b向量表示的就是这个等号右边的数据;

复制代码
clc,clear;

pro=optimproblem("ObjectiveSense","max");

c=[4,3];

a=[2,1;1,1;0,1];

b=[10;8;7];

x=optimvar("x",2,"LowerBound",0);

pro.Objective=c*x;

pro.Constraints=a*x<=b;

[s,v]=solve(pro);

xx=s.x

(3)optimvar表示的就是创建优化变量,在这个问题里面,x1和x2就是优化变量,因为这个优化变量的最小值是0,所以在这个代码里面,我们使用这个lowerbound表示的就是最小边界值,2表示的就是这个问题里面的优化变量的数量是两个;

(4)pro就是我们给这个问题起的一个名字,这个名字变量是可以随意命名的,但是这个过程中的名字要保持一致,c*x表示的就是这个目标函数,我们通过这个矩阵的乘法可以得到这个目标函数

(5)注意事项:上面这个里面老师讲解的时候使用的就是乘号,但是我自己认为应该使用点乘的操作,因为之前我们说过这个向量的乘法,应该使用点乘,但是这个如果使用点乘就会报错;

报错的原因就是这优化变量矩阵x表示的就是一个列向量,就是这个x1x2实际上是2行1列的矩阵,这个点乘的时候矩阵的维数(几行几列)必须是一样的,这个也是报错的提示出来的错误信息;

(6)为什么会出现这个情况,我们可以打开这个optimvar函数的帮助文档,这个里面就有一个例子,说的就是这个创建的是3*1的矩阵,因此,我们可以理解为这个函数创建的矩阵默认就是列向量;

实际上这个matlab里面输入一个向量,这个向量会被默认为是行向量,这个和该函数的默认方式还是有所区别的;

(7)同理这个约束条件,就是a*x<=b这个就是组合之后会出现我们现在的约束条件,使用solve函数解决这个pro问题,返回值两个,一个就是s,即两个优化变量的值,val指的就是这个目标函数的最值;

因为这个求解的是最大值,但是这个默认的是最小值,因此在这个optimproblem函数里面,我们使用到了这个objectsence表示的就是相反的意思,意思就是原来默认的是求解最小值,我们使用这个指令之后就会求解出来这个目标函数的最大值,这个也是不需要我们自己记住的,因为这个在我们键入这个optimproblem之后,这个会默认的显示出来,我们只需要使用tab键补充完整就可以了

2.约束条件的符号不一致

(2)这个想必你就已经知道了,这个符号不一致的时候,就是需要我们挨个把这个约束条件给罗列出来,而且这个matlab里面不支持这种符号不相同的方程组,只能放在不同的约束条件里面,无法使用一个约束条件统一表示出来,但是python可以;

(2)这个约束条件是写出来了3个,sum就是求解这三个优化变量的和,第二个和第三个就是普通的大于小于条件约束,这个变量x1中的1必须加上括号,否则运行的时候这个系统就会报错,表示这个变量无法识别;

(3)p1,p2,p3就是我们给这个约束条件起的名字,上一个题目是只有一个式子就可以表示这三个约束条件,因此我们只写出来了pro.constraints没有写后面的,但是这个里面我们使用的是多个式子,方便区分,我们必须给这三个约束条件命名;

复制代码
clc,clear;

pro=optimproblem("ObjectiveSense","max");

c=[2,3,-5];

x=optimvar("x",3,"LowerBound",0);

pro.Objective=c*x;

pro.Constraints.p1=sum(x)==7;

pro.Constraints.p2=2*x(1)-5*x(2)+x(3)>=10;

pro.Constraints.p3=x(1)+3*x(2)+x(3)<=12;

[s,v]=solve(pro)

xx=s.x

3.模型的应用

(1)这个就是一个仓库的租借问题;

(2)

(3)我们通过对于这个模型的分析决定定义4*4的矩阵,这个每一个元素的含义上面有相应的说明,我们使用的就是无符号的,纯数学语言,使用通式进行表示这些变量;

(4)这个里面出现了一种符号,x(1,2:4)表示的就是这个矩阵里面的第一行的第二个,第三个和第四个,前面的sum元素就表示对于这三个元素进行求和;

x(1,:)这个就是取出来第一行的元素,哪些列呢,就是1,2,3,4,5一直到最后,我们就可以使用这个里面的冒号进行标识;

(5) 这个里面的问题会有什么,这个下面的就是我自己遇到的问题,这个目标函数我最开始是写了两行的,就是下面这样的,但是无法求解出来正确的结果,这个不是我们语法问题,而是这个换行的格式问题,我们可以写在一行,也可以使用下面的方法:即把加号放在末尾,加上三个点,系统会识别为蓝色的,这样就可以把这两行的内容连接在一起了;

(6)代码自测:

复制代码
clc,clear;

pro=optimproblem;

x=optimvar('x',4,4,'LowerBound',0);

pro.Objective=2800*sum(x(:,1))+4500*sum(x(1:3,2))+...
6000*sum(x(1:2,3))+7300*x(1,4);

pro.Constraints.con=[sum(x(1,:))>=15
sum(x(1,2:4))+sum(x(2,1:3))>=10
x(1,3)+x(1,4)+x(2,2)+x(2,3)+x(3,1)+x(3,2)>=20
x(1,4)+x(2,3)+x(3,2)+x(4,1)>=12];

[sol,val]=solve(pro)

xx=sol.x
相关推荐
Dshuishui4 分钟前
我用 Claude Code 做了一个学术论文搜索工具
开发语言·人工智能·python·pip·uv
Resky08185 分钟前
ReentrantReadWriteLock 深度解析
java·开发语言·juc
赏金术士36 分钟前
Kotlin 从入门到进阶 之协程 Flow 模块(九)
开发语言·kotlin·php
赵钰老师37 分钟前
R语言在生态环境领域中的应用
开发语言·数据分析·r语言
guygg8841 分钟前
四旋翼无人机串级PID控制MATLAB仿真
开发语言·matlab·无人机
guygg8842 分钟前
四足液压机器人设计程序MATLAB实现
开发语言·matlab·机器人
一只小小的土拨鼠43 分钟前
2026年数维杯数学建模竞赛B题满分解析:智能办公场景下多源异构文件识别的“大模型NLP+统筹运筹”全链路求解(附完整公式与核心代码)
数学建模
Frank_refuel1 小时前
C++之STL->string类的使用和实现
java·开发语言·c++
feifeigo1231 小时前
图像重建中软阈值方法的原理和MATLAB实现
开发语言·matlab
江南十四行1 小时前
Python多线程与多进程实战——避开GIL,榨干CPU
开发语言·网络·python