第三章 优化理论基础:线性规划、混合整数线性规划、非线性规划基础、求解器介绍

3.1 为什么优化理论是“多能互补”的基石?

做多能互补系统,说白了就是跟“不确定性”和“经济性”较劲。你想想看,光伏出力看天吃饭,储能充放电有寿命损耗,燃气轮机启停有成本,负荷侧还有各种用能需求……这么多变量搅在一起,怎么找到那个“最省钱”或者“最环保”的运行方案?

嗯,这就是优化理论要干的事。我个人习惯把优化问题拆成三块:目标函数(你想最大化什么?利润?还是可再生能源消纳率?)、决策变量(你能控制什么?机组启停?储能功率?)、约束条件(设备容量限制?功率平衡?)。这三块搭好了,剩下的就是数学求解的事。

核心观点: 优化不是“拍脑袋”,而是用数学语言把工程经验翻译成计算机能算的模型。

3.2 线性规划(LP)—— 入门级但最常用

线性规划,我理解就是“所有关系都是直线”。目标函数是线性的,约束条件也是线性的。比如你有一个微电网,光伏和储能联合供电,目标是让总运行成本最低。光伏发电成本几乎为零,储能放电有损耗成本,那最优解大概率是“光伏能发多少发多少,不够的再让储能补”。

我在项目中遇到过一个小型工业园区,用线性规划做日前调度,模型跑起来飞快,几秒钟就出结果。但要注意,线性规划要求变量是连续的,不能有“开/关”这种离散状态。

# 一个简单的线性规划示例(Python + PuLP)
from pulp import *

# 定义问题
prob = LpProblem("Min_Cost", LpMinimize)

# 决策变量(连续)
x1 = LpVariable("PV_Power", 0, 100)  # 光伏出力,0-100kW
x2 = LpVariable("Battery_Power", -50, 50)  # 储能功率,负值表示充电

# 目标函数:最小化总成本
prob += 0.1 * x1 + 0.2 * x2  # 假设光伏成本0.1元/kWh,储能成本0.2元/kWh

# 约束条件:功率平衡
prob += x1 + x2 == 80  # 负荷需求80kW

# 求解
prob.solve()
print(f"光伏出力: {value(x1)} kW, 储能出力: {value(x2)} kW")
避坑指南: 我曾经在建模时忽略了变量的上下界,结果求解器给了个负无穷的解。记住,所有物理量都有边界,别忘了加约束。

3.3 混合整数线性规划(MILP)—— 更贴近工程实际

线性规划有个硬伤:它处理不了“是/否”的问题。比如燃气轮机要不要启动?储能要不要在某个时段充电?这些都需要整数变量(0或1)。混合整数线性规划,就是在线性规划的基础上,允许部分变量取整数值。

你想想看,一个多能互补系统里,设备启停、档位切换、购售电状态……全是整数变量。所以MILP才是工程界的“主力选手”。我做过一个区域综合能源项目,包含CHP、电锅炉、储热罐,模型里有上百个整数变量,求解时间从几秒到几分钟不等。

变量类型 典型应用场景 求解难度
连续变量 光伏出力、储能功率、购电量 容易
整数变量(0-1) 机组启停、储能充放电状态 中等
整数变量(一般整数) 变压器档位、机组台数 较难
注意: MILP的求解时间会随着整数变量数量指数级增长。我建议你先把模型简化,能用连续变量就别用整数变量。比如储能充放电状态,有时候可以用“功率为正则放电,为负则充电”来隐式表达,省掉一个整数变量。

3.4 非线性规划(NLP)—— 更精确但更“难搞”

现实世界哪有那么多直线?设备效率随负载率变化、管道压降与流量平方成正比、电池内阻随温度变化……这些都是非线性关系。非线性规划就是用来处理这些“弯弯绕绕”的。

但说实话,我在实际项目中尽量回避非线性。为什么?因为非线性规划求解慢,而且容易陷入局部最优解。你辛辛苦苦建了个模型,结果求解器告诉你“找到了最优解”,但实际可能只是个局部最优,离全局最优差得远。

我的经验是:能线性化就线性化。比如把效率曲线分段线性化,或者用二进制变量表示不同工况。实在不行,再用非线性规划,而且一定要用全局优化求解器(比如BARON、SCIP)。

# 一个简单的非线性规划示例(Python + SciPy)
from scipy.optimize import minimize

# 目标函数:设备效率的非线性函数
def objective(x):
    return 0.5 * x[0]**2 + 0.3 * x[1]**2 + 0.1 * x[0] * x[1]

# 约束条件
def constraint(x):
    return x[0] + x[1] - 100  # 功率平衡

# 初始猜测
x0 = [50, 50]

# 求解
sol = minimize(objective, x0, constraints={'type': 'eq', 'fun': constraint})
print(f"最优解: {sol.x}")
个人经验: 非线性规划对初值非常敏感。我习惯先用线性规划算一个粗略解,再用这个解作为非线性规划的初值,这样收敛快得多。

3.5 求解器介绍—— 你的“数学引擎”

模型建好了,谁来算?求解器就是干这个的。市面上求解器很多,我按使用场景给你分个类:

  • 开源求解器: 适合学习和小规模问题。比如 PuLP(LP/MILP)、SCIP(MILP/NLP)、IPOPT(NLP)。优点是免费,缺点是求解大规模问题慢。
  • 商业求解器: 适合工程实战。比如 GurobiCPLEXMOSEK。速度快、稳定性好,但需要付费。我所在的公司买了Gurobi的学术版,算一个1000个变量、500个约束的MILP,通常几秒就搞定。
  • 专用求解器: 针对特定问题优化。比如 BARON 专攻全局非线性优化,HiGHS 专攻大规模线性规划。

我个人习惯是:先用开源求解器快速验证模型正确性,再用商业求解器跑正式结果。这样既省钱又高效。

一句话总结: 线性规划是基础,混合整数线性规划是主力,非线性规划是补充。求解器选对了,事半功倍。

3.6 本章知识体系图

下面这张图帮你理清本章的核心逻辑:

优化理论基础 线性规划 (LP) 混合整数线性规划 (MILP) 非线性规划 (NLP) 连续变量 · 线性约束 · 快速求解 整数变量 · 启停控制 · 工程主力 非线性关系 · 局部最优 · 谨慎使用 求解器:开源 (PuLP/SCIP) → 商业 (Gurobi/CPLEX)

3.7 本章小结

优化理论不是纸上谈兵,它是多能互补系统从“能运行”到“运行得好”的桥梁。线性规划帮你快速入门,混合整数线性规划解决工程中的离散决策,非线性规划处理更精细的物理模型。求解器则是你的“计算引擎”,选对了事半功倍。

嗯,这一章的内容就到这里。记住:模型是骨架,求解器是肌肉,工程经验才是灵魂。下一章我们会把这些理论应用到具体的多能互补场景中,到时候你会看到这些数学工具到底有多强大。