Matlab求解线性规划问题:从基础概念到实战教程(附完整代码)
你有没有遇到过这样的问题?比如开个小店手里有有限材料,想生产两种商品怎么安排产量赚最多钱?或者公司排班车要满足员工需求同时成本最低?这些其实都是线性规划的问题!今天咱们就用Matlab来搞定它,超级简单,看完就能上手!
一、线性规划是什么?
简单说,线性规划就是在一系列线性约束条件下,找目标函数的最优值(最大或最小)。比如生产问题里,目标是利润最大化,约束是材料不能超限制、产量不能负——这些条件都是线性的,所以叫线性规划。
二、Matlab的线性规划神器:linprog函数
Matlab里专门解决线性规划的函数是linprog,只要把问题转成它要求的标准形式,一键就能出结果!先看标准形式:
min f^T x
约束条件:
A·x ≤ b (不等式约束)
Aeq·x = beq (等式约束)
lb ≤ x ≤ ub (变量上下界)
每个参数的意思:
- f:目标函数系数向量(比如目标函数是3x₁+2x₂,f=[3,2])
- A/b:不等式约束的矩阵和右边向量(每个约束对应一行)
- Aeq/beq:等式约束的矩阵和右边向量(没有就用空矩阵[])
- lb/ub:变量的下界/上界(比如x₁≥0就写lb=[0;...],无上限用inf)
敲黑板! linprog默认求最小值!如果是最大化问题(比如利润最大),要把目标函数系数变负——这样求出来的最小值就是原最大值的相反数!我第一次用就栽在这里,结果利润是负数,吓了一跳!
三、实战案例1:生产计划优化
假设你开工厂生产A、B两种产品:
- 生产1件A需1单位材料X+2单位材料Y
- 生产1件B需2单位材料X+1单位材料Y
- 每天材料X最多100单位、Y最多200单位
- A利润5元/件,B利润4元/件
怎么安排产量赚最多钱?
步骤1:转化为标准形式
设x₁=A产量,x₂=B产量:
- 目标函数:max 5x₁+4x₂ → min -5x₁-4x₂(系数变负)
- 约束:
- x₁+2x₂ ≤100(X限制)
- 2x₁+x₂ ≤200(Y限制)
- x₁≥0、x₂≥0(产量非负)
步骤2:Matlab代码实现
% 目标函数系数(转最小值)
f = [-5, -4];
% 不等式约束矩阵A和向量b
A = [1, 2; 2, 1];
b = [100; 200];
% 变量下界
lb = [0; 0];
% 调用linprog(无等式约束用[])
[x, fval, exitflag] = linprog(f, A, b, [], [], lb);
% 输出结果
disp('最优产量:');
disp(['产品A:', num2str(x(1)), '件']);
disp(['产品B:', num2str(x(2)), '件']);
disp('最大利润:');
disp(['利润:', num2str(-fval), '元']); % 转成正数
disp('退出标志:');
disp(exitflag);
结果解读
运行后会得到:
- 最优产量:A≈66.67件,B≈16.67件
- 最大利润≈466.67元
- exitflag=1(表示找到最优解)
如果exitflag是0说明迭代次数不够,-2是无解(约束矛盾),-3是无界解(目标函数无限小)——这些标志能帮你判断结果是否合理!
四、实战案例2:带等式约束的线性规划
在案例1基础上加个要求:每天总产量必须80件(x₁+x₂=80),其他约束不变怎么解?
步骤1:加等式约束
等式约束矩阵Aeq=[1,1](对应x₁+x₂),beq=80。
步骤2:修改代码
f = [-5, -4];
A = [1,2;2,1];
b = [100;200];
% 等式约束
Aeq = [1,1];
beq = 80;
lb = [0;0];
[x, fval, exitflag] = linprog(f, A, b, Aeq, beq, lb);
% 输出
disp('最优产量:');
disp(['产品A:', num2str(x(1)), '件']);
disp(['产品B:', num2str(x(2)), '件']);
disp('最大利润:');
disp(['利润:', num2str(-fval), '元']);
结果
最优解是A=60件、B=20件,利润380元——刚好满足总产量80件和材料约束!
五、常见坑点总结
我踩过的坑分享给你,避免走弯路:
- 目标函数符号错:最大化问题系数没转负,结果完全不对!
- 矩阵维度不匹配:A的行数要等于b行数(每个约束一行),列数等于变量数——不然Matlab会报错!
- 上下界没设置:忘记lb=[0;0]会出现负数变量,实际问题不合理!
- 等式约束写错:Aeq列数要等于变量数,行数等于等式约束数——比如一个等式约束就写1行n列(n是变量数)!
六、扩展应用场景
线性规划的用处可不止生产计划:
- 运输问题:多个仓库运货到多个商店,怎么安排运输量成本最低?
- 排班问题:公司安排员工值班,满足每天人力需求同时总工时最少?
- 资源分配:学校分配教室和老师,满足课程需求同时利用率最高?
这些都能转成线性规划,用Matlab的linprog解决!是不是超实用?
结尾
今天从基础概念讲到实战案例,相信你已经掌握Matlab求解线性规划的方法!关键是把实际问题转成标准形式,然后调用linprog就行。建议你自己找个例子试试(比如运输问题),动手写代码才是最快的学习方式!遇到问题记得看Matlab帮助文档(输入help linprog),里面有更多参数和例子哦!
希望这篇文章对你有帮助,下次再见啦!
浙公网安备 33010602011771号