ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

阶梯碳交易与电制氢耦合的热电联供系统优化建模及MATLAB实现

阶梯碳交易与电制氢耦合的热电联供系统优化建模及MATLAB实现 1. 为什么是“阶梯碳交易电制氢”看懂这个组合的底层动机最近几年做综合能源系统IES优化的人多少都会遇到一个共同的痛点单纯以运行成本最低为目标建出来的模型结果往往非常“不绿色”——系统会想尽一切办法烧天然气、购便宜电碳排放怎么低怎么来环保指标全靠最后统计时“算出来”而不是“优化出来”。但如果反过来直接以碳排放最小为目标成本又扛不住优化结果容易变成“弃用所有化石能源疯狂买绿电”的理想化方案实际根本跑不动。把阶梯式碳交易机制和电制氢P2H同时放进一个热电联供系统里做优化本质上就是在回答一个问题怎么让系统在算经济账的时候主动把碳排放当成一项真金白银的成本同时在风电光伏大发时给多余电量找一个既能赚钱又能降碳的出路。先说碳交易为什么用“阶梯式”。常规的单一边碳价模型整个系统多排一吨碳和少排一吨碳的代价是一样的优化器只会把排放压到某个固定边际平衡点。而阶梯式碳交易的聪明之处在于碳价会随着排放量跨过不同的配额区间而阶梯上升排得越多边际惩罚越重。这样优化器在决策时面临的就是一个“分段线性的惩罚函数”——它会为了不跨入下一阶梯而主动调整各机组的出力比例效果比单一碳价激进得多也更符合实际碳市场的设计逻辑。再说电制氢。电力系统的热电优化里冬季热负荷高峰时期热电联产机组CHP经常被热负荷“绑架”被迫提高电出力结果就是夜间低谷时段大量风电被弃掉。电制氢设备在这里起的作用不是单纯“耗电”而是给系统增加了一个可控电负荷风电多了就电解水制氢氢气可以直接作为气源供向氢燃料电池或氢锅炉也可以存进储氢罐留到高峰时段再发电供热。这么一来电、热、氢三种能量流就耦合在一起系统不再只是“电定热随”或“热定电随”而是多了一条灵活的调节路径。我在实际搭建这类模型时最直观的感受是这个组合不是在“加设备”而是在“加自由度”。每个新设备都带来一组新的决策变量和约束但换来的是一组新的可行解空间。同样的风电来量没有P2H的模型只能弃风或者让CHP降出力有了P2H系统可以选择电解水存氢把弃风电量转成氢能储备再用氢能去替代一部分天然气碳排放和购气成本同时下降。这个转换逻辑就是整个优化模型的核心价值所在。这篇文章适合两类读者一类是刚入手综合能源系统优化、想找一套靠谱的MATLAB建模框架来复现的学生和研究人员另一类是自己已经写过基础IES模型、想进一步把碳交易和氢能耦合加进去、但不太清楚阶梯碳价线性化和P2H动态约束怎么处理的实操型工程师。下面我按照自己实际写代码的顺序把整个系统的建模思路、关键公式、求解配置和踩坑经验完整拆开来讲。2. 阶梯式碳交易机制怎么转成数学约束从政策逻辑到线性化2.1 配额分配与排放核算先搞清算的是哪笔账阶梯式碳交易建模的第一步不是写代码而是把“碳排放”变成“可计算的目标函数项”。综合能源系统里最常见的排放来源是从外部电网购电所对应的间接排放、天然气锅炉GB和燃气轮机CHP燃烧天然气所产生的直接排放。这里有一个很多人一开始没想清楚的细节外购电的排放因子怎么取如果电网侧完全不考虑绿电交易通常直接按当地电网平均碳排放因子折算比如0.58~0.88 kgCO2/kWh这个量级如果模型想体现“系统自己多消纳风电视同于减少外购电”的环保价值也可以引入绿电溯源或动态碳因子。在MATLAB建模里我习惯把外购电的碳排放写成从电网购买电量乘以排放因子而不是把风电视作零碳直接忽略——因为外购电的“排碳责任”属于用户侧这笔账必须算在IES头上否则买电和自产电之间的成本比较就失真了。免费碳排放配额在多数仿真文献里按机组类型分别核算燃气轮机CHP的配额按发电量和供热量分别乘以对应的配额系数燃气锅炉的配额按供热量乘以配额系数外购电一般没有免费配额属于“全额需要购买排放权”的部分。实际代码里我习惯用一组基准系数来算总配额比如发电配额系数取0.574 tCO2/MWh、供热配额系数取0.11 tCO2/GJ具体数值可以根据你所在地区的政策或参考文献调整。关键是这个额度代表系统“不需要花钱”的排放上限超出部分才进入阶梯计价体系。2.2 阶梯分段的本质一个分段线性惩罚函数阶梯式碳交易的实际交易区间一般可以切分成多段。在文献里最常见的做法是系统实际碳排放量减去免费配额得到一个净排放量E_net然后按下标区间定价净排放量在[0, E1]区间内碳价为c1超过E1的部分落入[E1, E2]这部分碳价为c2且c2 c1超过E2的部分碳价为c3继续递增。注意这里有个关键区别阶梯碳交易在多数文献里用的是分区间计价——每个区间的超额排放量按该区间价格计费与“超量部分整体按更高价计费”的简单阶梯不同。前者带来的碳交易成本是分段线性函数后者会出现“整体跳变”导致目标函数不连续。学术文献里常写的“阶梯式”一般指前者成本随排放量递增但连续可导分段线性求解上更友好也更符合现实中碳配额分批拍卖的直觉。在MATLAB中用YALMIP建模时我一般这样表达这一逻辑E_net E_total - E_quota; % 净排放量与决策变量相关 E_seg1 sdpvar(1,1); % 落入第一阶梯的排放量 E_seg2 sdpvar(1,1); E_seg3 sdpvar(1,1); % 用二进制变量标记是否跨入更高阶梯 z1 binvar(1,1); z2 binvar(1,1); % 分段区间约束 E_seg1 0; E_seg1 E1; E_seg2 0; E_seg2 (E2 - E1) * z1; E_seg3 0; E_seg3 (E3 - E2) * z2; % 关联约束净排放量拆分为三段之和 E_net E_seg1 E_seg2 E_seg3; % 阶梯逻辑约束只有进入上一阶梯才会使用下一段的量 E_seg2 E1 * z1; % 如果z10则E_seg2必须为0 E_seg3 E2 * z2;这里需要注意上面的约束写得不完整YALMIP里要严格约束“跨段”关系还需要配合大M法和顺序约束比如 z2 z1确保系统不会跳过中间段直接使用第三段。完整代码我会在第五节给出可运行的结构这里先把建模思路讲清楚。2.3 碳交易成本函数与目标函数衔接碳交易成本 C_co2 的表达式为C_co2 E_seg1 * c1 E_seg2 * c2 E_seg3 * c3这个成本项直接加进目标函数与购能成本、运维成本并列。你会在结果里看到一种非常典型的现象引入阶梯碳交易之后某个运行方案从“纯经济最优”转变为“低碳最优”——系统宁可增加一点运维成本或购能成本也要把碳排放控制在某个阶梯区间内因为跨过下一档碳价的边际代价已经超过了多烧更贵燃料的成本。我在调参时常用的对照实验是固定其他条件不变单独把碳交易从“无碳交易”切到“单一碳价”再切到“阶梯式碳价”分别记录三个场景下的总成本、碳排放量和各类机组出力占比。这个对比图基本是论文里的标配也是检验模型是否“真正生效”的最直接方式。如果碳交易机制加进去了结果和没加之前完全一样那基本可以肯定是配额给得太宽松碳价低到根本没有约束力。3. 电制氢环节建模从电解槽到储氢罐的约束网络3.1 电解槽的输入输出关系效率和运行范围电制氢P2H的核心设备是电解槽Electrolyzer。在热电优化模型里电解槽通常简化为一个“电转氢”的效率环节输入电功率 P_el输出氢气量 H_prod二者之间用效率系数 η_el 连接。氢气热值可以用质量kg或能量GJ表示全看你下游设备用哪种单位我建议全系统统一用能量单位GJ或MWh避免氢质量换算带来的混乱。核心约束如下H_prod(t) η_el * P_el(t)0 ≤ P_el(t) ≤ P_el_max这里 η_el 我常取0.6~0.7基于电解槽LHV效率P_el_max 对应设备额定功率。有些文献把电解槽的效率建模成随负载率变化的曲线但在MILP框架下通常做分段线性化处理。如果你只是为了完成系统级热电优化恒定效率已经够用如果你想突出“电解槽在部分负载下效率变化对系统运行的影响”那就需要引入额外的整数变量做分段逼近模型复杂度会明显上升。还有一个容易被忽略的约束是爬坡约束。电解槽不是随便从0%跳到100%的启动和功率爬升速率都有限制。我在模型里通常会加入-P_ramp ≤ P_el(t) - P_el(t-1) ≤ P_ramp这个约束看着简单但对有小时级动态仿真的系统影响很大——它会让优化器提前部署制氢功率而不是在某个时段突然把电解槽开到最大。3.2 储氢罐的SOC逻辑动态平衡与容量约束储氢罐是P2H系统里真正体现“时序耦合”的环节。和电储能类似储氢罐的状态量是当前储氢量 S(t)动态递推关系为S(t) S(t-1) H_prod(t) - H_cons(t) - H_loss(t)其中 H_cons 是下游用氢量H_loss 可以按比例估算比如每时段损失2%左右。容量约束S_min ≤ S(t) ≤ S_max以及始末状态约束。这里我特别强调始末约束如果你建的是“日运行模型”一般会加S(0) S(T)表示一个周期内储氢量回归初始值这样结果才是周期可复现的。如果不加这个约束优化器会在最后一个时段把储氢罐直接耗空造成“边界效应”结果并不真实。我在第一次写这个模型时就没加终值约束结果发现最末时段的氢燃料电池出力异常偏高因为优化器在“清仓甩卖”储氢罐这种结果拿去写论文或做决策参考都会出问题。所以调度周期首末储氢量一致这个约束看似不起眼实际上非常关键。3.3 氢的去向燃料电池发电、氢锅炉供热与其他用氢电制氢产出的氢气必须有一个完整的“去向网络”否则储氢罐会迅速饱和。在我的模型里氢气主要有三个去向氢燃料电池HFC发电氢气转化为电功率效率 η_fc同时可以利用热电联产特性回收一部分余热作为系统热源之一氢锅炉供热氢气直接燃烧产热近似可用锅炉效率 η_hb 描述模型里是最简单直接的热负荷补充工业或外部用氢如果在你的IES模型里有外部氢负荷可以设定为固定序列作为系统需要满足的“氢负荷”如果纯做热电联供这个去向可以省略。有些文献还会加“氢能车”或“加氢站”负荷但考虑到博文场景我选择聚焦在热电联供这条线上P2H制氢氢燃料电池回电回热、氢锅炉供热配合储氢罐实现“跨时段搬移能量”的功能。这套闭环结构已经能把氢能在源-荷-储三个环节的耦合作用完整体现出来。实际运行时你会看到这样一组典型场景夜间风电高发、电价低、热负荷不高优化器会把电解槽开到最大把冗余风电转成氢气存进储氢罐到了傍晚热负荷高峰系统再调用氢锅炉或氢燃料电池来供热供电替代一部分天然气消耗。这就是“电制氢给系统增加了一条跨能量形式的调节路径”这句抽象描述在实际结果上的体现。4. 热电联供系统的多设备耦合关系与运行约束4.1 CHP机组的热电可行域为什么不能简单写成“以热定电”综合能源系统的热电耦合核心在CHP机组。很多人刚上手时会把CHP简化成一个固定热电比的设备——发电多少就产热多少把抽汽式和背压式的调节余地全部丢掉。但这样做会人为压缩优化空间导致结果要么过于乐观、要么根本不可行。较严谨的做法是使用热电可行运行域feasible operation region描述最大进汽量、最小进汽量约束纯凝工况线与背压工况线之间的可行区域热电比可在一定范围内连续调节。如果不用可行域只是把CHP当作“热定电”的刚性机组那么阶梯碳交易机制和P2H带来的灵活性就会被极大抑制。在我的模型中CHP的可行域定义为供热功率 Q_chp(t) 在最小和最大之间发电功率 P_chp(t) 的上限和下限都随供热功率变化分别用两组线性不等式描述 P 与 Q 的关系。如果你在YALMIP里建的是连续线性约束可以直接写成P_chp P_min k1 * Q_chp; P_chp P_max - k2 * Q_chp;其中斜率 k1、k2 是从CHP型号的热电运行特性曲线上拟合出来的。这套方法的优势是简单、易写好调在MILP框架内完全可行也是我当前模型的基础表达方式。4.2 燃气锅炉、电锅炉和P2H的分工逻辑多热源系统里燃气锅炉GB、电锅炉EB和氢锅炉HB往往共用一套热负荷平衡约束Q_GB(t) Q_EB(t) Q_HB(t) Q_CHP(t) Q_HFC(t) Q_load(t)每个热源都有自己的成本特性燃气锅炉成本随气价变化电锅炉成本随电价变化氢锅炉成本来自储氢罐里的氢气本质上是此前电解槽耗电的转化成本。这三者的“最优组合”会自动随分时电价和碳价浮动。我测试过一组典型参数结论是白天电价高时电锅炉基本不启动夜间风电富余时P2H和电锅炉才成为主要调节手段。而氢锅炉通常会与储氢罐联动在早高峰热负荷爬升时出力最猛正好接在夜间制氢之后。4.3 电力平衡、热力平衡与线路传输约束在IES层面电和热的节点平衡是硬约束P_CHP(t) P_HFC(t) P_WT(t) P_PV(t) P_buy(t) P_load(t) P_el(t) P_EB(t)Q_CHP(t) Q_GB(t) Q_EB(t) Q_HB(t) Q_HFC(t) Q_load(t)这里我特意把 P_el电解槽功率和 P_EB电锅炉功率放在等号右侧作为“电动负荷”而不是简单把它们算进总负荷里。这样做的好处是目标函数和约束里可以分别标注各设备的决策变量后续做灵敏度分析或边际成本拆解会更方便。如果你做的模型涉及多节点网络还要加入节点电压和线路潮流约束。但考虑到大多数IES热电优化论文的第一版模型都采用单节点能量枢纽Energy Hub建模我在这里就不展开潮流部分了如果你需要扩展成多微网可以在现有模型基础上引入DistFlow或直流潮流方程。5. MATLAB与YALMIP实现代码结构、核心命令与求解配置5.1 工具箱选型与建模环境我用的环境是MATLAB YALMIP 求解器Gurobi或Cplex。YALMIP负责把优化问题翻译成求解器需要的标准形式求解器负责实际计算。选Gurobi还是Cplex主要看你有哪个许可证二者的MILP求解性能在这个规模下基本没有显著差异。在写代码前建议把数据分成三块独立管理设备参数表各机组效率、容量、爬坡率、成本系数能源价格序列分时电价、天然气价格、碳价阶梯参数负荷与可再生序列电负荷、热负荷、风电/光伏历史数据。这三块数据我习惯存成struct或表格文件在运行主程序时一次性import。这样你在做参数敏感性分析时只需要改一处数据不需要翻遍整个代码文件。5.2 核心代码框架变量定义、约束构建与求解下面给出一个可运行的核心代码骨架省去具体参数赋值部分实际使用请按需填充%% 定义时间尺度和决策变量 T 24; % 调度时段数 P_chp sdpvar(1, T); % CHP发电功率 Q_chp sdpvar(1, T); % CHP供热功率 P_gb sdpvar(1, T); % 燃气锅炉耗气对应的供热功率 P_el sdpvar(1, T); % 电解槽输入电功率 Q_eb sdpvar(1, T); % 电锅炉供热功率 H_st sdpvar(1, T); % 储氢罐储氢量 P_fc sdpvar(1, T); % 氢燃料电池发电功率 Q_fc sdpvar(1, T); % 氢燃料电池供热功率 P_buy sdpvar(1, T); % 外购电功率 P_wt wind_data; % 风电出力历史序列固定值 E_total sdpvar(1, T); % 各时段碳排放 E_seg1 sdpvar(1, T); E_seg2 sdpvar(1, T); E_seg3 sdpvar(1, T); z1 binvar(1, T); % 阶梯指示变量 z2 binvar(1, T); %% 约束集合 C []; % 电平衡约束 C [C, P_chp P_fc P_wt P_buy P_load P_el Q_eb]; % 热平衡约束 C [C, Q_chp Q_gb Q_eb Q_hb Q_fc Q_load]; % CHP可行域约束示意 C [C, P_chp P_chp_min k1 * Q_chp]; C [C, P_chp P_chp_max - k2 * Q_chp]; % 电解槽约束 C [C, P_el 0, P_el P_el_max]; C [C, H_prod eta_el * P_el]; % 储氢罐动态 C [C, H_st(2:T) H_st(1:T-1) H_prod(2:T) - H_cons(2:T)]; C [C, H_st(1) H_st0]; C [C, H_st(T) H_st0]; % 周期始末一致 % 阶梯碳交易约束简化写法具体跨段条件用大M法 for t 1:T C [C, E_total(t) P_chp(t)*emiss_chp P_gb(t)*emiss_gb P_buy(t)*emiss_grid]; C [C, E_net(t) E_total(t) - E_quota(t)]; C [C, E_net(t) E_seg1(t) E_seg2(t) E_seg3(t)]; C [C, E_seg1(t) 0, E_seg1(t) E1]; C [C, E_seg2(t) 0, E_seg2(t) (E2 - E1) * z1(t)]; C [C, E_seg3(t) 0, E_seg3(t) (E3 - E2) * z2(t)]; C [C, z2(t) z1(t)]; % 不允许跳段 end %% 目标函数 Cost_buy sum(price_e .* P_buy) * dt; % 购电成本 Cost_gas sum(price_gas .* (P_gb gas_chp_factor .* P_chp)) * dt; % 购气成本 Cost_om sum(om_chp .* (P_chp Q_chp) om_gb .* P_gb om_el .* P_el); % 运维成本 Cost_co2 sum(E_seg1 .* c1 E_seg2 .* c2 E_seg3 .* c3) * dt; % 碳交易成本 Objective Cost_buy Cost_gas Cost_om Cost_co2; %% 求解配置 ops sdpsettings(solver, gurobi, verbose, 2); ops.gurobi.MIPGap 0.001; ops.gurobi.TimeLimit 300; optimize(C, Objective, ops); %% 结果输出 P_chp_opt value(P_chp); Q_chp_opt value(Q_chp); P_el_opt value(P_el); Cost_breakdown value([Cost_buy, Cost_gas, Cost_om, Cost_co2]);上面这段代码是典型的“场景调度型”结构。需要注意由于引入了0-1变量整个问题属于MILP求解时间跟阶梯段数、时段数和设备数量直接相关。我测试过T24、3个碳交易阶梯、6个主要设备的模型Gurobi默认参数下通常几秒到几十秒就能收敛但如果把T扩到8760小时做全年规划变量规模会爆增这时候最好别直接上MILP而是考虑按典型日聚类或者引入拉格朗日松弛做分解。5.3 结果分析用边际成本与碳价穿透力评估“灵活性溢价”跑完模型后除了画各设备出力曲线、热/电平衡图、碳交易费用柱状图这些常规可视化我强烈建议再加一个分析计算碳交易机制引入前后的系统边际发电成本差异。具体做法是分别跑“无碳交易”和“阶梯碳交易”两个场景对比两个场景下的目标函数与各设备出力。通常你会看到一个非常有趣的结论阶梯碳交易并不是简单地把出力从燃煤/燃气机组转移到可再生能源而会带来一个“碳价穿透效应”——碳价越高风电和P2H的隐含收益越大因为每增加1MWh的风电消纳对应减少的边际碳排放量就越多。这套分析做完你的论文或项目报告的“结果与讨论”部分基本就丰满起来了。6. 场景设计与阶梯参数灵敏度测试怎么证明模型真的有效6.1 四场景对照无碳交易、单一碳价、阶梯碳价、阶梯碳价P2H我自己的项目里场景设计通常这样安排场景A无碳交易机制只考虑购能成本和运维成本场景B引入固定碳价比如50元/t场景C引入阶梯式碳交易三阶梯参数按配额基准设定场景D阶梯式碳交易P2H设备完整复现本文模型。场景A与B对比能看出“碳成本”对系统运行的直接冲击场景B与C对比能看出阶梯碳价“分层惩罚”带来的额外效果场景C与D对比则是验证P2H设备是否真正提升了系统的风电消纳空间和成本-碳减排双目标表现。这个四场景对照是我给所有入门者的标准建议它比只跑一个完整模型更有说服力也能让你逐步排查模型问题。6.2 阶梯参数怎么定从配额系数到碳价上限阶梯碳交易的关键参数一般是三个免费配额基准、阶梯区间宽度、各级碳价。我常用的做法是先跑一个无碳交易场景得到系统的总碳排放量以该排放量的80%作为免费配额上限E1基准阶梯区间按实际排放量的10%~20%划分基础碳价c1设为当前碳市场的市场均价比如50元/tc2取1.5~2倍c3取2.5~3倍。这样做的好处是免费配额给得相对“抠”让碳交易的约束力真正生效结果中不会有大量“配额富余、碳价形同虚设”的异常现象。6.3 灵敏度的三个观察维度调试参数时我一般记录三组曲线总碳排放vs碳价水平看碳排放是否随碳价上升而单调下降曲线斜率能反映价格弹性P2H制氢量vs风电渗透率看制氢量是否随风电增加而上升验证P2H的风电消纳逻辑系统总成本vs阶梯跨度看阶梯区间变窄时成本是否上升——区间越窄惩罚越“急”系统会越快切换到低碳设备组合。这三条曲线非常直观能帮你快速判断模型行为是否符合物理直觉。如果发现碳排放不随碳价变化大概率是配额基准太高或目标函数里碳成本权重太小如果P2H制氢量在风电过剩时段没有明显提升多半是电解槽容量或储氢罐容量设得过小约束主导了结果。7. 复现和调试中容易踩的坑我替你走过的弯路7.1 碳排放核算边界和能量单位混用我在第一次把碳交易写进模型时犯过一个特别低级的错误发电量用了MWh供热量用了GJ然后直接拿两个数字加起来去算排放。这导致配额核算偏差接近一个数量级。后来我统一规定全模型能量单位用MWh热值转换按1 GJ ≈ 0.2778 MWh处理氢的能量统一按LHV计算。这个单位统一写在代码开头注释里所有读代码的人都不会再混淆。7.2 阶梯约束里的“跳段”问题带0-1变量的分段惩罚建模最常见的问题就是“跳段”约束失效。如果你只写了E_seg3的范围上限却忘了写z2 z1优化器会直接让E_seg1 0、E_seg3 E_net完全绕过中间梯度。这个bug非常隐蔽最终结果虽然也能收敛但碳交易成本会低得不正常。排查方法是单独打印一组E_net较大时段的分段向量检查三段是否严格从第一段起依次填充。7.3 储氢罐终值约束与边界效应前面说过的储氢罐终值问题在24小时调度里尤其明显。忘记加H_st(T) H_st0时优化器在最后一个时段会出现“抛售”行为。我在调试时只要看到最后一时刻制氢量为0、HFC出力异常高第一反应就去查储氢罐终值约束。7.4 求解器数值问题大M法中的M取值阶梯约束里如果用大M法M的取值不能随便拍脑袋。太小的M会把可行域截断太大的M会带来数值病态导致求解器报“numerical issues”。我的习惯是M取该阶梯区间最大可能边界值的1.2倍左右并且统一给所有M设一个总体量级。Gurobi对系数尺度比较敏感尽量让约束矩阵中非零元素的数量级控制在1e-3到1e3之间。7.5 用已知特例验证模型正确性无论代码多复杂我都建议先用一个极简场景做“标定”比如把储氢罐容量设成0、P2H容量设成0模型退化成传统的CHPGB外购电系统这时候结果应当和你能手算的简单场景一致。如果退化场景都对不上那说明基础逻辑就有问题不要急着加碳交易先把底层跑稳。我在实际做这套模型时最大的体会是建模本身并不难难的是每一次约束微调之后你都要能解释结果为什么变化。阶梯碳交易的价值不在于它比单碳价模型多算了几行代码而在于它让系统在面对碳价时不再是一个“线性响应”的机器而是会自动切换到一系列更复杂的运行策略——提前储氢、调整CHP热电比、改变外购电与自发电比例。当你从结果曲线上看到这种“策略性变化”时这个模型才真正立住了。最后分享一个我经常用的调参技巧跑完完整模型后拿一套“无碳交易”的出力曲线和“阶梯碳交易P2H”的输出曲线叠在同一张图里用阴影标记每时段的碳排放减排量和氢气产销量。这套图比任何数据表都直观一眼就能看出碳交易机制在哪些时段逼着系统做出了改变P2H又在哪些时段填上了“被逼出来”的缺口。拿去汇报或者写论文都很能说明问题。
返回列表