Matlab linprog函数:手把手教你解线性规划问题

一、先搞懂:linprog是干嘛的?

简单说,linprog 是 Matlab 里专门用来解“线性规划”的工具。啥是线性规划?比如“生产多少产品能让利润最大”“用多少原料能让成本最低”——只要目标(利润/成本)和约束(原料限制/产量限制)都是“线性的”(比如 x1 + 2x2 ≤ 10 这种一次式),都能用它解决。

它的核心调用格式就一句话:
[x, val] = linprog(f, A, b, [], [], lb, ub)

先简单说下输出和输入是啥(后面逐个拆解开讲):

  • 输出
    • x:最终找到的“最优解”(比如生产x1=多少、x2=多少);
    • val:对应最优解的“目标函数最小值”(如果要最大化,后面要简单处理下,别急)。
  • 输入:一堆和“目标函数”“约束条件”相关的参数,咱们一个个说。

先看个完整样例,有个整体印象:
image.png

二、逐个拆讲:每个参数到底填啥?

1. f:目标函数的“系数向量”

f 是目标函数里,每个决策变量(比如x1、x2)前面的系数,注意:linprog默认求“目标函数的最小值”。如果你的问题是“求最大值”(比如最大利润),就得把系数改成负数,转成“求最小值”问题。

举个例子:
如果原问题是“最大化利润 = 40x1 + 30x2”,那转成linprog能处理的“最小化问题”就是“最小化 -40x1 -30x2”,所以 f 就是这两个系数组成的向量:

f = [-40; -30];  % 分号表示列向量,x1系数-40,x2系数-30

对应到目标函数的结构,看这张图更清楚:
image.png

2. A、b:不等式约束的“系数矩阵”和“常数项”

这俩是一对,用来描述“线性不等式约束”(比如 x1 - x2 ≤ 6240x1 + 120x2 ≤ 1200)。记住一个规则:linprog默认约束是 “A*x ≤ b”(A乘以x小于等于b),所以要把所有不等式都整理成这种形式。

怎么填A和b?
  • A:每行对应一个不等式的“变量系数”,列数和决策变量个数一致(比如x1、x2就是2列);
  • b:每一行对应一个不等式右边的“常数项”,是个列向量。

看例子里的约束条件和A、b的对应关系:
假设约束是这4个:

  1. x1 - x2 ≤ 6
  2. -x1 + 0x2 ≤ -1(可理解为x1 ≥ 1)
  3. 0x1 - x2 ≤ -1(可理解为x2 ≥ 1)
  4. 240x1 + 120x2 ≤ 1200

那A就是这4个约束的“变量系数”组成的矩阵,注意要转置(因为原写法是行向量,Matlab里需要列向量转成矩阵行):

A = [1,-1,0,240; 1,0,-1,120]';  % 转置符号'不能漏!转置后A是42

b就是这4个约束右边的常数,组成列向量:

b = [6; -1; -1; 1200];  % 4个常数,对应4个约束

看这张图,能直观看到约束和A、b的对应:
image.png

再看A转置后的结构(每行对应一个约束的系数):
image.png

b和约束的对应更直接,看这张:
image.png

最后确认A*x ≤ b的整体逻辑:
image.png

3. 中间两个[]:没有等式约束就填空

调用格式里,Ab后面有两个空的[],这俩位置是留给“等式约束”(比如 x1 + x2 = 5)的参数AeqBeq的。如果你的问题里没有等式约束(大部分简单问题都没有),就直接填[],不用写任何东西。

比如例子里没有等式约束,所以写成 [], []

4. lb、ub:决策变量的“上下限”

lb(lower bound)是每个决策变量的“最小值”,ub(upper bound)是“最大值”,都是列向量,个数和决策变量一致(x1、x2就是2个元素)。

举个例子:
如果x1和x2都是“非负”的(比如生产数量不能是负数),且没有最大限制(可以无限多生产),那:

lb = [0; 0];        % x1≥0,x2≥0(最小值都是0)
ub = [+inf; +inf];  % x1、x2无上限(inf是Matlab里的“无穷大”)

如果有上限(比如x1最多生产10),就把ub改成 [10; +inf] 就行。

三、结果怎么看?val到底是啥?

运行 [x, val] = linprog(...) 后,会得到两个结果:

  • x:比如x=[2;4],意思是“当x1=2、x2=4时,满足所有约束”;
  • val:这是linprog算出来的“目标函数最小值”。

这里要注意:如果之前为了“求最大值”把f的系数取了负(比如原目标是最大化40x1+30x2,f用了[-40;-30]),那val会是负数,实际的最大值就是val的相反数(比如val=-200,那最大利润就是200)。

四、所有参数一图览:记不住就看这个

最后放一张参数位置总结图,下次写代码时对着填就行,不用记顺序:
image.png

总结:用linprog的3个步骤

  1. 把问题整理成“线性规划”形式:明确目标函数(最大化转最小化,改f的符号)、不等式约束(整理成A*x ≤ b)、变量上下限;
  2. 按顺序填参数:f → A、b → 两个[](无等式约束)→ lb、ub;
  3. 运行函数,看x(最优解)和val(目标最小值),需要最大值就取val的相反数。

按这个流程走,不管是求最大利润还是最小成本,都能轻松搞定~

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IF'Maxue

爱意随风起,而你的打赏会变成风

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值