数学基础回顾:线性规划(LP)与混合整数线性规划(MILP)

各位同学,咱们今天聊点硬核的。做储能调度,说白了就是跟数学规划打交道。你想想看,电池什么时候充、什么时候放、充多少、放多少——这些问题背后,全是线性规划和混合整数线性规划在撑腰。

我记得刚入行那会儿,带我的老工程师扔给我一句话:「小伙子,搞不懂LP和MILP,你就别碰储能调度。」当时我还不太服气,后来踩了几个坑才明白——这话一点不夸张。

线性规划(LP)是个啥?

线性规划,说白了就是在一堆线性约束下,找一个线性目标函数的最优解。嗯,听起来有点绕,我换个说法。

你手里有100度电的储能容量,电价低谷时买电存着,高峰时卖出去赚差价。你该怎么操作?这就是一个典型的线性规划问题。

它的数学形式长这样:

目标函数:min/max  c₁x₁ + c₂x₂ + ... + cₙxₙ
约束条件:a₁₁x₁ + a₁₂x₂ + ... + a₁ₙxₙ ≤ b₁
          a₂₁x₁ + a₂₂x₂ + ... + a₂ₙxₙ ≤ b₂
          ...
          x₁, x₂, ..., xₙ ≥ 0

这里面,x是决策变量,c是成本系数,a和b是约束参数。所有关系都是线性的——没有x²,没有sin(x),干干净净。

核心要点:LP要求所有变量都是连续的,可以是任意实数。比如充电功率可以是50.5kW,放电深度可以是73.8%。

混合整数线性规划(MILP)又是什么?

现实世界哪有那么理想?你想想看,储能系统里有些东西是不能连续的。

比如,一台发电机要么开着要么关着,没有「半开半关」的状态。再比如,你只能整台整台地投切储能柜,不能投0.7台。这时候,就需要整数变量登场了。

MILP就是在LP的基础上,允许部分变量取整数值。它的形式是:

目标函数:min  cᵀx + dᵀy
约束条件:Ax + By ≤ b
          x ≥ 0, 连续变量
          y ∈ {0,1,2,...}, 整数变量

我在项目中遇到过最典型的场景:储能系统有充放电两种模式,但同一时刻只能选一种。用MILP表达就是引入一个0-1变量y:

P_charge ≤ M × y
P_discharge ≤ M × (1 - y)
y ∈ {0,1}

y=1时只能充电,y=0时只能放电。简单粗暴,但非常有效。

我的经验:MILP比LP难解得多。LP用单纯形法几秒钟搞定的事,MILP可能跑几个小时。所以建模时,能不用整数变量就别用。我曾经把一个MILP问题硬改成LP,求解时间从2小时降到了3秒——代价是精度损失了不到1%。

目标函数的建模方法

目标函数就是你想要优化的东西。在储能调度里,常见的有这么几种:

目标类型 数学表达 实际含义
最小化运行成本 min Σ(c_buy × P_buy - c_sell × P_sell) 购电成本最低,售电收益最高
最大化收益 max Σ(电价 × 放电量 - 电价 × 充电量) 峰谷套利最大化
最小化碳排放 min Σ(碳排放系数 × 购电量) 环保优先
最小化峰值负荷 min max(P_load - P_discharge) 削峰填谷

我个人习惯把目标函数拆成两部分:收益项和成本项。收益项前面加负号,统一成最小化问题。这样求解器处理起来更顺手。

约束条件的建模技巧

约束条件才是真正考验功力的地方。我见过太多人,目标函数写得漂亮,约束条件一塌糊涂,结果算出来的方案根本没法用。

储能调度里常见的约束有:

  • 功率约束:充放电功率不能超过额定值。0 ≤ P_charge ≤ P_max, 0 ≤ P_discharge ≤ P_max
  • 容量约束:SOC(荷电状态)不能越界。SOC_min ≤ SOC ≤ SOC_max
  • 能量守恒:SOC的变化等于充放电量的累积。SOC(t+1) = SOC(t) + η_charge × P_charge - P_discharge / η_discharge
  • 互斥约束:同一时刻不能既充又放。前面用0-1变量处理的那个就是
  • 爬坡约束:功率变化不能太快。|P(t+1) - P(t)| ≤ ramp_rate

避坑指南:我曾经在项目里忘了加SOC的初始条件和终止条件。结果求解器给出的方案是:第一天把电放光,最后一天再充满。这在数学上完全正确,但实际运营中根本行不通。记住,一定要加上SOC(0) = SOC_start 和 SOC(T) = SOC_end。

一个完整的储能调度模型示例

咱们来看一个简化版的模型。假设有24小时的电价数据,一个储能系统,目标是最大化收益。

# 决策变量
P_ch[t] ≥ 0  # t时刻充电功率
P_dis[t] ≥ 0  # t时刻放电功率
SOC[t] ≥ 0    # t时刻荷电状态
y[t] ∈ {0,1}  # 1充电,0放电

# 目标函数:最大化收益
max Σ (电价[t] × P_dis[t] - 电价[t] × P_ch[t])

# 约束条件
# 1. 功率限制
P_ch[t] ≤ P_ch_max × y[t]
P_dis[t] ≤ P_dis_max × (1 - y[t])

# 2. SOC动态
SOC[t+1] = SOC[t] + η_ch × P_ch[t] - P_dis[t] / η_dis

# 3. SOC边界
SOC_min ≤ SOC[t] ≤ SOC_max

# 4. 始末条件
SOC[0] = SOC_init
SOC[24] = SOC_end

这个模型看着简单,但实际项目里,光约束条件就能写上百行。你想想看,加上多台储能、光伏出力不确定性、需求响应信号……复杂度一下子就上去了。

知识体系总览

下面这张图,是我自己梳理的LP和MILP在储能调度中的应用框架。你看一眼,心里就有谱了。

储能调度中的LP与MILP知识体系 储能调度优化问题 线性规划(LP) 混合整数线性规划(MILP) 连续变量 线性约束 0-1变量 整数变量 功率分配优化 SOC轨迹规划 启停状态决策 设备投切 求解方法:单纯形法 | 分支定界法 | 割平面法 | 内点法 常用工具:Gurobi | CPLEX | GLPK | PuLP | CVXPY

这张图把LP和MILP在储能调度里的关系理清楚了。你从上往下看,先确定问题类型,再选变量和约束,最后找求解工具。每一步都有对应的数学方法支撑。

我的建议:刚开始学的时候,别急着上MILP。先用LP把问题跑通,看看结果合不合理。等LP模型稳定了,再逐步加入整数变量。这样调试起来轻松得多,也不容易出bug。

好了,这一章的内容就到这儿。LP和MILP是储能调度的基本功,你把它吃透了,后面那些复杂的调度策略、多目标优化、鲁棒优化,学起来就顺风顺水了。


公众号:蓝海资料掘金营,微信deep3321