☰
风光互补制氢合成氨系统容量与调度联合优化的Matlab+Cplex实现
2026/10/7 12:03:28 网站建设 项目流程

先说说我对这个项目的直觉理解。最近花了两周时间完整复现了一套“风光互补制氢合成氨系统容量-调度联合优化”的Matlab代码,求解器选择的是Cplex。这个题目看起来是化工+电气交叉的规划问题,本质上还是在做一件事:在风、光资源波动的前提下,用最优的投资和运行策略,把电变成氢、把氢变成氨,并回答“装多少风机/光伏/电解槽/储氢罐最划算”。文章面向的是新能源制氢、综合能源系统优化、以及想学习Yalmip+Cplex建模的同学。我会把模型设计、目标约束、Matlab调用Cplex的细节、并网和离网两种场景的对比结果、以及复现时容易踩的坑都写出来,尽量让看的人少走弯路。

1. 项目核心与整体设计思路

1.1 风光互补制氢合成氨系统到底在优化什么

这种系统的物理结构其实不复杂:风电和光伏出力,电解槽耗电制氢,氢气进入合成氨装置,和氮气反应生成氨。氨可以作为化工产品卖,也可以当作储氢介质存储和运输。但真正落地的时候,问题就来了:风机装多少台、光伏铺多少兆瓦、电解槽额定功率取多大、储氢罐要不要配、配多大,这些容量参数直接决定初始投资;而装机选定之后,春夏季风光大发、秋冬季资源不足时,每小时该怎么调电解槽功率,储氢罐什么时候充什么时候放,又决定了全年的运行费用。

所以“容量-调度优化”合在一起的含义是:既要回答“装多少”,也要回答“怎么用”。这两个问题不是独立的——容量配大了,调度有余地但投资高;容量配小了,调度只能频繁靠电网买电(并网场景)或者切负荷(离网场景)。把这二者放进同一个优化模型里,用Cplex一次性求全局最优,就是这套代码的核心工作。如果你只做容量优化而不模拟时序调度,算出来的设备利用率往往是虚高的;如果你只做调度优化而不考虑装机,又回答不了规划问题。这种联合优化在工程上很有价值,但也比单一优化问题多了一个维度的复杂度。

1.2 并网与离网两种场景的本质差异

标题里“并_离网”需要拆开理解。并网场景下,系统和大电网相连,允许从电网购电,也允许本地多余的电上网卖给电网。大电网相当于一个“无限容量的后备蓄电池”,缺电时买就行,富余时还能卖,所以风机和光伏的装机不用追求极高可靠性,只要综合电价算下来有经济性就可以了。离网场景则完全切断了电网依赖,所有电能必须来自风、光、储能和储氢内部平衡。这个约束极大地改变了系统设计:离网方案不得不多装风、光设备,也要配更大的储氢罐,因为一年365天中总有几天风光出力都很低,系统必须靠之前攒下来的氢“扛”过去。

放到模型里,并网和离网的区别主要体现在电功率平衡约束上。并网约束是:

风电出力 + 光伏出力 + 购电功率 = 电解槽耗电 + 其他电负荷 + 售电功率

离网约束则直接变成:

风电出力 + 光伏出力 = 电解槽耗电 + 其他电负荷 + 弃电功率

弃电在离网系统中成为显式变量,并且它是允许的。这看起来像浪费,但实际上是为了避免无限扩大储能容量去“吃掉”那些极端时刻的多余电力——因为储氢和储电的设备成本远高于偶尔弃掉一些电。复现时必须先把这个场景开关理清楚,我见过很多版本代码其实只实现了并网或只实现了离网,改个约束类型没改干净,结果对不上。

1.3 为什么选择Cplex做求解器

这个问题我在网上搜了很多“Cplex 配置 Matlab”的热门内容,也实际在多个求解器之间对比过。这类容量-调度优化模型一般会形成混合整数线性规划(MILP),因为风机台数、设备启停往往需要整数变量。Matlab自带的linprog只能解纯线性连续问题,fmincon适合非线性但容易陷入局部最优,ga和粒子群就更不用说了——跑一次要好几个小时,而且不能保证全局最优。

Cplex是IBM的商用数学规划求解器,对MILP的求解非常强,支持分支定界、割平面、启发式算法等一整套优化引擎。实际用起来,同一份模型,Cplex求解时间可能只有fmincon的几十分之一,而且能给出最优性间隙(gap),工程上你完全清楚当前解离最优还有多远。配合Matlab下的Yalmip工具箱之后,建模几乎不用手动拼矩阵,直接用sdpvar/intvar声明变量,写目标函数和约束的语法和数学表达式差不多。下面谈具体建模时我会给出代码骨架。

2. 优化模型搭建与关键数学表达

2.1 容量变量与调度变量的定义

先把变量分清楚。按照我的实现习惯,把决策变量分成三大块:

第一块是容量变量,也就是“一次性投资决策”。风机台数、光伏装机容量、电解槽额定功率、储氢罐容量、储氨罐容量,甚至要不要配置电化学储能电池,都属于这一类。在模型中它们不以时间为维度,只出现一次。风机台数用整数变量,其他容量用连续变量就好,不必强制取整,尤其光伏装机单位是kW,连续变量更符合实际采购粒度。

第二块是时序变量,也就是“每小时调度决策”。风电出力、光伏出力、电解槽耗电功率、氢气产量、合成氨消耗氢气流量、储氢罐储量、弃电功率,全部是T个时段一一对应的变量列向量。如果典型日按24小时划分,那就是1×T的向量;如果做全年8760小时,就是1×8760,规模会指数级增长。

第三块是场景特有变量。并网场景下,电网购电功率/售电功率各是一个1×T向量;离网场景则没有这个变量,相应多出弃电变量。储电设备如果有,还需要引入电池SOC(荷电状态)变量。

这三类变量之间通过目标函数和约束耦合在一起,容量变量决定了时序变量的上界和成本系数,时序变量反过来限制容量变量的收益。可以拿下面这张表快速理解:

变量类别示例维度类型
容量变量风机台数、光伏装机、电解槽功率、储氢罐容量标量int/continuous
时序变量风电出力、电解槽耗电、产氢量、储氢量1×Tcontinuous
场景变量购电功率、售电功率、弃电功率1×Tcontinuous

2.2 目标函数:成本最低还是碳减排优先

大多数此类模型的默认目标是年化总成本最小。它包含四块:

一是一次性投资的等年值成本。风机、光伏、电解槽、储氢罐都有各自的单位投资成本,把总投资乘以资金回收系数CFR折算成年值,这样再和每年的运行成本相加。CFR = r/(1-(1+r)^(-N)),其中r是折现率,N是设备寿命。这个系数很好写,但要注意风机、电解槽、储氢罐的寿命不同,最好分开折现。

二是年运行维护成本。通常按设备投资成本的一定比例估算,比如风机的运维成本占初始投资的2%到3%,电解槽运维占5%左右。简单实现可以用“单位功率运行成本×装机容量”或“单位产氢量成本×年产氢量”近似。

三是电网交互成本。这是并网场景独有的。如果当地采用分时电价,那么购电和售电价格都要分时段给,典型日模型里就是一个1×T的电价向量。目标函数中会出现sum(price_buy.*P_buy) - sum(price_sell.*P_sell)。如果P_buy和P_sell直接用同一个变量P_grid正负表示,就需要额外处理非线性项,所以我更推荐把购电和售电拆成两个非负变量,加上互斥约束(同一时刻不同时大于0),这样Cplex处理起来更快。

四是原料成本。合成氨需要氮气,如果直接买氮气或买氨气补充,就把采购费用加进去;如果是空气分离制氮,则计入空分设备的运行耗电和投资。大部分简化模型不单独建空分,直接把氮气视作免费供应,只要约束合成氨的氢氮比例即可。

如果项目要求考虑碳排放,也可以把碳排放量乘以碳税后加进目标函数。但这里提醒一下:加入碳约束后,模型可能从线性变成非线性,尤其是考虑CCS(碳捕集)时,能不用尽量暂缓,第一步先把经济模型跑通。

2.3 约束条件:能量平衡、设备运行边界、氢氨耦合

约束是整套代码最容易出错的地方。我按模块拆开说。

电功率平衡约束是全局约束。并网为我前面写的五方平衡式,离网则是四方平衡。注意如果系统里还有公共设备用电(BOP、照明、控制),也要单列电负荷项,否则最后单位设备耗电不完整,结果和实际工程差别很大。

电解槽约束:运行功率要处于最大装机和最小技术出力之间,通常最小技术出力为额定容量的20%到40%,过低氢氧分离器无法稳定运行。产氢量可以用线性公式:

H2_prod = eta_el / HHV_H2 * P_el

eta_el是电解槽效率,HHV_H2是氢气高位热值,简化计算单位取kWh/kg,一般常温常压电解效率在0.6~0.75之间。Cplex里这个公式写成Equality约束就好。

储氢罐动态约束:储氢罐的当前储量等于上一时刻储量加上产氢量减去进入合成氨装置的氢量。为了建模方便,我通常构造一个T+1维向量H2_storage(0:T),其中第一个点是初始储量,最后一个点用来约束末尾储量,比如等于初始储量或大于某个安全阈值。否则模型会把储氢罐“偷空”或“偷满”,只优化目标却没法保证周期循环。很多初学的人在这里栽跟头。

合成氨装置约束:氨合成的化学反应是严格的,简化模型可以按照氢氨质量比0.18来折算。也就是说,生产1吨氨大约需要0.176吨氢气。如果做全年调度,还可以考虑氨罐库存作为季节性缓冲,即秋天风光好时多产氨存起来,冬天风光差时少产甚至停产。这部分加上约束后,问题的经济和物理意义就完整了。

表格式总结一下关键约束:

约束类型数学表达(简化)说明
电功率平衡P_w+P_pv+P_buy = P_el+P_load+P_sell离网去掉P_buy/P_sell加P_curtail
电解槽出力P_min<=P_el<=P_max实际工程注意最小出力和爬坡
储氢动态E(t+1)=E(t)+H_prod-H_amm周期循环需首尾衔接
合成氨产量H_amm >= r_NH3*0.176日/周产量需求下限
容量上界0<=N_w<=N_w_max等给求解器合理搜索空间

3. Matlab环境下Cplex求解的实现细节

3.1 环境准备:Matlab+Cplex配置实战

配置Cplex到Matlab是复现的第一道门槛。网上关于“Cplex配置到Matlab”的热门搜索很多,但配置步骤核心就三步。

先要安装IBM ILOG CPLEX Optimization Studio。装的时候选择带有Matlab接口的版本,例如CPLEX 12.10或22.1。安装包比较大,装完会生成一个cplex文件夹,里面有matlab目录。然后打开Matlab,把该目录加入路径。以Windows 64位版本为例,路径一般是:

C:\Program Files\IBM\ILOG\CPLEX_Studio2210\cplex\matlab\x64_win64

在Matlab里执行:

addpath('C:\Program Files\IBM\ILOG\CPLEX_Studio2210\cplex\matlab\x64_win64'); savepath;

保存路径之后,最好测试一下接口是否正确。执行which cplex或直接创建一个Cplex对象:

cplex = Cplex('test'); cplex.solve();

如果cplex.solve返回成功,说明二进制文件能被Matlab识别。接下来安装Yalmip工具箱,可以从Yalmip的GitHub主页下载并在Matlab中addpath。装好后运行yalmiptest,里面会列出哪些求解器被识别,看到CPLEX那一项打勾就说明配置完成。

这个过程中常见的坑是Matlab版本和Cplex版本不匹配。比如Matlab R2023a以上可能不认老版本的Cplex mex文件,这时候要么降级Matlab,要么升级Cplex。我在复现时用过R2021b配Cplex 12.10,非常稳;如果你是新版Matlab,建议直接装CPLEX 22.1。

3.2 基于Yalmip建模的代码框架

直接上最简可行代码骨架。假设我们要做一个并网场景的24小时典型日优化,决策变量包含风机台数、光伏装机、电解槽容量、每时段调度变量。核心代码长这样:

T = 24; % 时段数 r = 0.08; % 折现率 life = 20; % 寿命 CRF = r/(1-(1+r)^(-life)); % 资金回收系数 % 单位成本与参数 c_w = 50000; % 单台风机投资/台 c_pv = 4000; % 光伏投资/kW c_el = 6000; % 电解槽投资/kW price_buy = 0.8*ones(1,T); % 购电价(元/kWh) price_buy(1:6) = 0.4; price_buy(13:17) = 1.2; price_sell = 0.3*ones(1,T); % 售电价 % 决策变量 N_w = intvar(1,1); % 风机台数(整数) Cap_pv = sdpvar(1,1); % 光伏装机 Cap_el = sdpvar(1,1); % 电解槽装机 P_wt = sdpvar(1,T); % 风电出力 P_pv = sdpvar(1,T); % 光伏出力 P_el = sdpvar(1,T); % 电解槽耗电 P_buy = sdpvar(1,T); % 购电 P_sell = sdpvar(1,T); % 售电 Energy_h2 = sdpvar(1,T+1); % 储氢罐储量(含初末) % 约束集合 C = []; % 容量上界 C = [C, 0 <= N_w <= 20]; C = [C, 0 <= Cap_pv <= 10000]; C = [C, 0 <= Cap_el <= 5000]; % 风电光伏出力由装机乘单位出力系数得到 unit_wt = 100 + 50*sin(2*pi*(1:T)/24); % 单位风机出力 unit_pv = max(0, 500*sin(2*pi*(1:T)/24)); % 单位光伏出力 C = [C, P_wt == N_w * unit_wt]; C = [C, P_pv == Cap_pv * unit_pv / 1000]; % 容量(kW)乘归一化出力 % 电解槽和储氢 H2_per_kwh = 0.00018; % 每度电产氢kg,约60%效率 C = [C, 0 <= P_el <= Cap_el]; C = [C, Energy_h2(2:T+1) - Energy_h2(1:T) == H2_per_kwh * P_el - H2_amm]; C = [C, Energy_h2(1) == Energy_h2(T+1)]; % 周期循环 C = [C, 0 <= Energy_h2 <= 1000]; % 储氢上限待定 % 注意:上面这行只是个演示片段,H2_amm需要另行定义 % 电功率平衡 C = [C, P_wt + P_pv + P_buy == P_el + 0 + P_sell]; C = [C, P_buy >= 0, P_sell >= 0]; % 目标函数 Investment = CRF*(c_w*N_w + c_pv*Cap_pv + c_el*Cap_el); Operation = sum(price_buy.*P_buy) - sum(price_sell.*P_sell); Objective = Investment + Operation; % 求解 ops = sdpsettings('solver','cplex','verbose',2); optimize(C, Objective, ops); % 结果提取 N_opt = value(N_w); Cap_opt = value(Cap_el); P_el_curve = value(P_el);

这段代码做了大量简化,比如没有定义H2_amm、没有氮气约束、也没有把光伏单位系数归一化,但已经能看出Yalmip建模的核心节奏:先写变量,再写约束,再写目标,最后一行optimize。如果把这段跑通,后面加合成氨装置约束、加离网切换,其实都是“往约束集合C里继续塞式子”。

3.3 核心参数传递与求解控制

使用Cplex时,求解参数决定了能否拿到好的结果。最常用的是最优性间隙(gap)和运行时间上限。在Yalmip里这样设置:

ops = sdpsettings('solver','cplex','debug',1); ops.cplex.mip.tolerances.mipgap = 0.02; % 允许2%最优性间隙 ops.cplex.timelimit = 300; % 最多300秒

默认情况下Cplex追求的是精确最优解,gap是1e-4级别。对于工程容量规划,2%到5%的gap完全够用,求解时间却能缩短很多。我实测过一个8760小时的并网模型,默认gap下跑了将近20分钟,把gap放宽到0.05后,5分钟内出解,而且最终总成本差异不到1%。如果模型是典型日24小时,用默认gap完全没问题。

还有个很实用的技巧是热启动。如果要把同一种资源曲线下的多个容量方案做比较,第二次求解时可以先给变量赋一个初值。Yalmip用assign函数:

assign(N_w, value(N_w)); assign(Cap_pv, value(Cap_pv)); optimize(C, Objective, ops);

Cplex会从这个初值开始搜索,有时候能在毫秒级收敛。这个技巧在Benders分解、场景聚类扫描时要经常用。

4. 并网/离网结果对比与调度策略分析

4.1 容量配置结果对比

跑通模型之后,最直观的输出是两类场景的容量配置结果。我基于一组典型的风光资源和电价参数做了对比,结果和大家工程直觉一致。以下是一个示例性结果,不代表所有场景:

场景风机台数光伏装机/kW电解槽/kW储氢罐/kg年总成本/万元
并网830002400200750
离网14450030008001080

离网场景的风机台数增加了约75%,光伏增加了50%,储氢罐容量翻了好几倍,系统总成本自然也更高。原因很简单:离网系统必须依靠本地电源应对连续无风无光日,而并网系统可以把这样的风险转嫁给电网。在具体项目里,如果当地电网可靠性差、峰谷电价差大,离网反而可能因为省去电网接入费而更划算;如果电网支撑条件好,并网系统通常经济性更优。

注意,这个对比的前提是氨的日产量需求要设成同一个数值。如果离网场景允许降低产量、多弃电、少产氨,那么优化结果又是另一回事。复现时建议先固定年合成氨总产量,再分别跑两种场景,拿到的结果才可比。

4.2 典型日调度曲线解读

调度结果是容量结果的下游体现。我这里用一个“春夏季典型日”做例子:白天9点到16点光伏出力较大,此时电解槽基本满负荷吃电;夜间风力恢复,风电继续维持电解槽一半负载。并网场景下,白天光伏出力超过电解槽需求的部分,可以选择卖电而不是制氢,因为制氢有电解效率损失。离网场景下则没有售电出口,多余光伏只能弃掉。

Cplex算出来的调度曲线有个特点:它会非常“精打细算”地操作储氢罐。储氢罐在光伏大发时段充满,在夜间风力低谷或早上电负荷偏高时段放出。氨合成装置则尽量保持平稳生产,因为频繁启停有成本约束。如果你在模型中加了最小启停时间约束,调度曲线会明显比不带约束的版本平滑,也更符合实际。

还有一类曲线是“冬季典型日”,风光出力都很低。并网系统会选择在低谷电价时段购电制氢,在高峰时段让电解槽降载;离网系统则只能消耗储氢罐里的存量,可能连续几天氨产量下降。这种时候离网系统对储氢罐容量的依赖会表现得特别明显,你会直观理解为什么离网方案要配800kg而不是200kg储氢。

4.3 对实际工程落地的启示

从这些结果里能提炼出几个实用结论。

第一,并网系统要重视电价信号。如果你的当地峰谷电价差超过0.6元/kWh,那么大电解槽本身就变成了一个“虚拟储能”:谷电时制氢,峰电时停机或者卖电,可以在不配电池的情况下获得套利收益。我在实际算例里见过仅靠这部分套利就能抵消电解槽20%年化成本的情况。

第二,离网系统不能追求100%消除弃电。为了做到全年不缺氢,必然会出现某些小时光伏多到电解槽吃不下、储氢罐也满了,只能弃电。最优弃电率通常落在10%~25%之间。如果强行要求弃电率为0,容量投资会陡增,反而拖高单位氨成本。这个结论很多工程方案一上来就忽略了。

第三,合成氨装置的柔性调节是降本利器。在经典Haber-Bosch工艺里,合成氨负荷波动范围比较窄。但如果采用宽负荷合成氨技术(负荷可在50%~110%之间调节),系统就可以在风光大发时多产氨,在资源差时少产,减少了氨储罐压力。模型上只需要把氨产量约束从等式改成区间约束,整体成本就有明显下降。我个人强烈建议在做完基础模型后,把“刚性氨负荷”改成“柔性氨负荷”,对比一版结果,往往能看出不小的收益空间。

5. 复现过程中的常见问题与排查技巧

5.1 Cplex求解器可执行文件不匹配

很多第一次配Cplex的人会卡在Yalmip报“No suitable solver found”或者“Cplex is not available in the current path”。这个问题的排查路径很固定:先在Matlab里输入cplex = Cplex('test'),如果直接报错,说明cplex的mex文件没加载进来;如果不报错,再看yalmiptest列表里的CPLEX状态。出现类似“Invalid MEX-file”的错误,九成是32位/64位不匹配。检查Matlab工具栏的“预设”里是32位还是64位,再重新把对应路径下的cplex文件夹加入addpath。还有一种是Cplex安装时没有勾选Matlab接口,重新安装的时候一定要把集成组件装齐全。

5.2 模型不可行/求解器返回inf的问题

这是优化求解中最常见的问题。模型不可行时Cplex会提示“Infeasible”,Yalmip的optimize返回[0]或者无解,提取变量为NaN。你首先用Yalmip自带诊断函数check:

optimize(C, Objective, ops); [primal_res, dual_res] = check(C);

check会返回每条约束的残差,残差很大的约束就是导致不可行的“嫌疑犯”。根据我的经验,最常见的不可行原因是储氢罐首尾循环约束和末端产量需求之间的矛盾。比如要求24小时产氨量必须达到R吨,同时储氢罐初始储量设得很低,而中间无论怎么调度都攒不够氢,模型自然就无解。简单排查方法是先去掉末端产量约束,看看能不能求解;如果能,说明是产量要求太高,需要扩大电解槽或储氢容量,或降低日产量目标。

另一个隐藏原因是整数变量和连续变量的上界没给够。风机台数上限给20,实际最优需要25,模型会卡在边界上然后告诉你不可行。所以初期把容量上界设得松一些,比如风机上限给50,光伏上限给20000kW,跑出一个可行解后再逐步收紧。

5.3 求解时间过长与性能调优

如果模型从典型日扩展到全年8760小时,变量数量会爆炸,就算用Cplex也可能要算半小时。我复现时踩过这个坑,这里分享三个加速手段。

第一是用典型日代替全年。把全年风、光、温度数据用K-means聚类成若干个典型日,比如春夏秋冬各取一个代表日(共4×24=96个时段),模型规模立刻小了两个数量级。结果与全年模拟误差通常在5%以内,足够规划阶段用。

第二是放宽MIP gap。前面已经说过,把cplex.mip.tolerances.mipgap设为0.02或0.05,求解速度能快10倍以上。对于容量规划问题,没必要为最后那0.1%的最优性花掉90%的计算时间。

第三是使用松弛技巧。如果风机台数是整数,可以先把它当成连续变量求解,再把结果四舍五入成整数,然后固定整数变量重新求解一次调度子问题,这样得到的可行解往往已经非常接近全局最优。这个方法虽然从理论上不一定有严格最优性保证,但工程上快速评估完全够用。

现象常见原因解决办法
报错“No suitable solver”Yalmip没识别Cplex重新运行yalmiptest,确认Cplex在路径中
报错“Invalid MEX-file”位数/版本不匹配重新下载正确Cplex版本,addpath对应目录
模型不可行产量需求与容量的矛盾用check定位约束,放宽容量上界或降低产量目标
求解时间过长变量规模太大或gap过严使用典型日聚类,放松gap,用assign热启动
结果NaN变量值未成功提取检查optimize返回的flag,确认可行后再value()

6. 复现心得与后续扩展方向

6.1 我踩过的坑与经验总结

复现这套代码最有价值的部分,不是学会了怎么写优化模型,而是彻底理解了“能源系统优化中的经济性与可靠性平衡”。我在一开始只跑并网场景时,总以为最优解会把光伏出力全部吃干净;后来把售电价调高,发现Cplex宁可少电解槽出力卖电,也不让电“白白”转成氢。这个反直觉的结果让我意识到,电解槽效率不是100%,中间转换环节是有损耗的,电价一高,卖电比制氢更赚。这个道理不跑优化模型,单凭拍脑袋很容易犯错。

储氢罐的周期循环约束也是我反复调试才搞明白的典型问题。起初我没有约束末时段的储氢量,模型在24小时结束时把储氢罐全部抽空,虽然目标函数很好看,但第二天开局就面临无氢可用的窘境。这种模型结果看着数值对,实际工程完全不可用。加一个Energy_h2(T+1)==Energy_h2(1)约束,才真正让调度具备跨周期可持续性。有时候约束解决问题就是这么简单,但你不踩这个坑,可能永远意识不到。

6.2 想继续深挖怎么做

这套模型后续扩展的空间非常大。如果你学有余力,我建议从三个方向下手。

第一个方向是加电化学储能电池。只需要在电功率平衡中增加一个电池充电/放电变量,再加上SOC状态转移约束,容量配置里多一个电池容量变量。对离网场景来说,电池能快速补短时功率缺口,储氢罐则负责长时间跨日平衡,两者配合往往可以降低总成本。

第二个方向是换成Python栈。Yalmip+Cplex在Matlab里很好用,但如果你想做更复杂的机器学习预测或与前后端服务集成,Python的pyomo或gurobipy搭配Cplex也很香。模型逻辑完全可以从Matlab平移到Python,只是变量声明和约束写法要改,思路一模一样。

第三个方向是引入随机优化。风、光出力有很强的不确定性,直接做确定性优化容易低估风险。可以用多场景随机规划替代单一典型日,一个场景一套变量,通过非预期约束把各场景耦合起来。这样Cplex要解的问题会变成大规模MILP,但求解逻辑和现在的代码骨架是一致的。我目前正在尝试把天气场景概率加进模型,看看能对容量结果产生多大影响,之前已经初步观察到:加入不确定性后,最优储氢罐容量会明显增大,而电解槽和风机经济性略下降,这也是符合预期的对冲策略。

如果你也是从零开始复现这类“可再生能源+制氢+合成氨”的模型,不要急着一步到位写完整代码。建议先按我的代码骨架跑通一个24小时典型日、单一并网场景的简化问题,确认结果合理后,再加离网切换、加大容量变量、加氨产量约束,最后再刷全年数据。每加一层约束,用check和value变量看一眼结果,慢慢就摸清楚Cplex的脾气了。这套路我试过很多个类似项目,是最省时间的路径。

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

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

立即咨询