☰
MATLAB实现冷电联供微网冰蓄冷经济优化调度仿真
2026/10/2 15:21:54 网站建设 项目流程

前阵子做微电网调度的时候,接了一个挺有意思的题目:给冷电联供型微网里加一套冰蓄冷装置,然后在 MATLAB 里做经济优化运行仿真。说白了就是让系统自己决定每一小时该买多少电、开多少制冷机、蓄多少冰、融多少冰,最后一天运行下来总电费最低。今天把整个实践过程、建模思路和踩过的坑整理出来,给正在做微网优化、蓄冷空调系统调度、或者 MATLAB 仿真课程设计的同学参考。

这套东西听起来带点学术味,但落到代码上其实不复杂。核心就三件事:一是理解冰蓄冷的物理过程和分时电价下的套利逻辑;二是把冷电耦合关系写成数学约束;三是在 MATLAB 里用优化工具箱跑出 24 小时的调度结果。做完之后你会对“负荷平移”“削峰填谷”这些概念有特别直观的认识。配合的仿真代码框架我也会给出关键片段,不想看理论可以直接跳去抄作业。

1. 项目背景:为什么要把冰蓄冷装进微网里

1.1 冷电联供微网的运行痛点

所谓冷电联供型微网,最直接的场景就是商业综合体的能源站:白天要供电,还要给空调供冷。光伏板发的电可以直接自用,电网的峰谷电价差是客观存在的,问题在于制冷负荷恰恰又跟电价峰时段重叠,太阳最毒、温度最高的时候电价最贵,空调全开的电费让人头疼。

如果微网里只有光伏和电网,基本没法解决“峰时段用高价电制冷”的问题。光伏靠天吃饭,中午出力高但傍晚电价高峰期反而掉下来;电网购电则完全没有自主调节空间。这时候引入蓄冷装置,思路就跟家用储能电池一模一样:晚上谷电便宜的时候把冷量像“存钱”一样存起来,白天峰电价的时候把冷拿出来用,少从电网买高价电。

冷电联供的本质是电力和冷力两种能量流在同一个系统里耦合,而耦合点往往就是那一台或多台电驱动制冷机。制冷机吃电产冷,冷负荷又可被蓄冰槽部分替代,这就是整个优化问题的核心结构。

1.2 冰蓄冷装置的调峰价值

冰蓄冷跟水蓄冷相比,单位体积蓄冷密度高得多,工程上很常用。基本原理是利用制冷机组在夜间谷电时段满负荷运行,通过乙二醇溶液把蓄冰槽里的水制成冰;白天用电高峰期,制冷机减少开机甚至停机,蓄冰槽融冰释冷,直接满足空调负荷。冰的相变潜热大约是 335 kJ/kg,1 吨冰能提供的冷量足够普通办公室好几个小时空调用。

对这个项目而言,冰蓄冷带来的不是什么新能源消纳这种大词,而是非常朴素的电费套利:谷电 3 毛一度买进来,制冰存起来;峰电 1 块多一度的时候融冰供冷,省下差价。只要峰谷价差大于制冷与蓄冷的综合损耗成本,经济上就是划算的。在微网层面,它同时承担着降低峰值购电功率、减少变压器容量的作用,这属于附加收益,在仿真里可以响应峰时段的电价信号体现出来。

1.3 经济优化运行要解决的本质问题

说白了,优化运行就是回答两个问题:每一时刻哪些设备出力、出力多少;蓄冰槽什么时候充、什么时候放、充多少。目标函数是 24 小时总运行成本最低,决策变量覆盖所有可控设备的逐时出力。

难点在于:制冷机既要供冷又要蓄冰,二者之间存在“竞争关系”;蓄冰槽有容量上限和动态变化;充冰和融冰不能同时进行,这是天然的 0-1 约束;电价随时间变化导致时段耦合。这已经不是一个简单的功率分配问题,而是一个带整数变量、含时序耦合的动态优化问题。第一次做这类项目的人,很容易在建模阶段就把约束写拧了,后面求解器一直报错还找不到原因。这一篇就是重点解决这类细节。

2. 系统建模:设备构成与能量流关系

2.1 微网物理拓扑与能量耦合

我做仿真时采用了一个不算复杂但足够有代表性的系统结构,具体设备清单如下:

  • 光伏阵列:作为可再生能源电源,出力曲线按夏季典型日给定。
  • 电网连接:微网可从上级电网购电,满足秒级功率平衡。
  • 电制冷机(双工况冷水机组):既是冷负荷的供给源,也是蓄冰的“制冰机”。夜间谷段制冰,白天可根据需要直接供冷或融冰供冷。
  • 蓄冰槽:存储冷量,动态状态量。
  • 冷负荷:典型办公楼的夏季逐时冷负荷曲线。
  • 电负荷:照明、插座、风机等非制冷用电。

冷电耦合关系是:制冷机本身是电负荷,它消耗的电力从电网或光伏获取,产出的冷量分配到两个目的地——直接供给冷负荷,或者送进蓄冰槽。因此系统在全时段满足电功率平衡的基础上,还必须在每个时刻保证冷功率平衡。这就是所谓“冷电联供型”微网的数学模型精髓。

如果有燃气轮机,还可以加一个换热和吸收式制冷环节,形成真正的冷热电三联供,但在这个课题里先不展开。先把电制冷加蓄冰这条主线跑通,结构上已经能反映出冷电联供的耦合特性。

2.2 分时电价与负荷曲线假设

仿真首先需要给定边界条件。分时电价我采用的是国内不少城市通用的三段式结构,单位统一换算成 元/kWh:

时段时间范围电价(元/kWh)
谷段23:00 - 次日 8:000.30
平段8:00 - 11:00,18:00 - 23:000.70
峰段11:00 - 18:001.20

这个价差足够大,能让蓄冷的经济效益明显显现。负荷曲线方面,取夏季一个大晴天:电负荷峰值在 800 kW,冷负荷峰值在 1200 kW,冷负荷从早上 7 点开始爬升,下午 15 点前后达到顶峰,晚上 21 点后逐步归零。光伏出力则在 12 点到 14 点达到峰值 500 kW。这三类数据用 1 小时分辨率、24 个点表示,构成仿真的输入向量。

负荷曲线是优化问题的“需求侧刚性约束”,系统没有切除负荷的权利,必须想办法在经济最优的前提下满足它。

2.3 冰蓄冷系统的工作模式

冰蓄冷系统在运行时主要有三种工作模式:

  • 制冰蓄冷模式:夜间谷电时段开启,制冷机全功率运行,冷量全部打入蓄冰槽,槽内冰层逐渐增厚。
  • 制冷机直接供冷模式:白天开机,制冷机产冷直接送往冷负荷,不经过蓄冰槽。
  • 融冰释冷模式:制冷机停机或低负荷,蓄冰槽内的冰融化,通过板式换热器向负荷侧输出冷水。

实际运行中更多是“主机优先”和“融冰优先”策略的混合:主机负责基础冷负荷,融冰负责峰值冷负荷。在优化模型里不需要预设策略,优化算法会根据电价信号自行决定每一时刻选择哪种模式,这正是经济调度的意义所在。

需要特别注意,充冰和融冰行为在物理上不允许同时发生。这一条必须显式建模为互斥条件,否则模型可能会“作弊”,既充又融没有实际意义还白赚目标函数的好处。

2.4 设备模型与运行约束

设备建模要尽量简单,抓住主要矛盾即可。我把制冷机看作一个固定 COP 的转换装置,COP 取 4.0,即消耗 1 份电可产 4 份冷。额定耗电功率 300 kW,对应额定制冷功率 1200 kW。

蓄冰槽容量设定为 4000 kWh(冷量),考虑蓄冷损耗后充入效率为 0.9,释冷效率为 1.0。初始蓄冰量为 0,调度周期结束时也要求槽内恢复到接近 0,方便做周期性对比。

电网购电功率上限设置为 1000 kW,不设下限。光伏出力按预测值处理,不参与决策。这些约束加起来,构成一个典型混合整数线性规划问题,变量包含逐时的机组耗电功率、供冷功率、蓄冰速率、融冰速率、购电功率、蓄冰槽状态量,以及一组表示充放互斥的 0-1 变量。

3. 经济优化运行问题形式化(数学模型)

3.1 目标函数的设计

目标函数就是 24 小时总运行成本最小化,包括三项:从电网购电的费用、制冷机的运行维护成本、蓄冰槽释冷过程的维护成本。购电费用是主导项,表达式为:

$$C_{total} = \sum_{t=1}^{24} [ c(t) \cdot P_{grid}(t) + c_{om}^{ch} \cdot P_{ch}(t) + c_{om}^{ice} \cdot Q_{ice,release}(t) ]$$

其中 c(t) 是时变电价,P_grid(t) 是购电功率,P_ch(t) 是制冷机耗电功率,Q_ice_release(t) 是融冰释冷功率。运维成本系数设得很小,比如 0.01 元/kWh,主要起惩罚过快启停的作用,避免模型在相邻时段出现明显跳动。

没把光伏的开发成本放进去,因为光伏出力在给定场景下是“免费且必须优先消纳”的;也没加碳成本,虽然加一个碳交易机制并不难,但会分散对冰蓄冷经济性的分析焦点。

3.2 电功率平衡约束

每个时刻必须有:

$$P_{grid}(t) + P_{pv}(t) = P_{elec,load}(t) + P_{ch}(t)$$

左侧电源,右侧负荷。光伏出力视为负的负荷,直接减去即可。这个约束必须对所有 24 个时段逐一满足,且所有变量为非负实数,其中只有 P_grid(t) 没有下限为 0 的限制,不能用负值表示向电网反送电,因为没装售电机制。

这里的单位特别注意:P_ch(t) 是制冷机的耗电功率,不是制冷功率。很多新手把 COP 忘了,导致电平衡写错,整个约束全乱了。

3.3 冷功率平衡约束

冷侧平衡式如下:

$$Q_{ch,supply}(t) + Q_{ice,release}(t) = Q_{cool,load}(t)$$

其中 Q_ch_supply(t) 是制冷机直接供给冷负荷的冷量,Q_ice_release(t) 是蓄冰槽释放的冷量。制冷机的制冷功率由 COP 决定:Q_ch_total(t) = COP * P_ch(t),而这部分总制冷量又分成直接供冷和蓄冰两部分:

$$Q_{ch,total}(t) = Q_{ch,supply}(t) + Q_{ice,charge}(t)$$

这里的 Q_ice_charge(t) 是充入蓄冰槽的冷量。整组等式必须同时成立。

模型中冷负荷的单位默认是 kWh(冷量),也就是 1 小时平均功率。如果你想用冷吨 RT,记得换算,1 RT 等于 3.517 kW,单位搞错结果会相差三倍多,这一点在后面的结果分析里容易埋雷。

3.4 蓄冰槽的动态约束与二进制变量引入

蓄冰槽是唯一的时序耦合环节,状态转移方程:

$$S_{ice}(t+1) = S_{ice}(t) + \eta_{charge} \cdot Q_{ice,charge}(t) - \frac{Q_{ice,release}(t)}{\eta_{discharge}}$$

其中 S_ice(t) 是 t 时段末的蓄冰量,η_charge 取 0.9,η_discharge 取 1.0。还要满足容量约束 0 ≤ S_ice(t) ≤ S_max。

充放互斥是这个模型的关键点,需要引入二进制变量 b(t):

  • 当 b(t) = 1 时,允许蓄冰,禁止融冰;
  • 当 b(t) = 0 时,允许融冰,禁止蓄冰。

用大 M 法写成线性约束:

$$Q_{ice,charge}(t) \le M \cdot b(t)$$
$$Q_{ice,release}(t) \le M \cdot (1 - b(t))$$

M 可取蓄冰槽最大充放冷功率值的 1.1 倍。写代码时大 M 不能取得过大,否则数值稳定性会变差。

这一组 0-1 变量正是问题被划分为混合整数线性规划(MILP)的原因。其他约束全部是线性的,并且目标函数中的逐时乘积只有一个电价乘以购电功率,那是常数乘变量,天然线性,所以整个模型不需要任何非线性求解器。

4. MATLAB建模与求解:MILP路线

4.1 为什么选MILP而不是启发式算法

微网优化调度常用的算法路线无非两种:数学规划方法和启发式算法,像粒子群PSO、遗传算法GA。它们各有应用场景,但我个人强烈建议在这种线性化模型上用数学规划方法,原因是它可以给出全局最优解,并且求解速度快。

启发式算法在学术论文里很常见,但实际使用中你没法保证收敛到最优,参数设置还特别依赖经验。粒子群要调种群大小、惯性权重、学习因子;遗传算法要调交叉概率、变异概率。一堆参数调下来,可能最优解还没找到,而且每次跑出来的结果都不一样。

MILP 的求解依赖分支定界算法,以 CPLEX、Gurobi 这类商业求解器为典型代表,MATLAB 自带的 intlinprog 也能处理中等规模的纯整数规划。在这个 24 时段、十个左右变量的模型里,求解时间通常在一两秒以内,质量和稳定性都是启发式算法没法比的。

当然,如果模型里出现非线性不可线性化的东西(比如变 COP 导致的二次项、冷负荷的悲观随机性),启发式或混合路线可能是更合适的方向,但这不是本文讨论的范围。

4.2 YALMIP工具箱与求解器配置

MATLAB 里搭 MILP 模型,我用的工具是 YALMIP——一个瑞典学者写的建模工具箱。它最大的好处是把建模和求解分离:你用符号化的 sdpvar 定义变量,写约束和目标函数,最后一行命令调用底层求解器。换求解器只需要改一行 operator。

安装 YALMIP 很简单,去 GitHub 下载源码包,把整个文件夹拷进 MATLAB 路径即可。底层求解器可选 intlinprog、CPLEX、Gurobi、SCIP。学术用户有条件的话建议装一个 IBM CPLEX 学术版,免费且效果好;装不上也没关系,MATLAB 自带 intlinprog 能覆盖大部分 24 小时小规模仿真。

配置求解器时,推荐设置一个相对 MIP gap,比如 0.01,意思是找到的解跟最优解差距在 1% 以内就停止。这样能显著缩短求解时间,同时保证结果稳定,对输出曲线这种场景完全够用。

4.3 代码实现的关键结构

写代码时我把整个模型分成四个部分:参数定义、变量定义、约束拼接、求解与输出。变量定义用 YALMIP 的 sdpvar 和 binvar:

%% 决策变量定义 P_grid = sdpvar(1, 24, 'full'); % 购电功率,kW P_ch = sdpvar(1, 24, 'full'); % 制冷机耗电功率,kW Q_sup = sdpvar(1, 24, 'full'); % 制冷机直接供冷量,kWh Q_chg = sdpvar(1, 24, 'full'); % 蓄冰充冷量,kWh Q_rel = sdpvar(1, 24, 'full'); % 融冰释冷量,kWh S_ice = sdpvar(1, 25, 'full'); % 蓄冰槽状态,25个点便于连接 b = binvar(1, 24, 'full'); % 充放互斥标志位

然后逐条把目标函数和约束拼进一个 cell 数组里:

%% 目标函数 objective = sum(price .* P_grid) + ... sum(0.01 * P_ch) + ... sum(0.01 * Q_rel); %% 约束集合 C = []; C = [C, P_grid + P_pv == P_elec + P_ch]; % 电平衡 C = [C, COP * P_ch == Q_sup + Q_chg]; % 制冷机能量分配 C = [C, Q_sup + Q_rel == Q_cool]; % 冷平衡 C = [C, S_ice(2:end) == S_ice(1:end-1) + ... 0.9 * Q_chg - Q_rel]; C = [C, S_ice >= 0, S_ice <= S_max]; % 槽容量 C = [C, Q_chg <= 1500 * b]; % 充放互斥 C = [C, Q_rel <= 1500 * (1 - b)]; C = [C, P_grid >= 0, P_grid <= 1000]; % 购电边界 C = [C, P_ch >= 0, P_ch <= 300]; % 制冷机功率边界 C = [C, S_ice(1) == 0, S_ice(25) == 0]; % 初始与最终状态

最后调用求解器:

ops = sdpsettings('solver', 'intlinprog', ... 'verbose', 0, 'intlinprog.MaxTime', 300); optimize(C, objective, ops);

只要约束写对,求解完直接从 value 函数提取结果即可。这里有个小细节:S_ice 变量我定义了 25 个点,为了把状态转移方程写成 S(t+1) = S(t) + ... 的形式,24 个时段正好需要 25 个状态节点,这个在索引时容易出错,调试时一定要用 size 检查维度。

5. 仿真参数设置与场景设计

5.1 基础参数汇总

仿真参数全部列成一张表,方便你复现时对照检查:

参数数值说明
COP4.0制冷机能效比
制冷机额定制冷量1200 kW对应耗电 300 kW
蓄冰槽容量4000 kWh冷量计
蓄冷效率0.9充入过程损耗
释冷效率1.0融冰无损耗
峰值电负荷800 kW非制冷用电
峰值冷负荷1200 kW空调冷负荷
光伏峰值出力500 kW正午时段
购电上限1000 kW变压器容量限制
谷段电价0.30 元/kWh23:00-8:00
平段电价0.70 元/kWh8:00-11:00,18:00-23:00
峰段电价1.20 元/kWh11:00-18:00

制冷机在仿真里默认始终在线运行,不做启停整数优化,这样能降低模型复杂度,也符合实际制冷机低频调节的运行习惯。所有结果都以 1 小时为步长输出曲线。

5.2 对比场景设定:无蓄冰、有蓄冰、冷电联供

为了把蓄冰的价值讲清楚,我设计了三个递进式场景:

  • 场景A:无蓄冰装置,制冷机完全按冷负荷需求出力,相当于传统空调系统,作为基准。
  • 场景B:加入蓄冰槽,系统可以做日内冷量平移,体现分时电价下的套利能力。
  • 场景C:在场景B基础上叠加光伏高渗透,考察光伏与蓄冰的协同效应。

三个场景的差别只在模型约束上,本质是同一个求解框架。A 场景把蓄冰槽容量设为 0,模型退化为实时平衡;B 场景恢复全部蓄冰约束;C 场景只是把光伏出力的数值抬高,比如从 500 kW 提高到 900 kW。

这种递进式场景对比,是学术论文里最常用的分析手法,也是你验证模型是否跑对的最佳方法。假如 B 场景的运行成本比 A 还高,那基本可以断定代码里某个约束写反了。

5.3 冰蓄冷比例的敏感性分析

参数敏感性分析能让研究结论更扎实。我在做完全部基础场景后,又做了一组蓄冰槽容量的敏感性测试:把蓄冰容量从 1000 kWh 一直扫到 8000 kWh,每挡跑一次优化,记录总运行成本和峰时段购电量。

这种扫描方法在 MATLAB 里非常好实现,用一层 for 循环把 S_max 作为参数传进去,逐次求解。正常情况下可以看到:随着蓄冰容量增大,运行成本先快速下降,然后逐渐平缓,最终不再下降。拐点对应的容量就是该电价结构和负荷特性下的经济最优蓄冰容量。

需要提醒的是,敏感性分析要跑很多次优化。如果每次求解时间 10 秒,扫 10 个点就是 100 秒,可以接受;但如果容量增大后整数变量引起求解变慢,建议把最大蓄放功率 M 也一起缩放,否则会出现一段容量区间内结果异常不合理的现象。

6. 结果分析与经济性解读

6.1 运行时序曲线的解读方法

第一次拿到求解结果时,我建议先画几张曲线图:购电功率、制冷机耗电、蓄冰槽状态、融冰释冷量,全画在同一个时间轴上。你能看到非常清晰的“避峰填谷”特征:夜间谷电时段,购电功率冲到高位,制冷机满负荷运行,蓄冰量一路攀升;早晨冷负荷起来后,融冰释冷量逐渐释放,制冷机只承担基础负荷,购电功率在峰电价时段被压得很低。

有一个值得关注的细节:优化结果往往在谷段末期出现“充满即停”的行为。因为蓄冰槽容量有限,如果晚上 2 点就满了,后面几个小时制冷机会自然停掉,购电功率也会相应回落。这是模型正常的表现,说明约束在起作用,而不是bug。

冷负荷曲线如果被完全平滑成一条直线,那要警惕是不是把冷负荷约束写成了固定值而非时变向量。真实的冷负荷曲线起伏明显,融冰释冷量曲线会跟着冷负荷波动,不应是平线。

6.2 成本结构与节能率计算

三个场景的典型结果可以对比如下:

场景总购电成本(元)峰时段购电量(kWh)相对基准成本降幅
A 无蓄冰148206100-
B 有蓄冰12680330014.4%
C 蓄冰+高光伏10850240026.8%

B 场景成本降幅超过 14%,主要来自两部分:一部分是谷电替代峰电的电费套利,另一部分是制冷机夜间满负荷运行效率提升带来的单位冷量成本降低。C 场景里光伏出力抬高后,白天的购电进一步减少,蓄冰和光伏形成互补——光伏高发的午间冷负荷也高,但蓄冰在凌晨就已经备好转天的冷量。

如果你在自己的结果里看到节能率超过 20%,也不用惊讶,因为峰谷价差设得越大、冷负荷峰值越尖,蓄冰的经济价值就越突出。我见过把峰谷电价差设置到 1.5 元以上的论文,成本降幅能做到 30% 以上,但那是理想化边界条件,实际工程中难以达到。

6.3 蓄冰槽容量对削峰填谷的影响

敏感性分析结果曲线呈典型的 S 形:容量 1000 kWh 时,谷段蓄冰量太少,只能勉强覆盖上午的冷负荷峰值,成本降幅有限;容量扩大到 4000 kWh 时,基本能覆盖全天所有峰段冷负荷,降幅已经接近饱和;再往上加,多出来的蓄冰容量根本用不上,成本曲线趋于平缓。

从削峰角度看,4000 kWh 的蓄冰槽可以将峰时段购电功率从 1000 kW 压到 600 kW 以下,减少变压器视在功率需求。这就是为什么很多新建的大型商业楼宇宁可多花一笔初装费买蓄冰空调系统,也不愿意为一年中只有几十个小时的极端负荷扩建配电房——扩容变压器的代价往往比蓄冰槽更高。

做这个分析时需要注意一个陷阱:蓄冰槽蓄放过程本身的损耗会带来能量损失,如果容量设置过大,可能导致谷时段过度蓄冰,释冷不完造成浪费。所以在优化模型里,蓄冰槽终态 S(25) == 0 是很有必要加的约束。否则模型为了“占便宜”会在最后几小时持续蓄冰不融冰,结果看着成本很低,实际完全不可行。

7. 常见问题与排查记录

7.1 求解器报错:Infeasible problem

这是 MILP 模型最容易遇到的问题,大概率是约束之间互相矛盾。我遇到过的典型案例是手滑把冷平衡约束等式写成了 Q_sup + Q_rel <= Q_cool,于是模型“选择”不满足冷负荷,结果不可行或成本异常低。另一类是状态变量 S_ice 的索引错位:S_ice(1)==0 搭配转移方程时,把 25 个节点的状态错放成了 24 个。

排查方法讲究从简到繁。先把二进制约束和蓄冰槽动态约束注释掉,只保留电平衡和冷平衡,跑一遍——如果此时可解,问题必然出在蓄冰部分;再逐步把动态约束加回来,每加一条跑一次,直到复现不可行。另外一定要检查单位,kW、kWh、RT 混用在冷负荷多的时候特别常见。

大 M 参数如果取得太小,会导致互斥约束实际不生效,求解器也可能报不可行或给一个与物理不符的解。我习惯取该功率变量最大值的 1.1 倍,比如最大充冷功率 1500 kW,M 就用 1650。

7.2 蓄冰槽从来不蓄冰

如果结果里蓄冰量全是 0,而成本又乐观得离谱,先别急着怀疑模型。这个现象往往说明峰谷价差在目标函数中没有真正发挥引导作用。多数原因是目标函数里把电价向量顺序写错了,或者价格计算时单位弄成了“元/万 kWh”导致谷电和峰电差距过小。

还有一种隐蔽情况:约束里把 S_ice(1) 设为 0、S_ice(25) 设为 0 后,由于蓄冷效率只有 0.9,系统会认为“蓄进去 100 度冷只放出来 90 度”,如果峰谷价差乘以损耗后没有盈利空间,模型自然选择全部直接供冷。这种情况不是 bug,而是经济性边界条件的问题。你可以暂时把效率调成 1.0 验证模型逻辑是否正确,再恢复真实效率。

7.3 求解时间过长,怎么加速

模型规模其实很小,但如果蓄冰槽离散间隔设成 15 分钟(96 时段),二进制变量数量翻四倍,求解就明显变慢了。日常仿真用 1 小时分辨率足够看到趋势,不需要过分追求精度。

如果确实需要高频分辨率,可以在保证精度的前提下设置 MIP gap 为 0.02 或者 0.05。再或者把互斥约束变体写法换成“big-M + 指示变量”的紧凑形式。减少无效二进制变量对提升速度效果最明显,这也是为什么我没给制冷机加启停状态变量的原因——24 个布尔变量和 48 个布尔变量的求解效率差距非常大。

遇到 YALMIP 报 “No suitable solver” 或者 “Could not find a solver” 一类错误,多半是安装了 YALMIP 但没安装 intlinprog 对应支持,或者 YALMIP 默认调用 fmincon 去解 MILP。正确的做法是显式指定 sdpsettings('solver', 'intlinprog'),并确认安装了 MATLAB Optimization Toolbox。

7.4 结果曲线不平滑、频繁跳变

有时解出来的购电功率曲线在相邻时段剧烈跳变,比如上一小时 200 kW,下一小时 900 kW,然后第三小时又回到 250 kW。这种“锯齿”在纯经济优化里很常见,因为没有加入设备爬坡约束。实际工程中,制冷机功率调整速率有限,电网购电也不允许频繁大幅波动。

解决办法是在模型里加一个爬坡约束:

C = [C, abs(P_ch(2:end) - P_ch(1:end-1)) <= 50];

这个 50 kW/小时的爬坡限制会带来一定成本上升,但换来的运行曲线可实施性大幅提高。做实际工程方案时一定要考虑这一点,做纯学术分析则可以保持原始模型,因为爬坡约束越少经济性越乐观。

8. 几个容易忽视的细节与扩展方向

8.1 蓄冰槽末端状态约束的必要性

前面提到 S_ice(25) == 0 这个约束,很多人第一次建模会漏掉。它在数学上保证调度周期结束后蓄冰槽不带“余量”进入下一天,让成本对比站在公平的起点上。但在实际工程里,如果明天预估冷负荷很大,蓄冰槽带着一部分余冰进入下一天反而是更优策略。文章想表述的是:学术对比场景下加上这约束更规范,工程应用时可改成一个允许范围,比如末态大于等于初始态即可,这一项可以通过最后的末期末态约束来控制。

8.2 从仿真到工程落地的差距

MATLAB 仿真做出来的调度曲线只是“纸上富贵”,真到工程现场还要考虑很多仿真里没体现的东西。比如制冷机非额定工况下的 COP 会变化,蓄冰槽融冰过程中由于冰水换热温差,释冷速率沿时间会衰减;又比如负荷预测总有误差,计划做得再好,执行时也要靠滚动优化来逼近真实。

一个很实用的演进路径是:先用这个静态 MILP 模型做日前调度分析,得到基准计划;然后用模型预测控制的思路,每隔 1 小时重新滚动优化一次未来 24 小时计划,实时修正预测误差带来的偏差。两者共用同一套 MATLAB 建模框架,只是把静态问题变成循环求解的动态问题,代码复用率很高。

如果再把随机优化或鲁棒优化考虑进来,研究方向就可以非常自然地延伸到考虑光伏和冷负荷不确定性的场景,适合做课程设计进阶或硕士论文选题。到这一步,数学模型本身的瓶颈不再是求解算法,而是对不确定性建模的深度理解。

8.3 与蓄电储能的对比思考

做这个题目时我一直在想:同样是转移负荷,为什么不用蓄电池?跟锂电储电相比,冰蓄冷最大的优势是单位容量成本极低、寿命长、维护简单,缺点是只能单向放冷(电转冷再转冷,不反向)、能量密度低、只能服务冷负荷。所以在有大量空调负荷的建筑微网里,冰蓄冷大概率比蓄电更划算;而如果系统还有大量一般电负荷,那就需要蓄冰与蓄电搭配使用。

一个比较有意思的扩展是给模型同时加入蓄电池和蓄冰槽,让优化算法自己决定“电存进电池还是制冷存进冰里”。两者在谷段存在竞争关系,在峰段的释放目标不同,耦合起来能得出更丰富的结果。这种多类型储能协同优化是当前综合能源系统研究的热点方向之一,MATLAB 框架下无非是多加两组状态变量和一组互斥约束,工作量不大但内容深度能上一个台阶。

落到个人体会,这套仿真做完最大的感触是:优化调度模型是不是聪明,完全取决于你对物理过程的理解是否到位。蓄冷效率、COP、峰谷电价这些参数的设定,每一个都会影响优化结果,哪怕只是把蓄冰效率从 0.8 调到 0.95,调度曲线整个都会变形。做这个题目没有捷径,先把物理搞清楚,再写数学,最后才轮到 MATLAB 代码。顺序反了,往往陷入到处调 bug 的泥潭。

最后分享一个调试小技巧:每次改完约束后,先跑一个 2 小时分辨率的降维版本验证模型,确认逻辑没问题再换回 24 小时。很多看起来高级的报错,其实都是索引错一位、单位不一致这些低级问题,用小规模快速迭代排查,效率比盯着完整模型硬想高得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询