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₂(系数变负)
  • 约束:
    1. x₁+2x₂ ≤100(X限制)
    2. 2x₁+x₂ ≤200(Y限制)
    3. 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件和材料约束!

五、常见坑点总结

我踩过的坑分享给你,避免走弯路:

  1. 目标函数符号错:最大化问题系数没转负,结果完全不对!
  2. 矩阵维度不匹配:A的行数要等于b行数(每个约束一行),列数等于变量数——不然Matlab会报错!
  3. 上下界没设置:忘记lb=[0;0]会出现负数变量,实际问题不合理!
  4. 等式约束写错:Aeq列数要等于变量数,行数等于等式约束数——比如一个等式约束就写1行n列(n是变量数)!

六、扩展应用场景

线性规划的用处可不止生产计划:

  • 运输问题:多个仓库运货到多个商店,怎么安排运输量成本最低?
  • 排班问题:公司安排员工值班,满足每天人力需求同时总工时最少?
  • 资源分配:学校分配教室和老师,满足课程需求同时利用率最高?

这些都能转成线性规划,用Matlab的linprog解决!是不是超实用?

结尾

今天从基础概念讲到实战案例,相信你已经掌握Matlab求解线性规划的方法!关键是把实际问题转成标准形式,然后调用linprog就行。建议你自己找个例子试试(比如运输问题),动手写代码才是最快的学习方式!遇到问题记得看Matlab帮助文档(输入help linprog),里面有更多参数和例子哦!

希望这篇文章对你有帮助,下次再见啦!

posted @ 2026-04-02 13:34  uxmaster25  阅读(16)  评论(0)    收藏  举报