简介:这是一份关于交直流混联电力系统核心技术的中文文献PDF,源自《科技创新导报》,适合电力系统研究人员、调度运行人员及电气工程专业学生阅读。内容聚焦大规模交直流混联网络下的潮流计算与安全约束机组组合问题,结合“西电东送”“北电南送”工程背景,系统梳理了统一迭代法与交替迭代法的原理、优缺点及改进思路,并介绍了基于Benders分解的机组组合优化算法,为工程实践和学术研究提供了扎实参考。资源为1个PDF文件,大小2.13MB,内容排版规整,便于全文检索与重点标注。目前已有113人学习浏览,对于正在开展电力系统分析、电网调度优化或相关课题研究的人群具有直接借鉴价值,可作为入门综述或技术方法论参考资料。
1. 交直流混联潮流计算:从牛顿法到机组组合的完整技术链路
大规模直流输电工程相继投运后,交流电网和直流电网之间的耦合越来越紧,传统的纯交流潮流程序已经算不准、甚至算不收敛了。这篇《交直流混联电力系统潮流计算与机组组合》把这一场景下的两个硬骨头放在一起讲:一是交直流混联系统的潮流计算,二是考虑安全约束的机组组合(SCUC)。前者解决"电网现在处于什么运行状态"的问题,后者解决"未来24小时哪些机组该开、哪些该停"的问题。对做电网调度、运行方式计算、或者正在搭交直流混联仿真平台的工程师来说,这篇文章的价值在于把算法选型思路和数学框架讲清楚了,而不是停留在软件操作层面。文中两条主线——统一迭代法与交替迭代法——的优缺点对比,以及Benders分解在SCUC中的应用,恰好是实际工程项目里最常遇到的选型分歧点。
2. 潮流计算的两种主路线:统一迭代法与交替迭代法的选型逻辑
2.1 为什么传统交流潮流程序在交直流混联系统里会失效
传统交流潮流计算的核心是求解一组非线性节点功率平衡方程,状态变量是各个交流节点的电压幅值和相角。当直流系统接入后,换流器在交流侧表现为一个可控的功率注入源,但这个注入量不是独立给定的,它取决于直流侧的运行状态——触发角、熄弧角、直流电流、直流电压等。换句话说,直流系统的控制变量被引入了交流系统的非线性方程中,二者必须联立求解。
这篇文献明确指出,传统的交流潮流计算方法难以直接适用,因为直流系统方程(通常是换流器稳态模型方程)被追加到了原方程组中,方程的数目和未知数的数目同时增加了。实际操作中,很多工程师的第一反应是"把直流功率作为固定负荷塞进去",这在稳态工况下勉强能算,但一旦直流输电的输送功率需要调整,或者换流器控制方式切换(定功率、定电流、定触发角),这种近似处理就会产生明显误差,甚至导致潮流计算发散。
理论上,交直流混联潮流计算必须同时处理两类约束:交流节点有功/无功平衡方程、直流系统稳态方程(含换流器电压电流关系和控制特性)。直流系统方程的具体形式取决于换流器采用何种控制方式,这也是为什么统一迭代法和交替迭代法在处理Jacobian矩阵时表现出截然不同的特性。
2.2 统一迭代法:收敛性好但有计算量代价
统一迭代法以极坐标下的牛顿法为基础,把交流节点状态变量和直流系统变量统一放入同一个迭代框架中求解。这种做法的最大优点是收敛性好,适应性强——对于不同的控制方式、网络结构和算例条件,通常都能获得收敛解。原因在于交流系统和直流系统的方程在同一个迭代过程中被同步更新,变量间的耦合关系不会被拆分或滞后。
但代价也很明显:Jacobian矩阵的阶数因为直流变量的引入而增加,并且每一次迭代之后都需要重新计算Jacobian矩阵。对于大规模交直流混联网络,这会导致每次迭代的计算量显著上升,整体的求解速度被拖慢。
文献中提到了两类改进思路。第一类是对传统牛顿法进行改进,简化数学模型,使得在交直流混联潮流计算中只需要对Jacobian矩阵进行一次计算即可。具体操作上,可以根据网络规模和收敛准确度要求,综合应用三阶收敛牛顿法、六阶收敛牛顿法以及简化牛顿法。三阶和六阶牛顿法在收敛速度上有优势,适合对大网络进行精确求解;简化牛顿法虽然收敛阶数低,但胜在每次迭代的计算开销小,适合用在需要快速获得近似解的场合。我在实际项目中的经验是,对500kV线路占比高的输电网,六阶牛顿法配合良好的初值给定,往往能在4到5次迭代内收敛到10^-8的精度,比常规牛顿法快接近一倍。
第二类改进思路是以积极控制方式的直流系统稳态模型为基础,让Jacobian矩阵不随控制方式改变而改变。这里的前提是:如果直流系统的控制方式始终保持一致,那么Jacobian矩阵中的直流相关分块就是固定的,可以预先计算并复用。但需要注意,当把冗余方程组引入潮流方程组时,Jacobian矩阵可能出现冗余系数,处理不当会降低求解收敛性。此外,如果直流系统中有多条直流线路,Jacobian矩阵阶数会进一步升高,求解速度会受到不利影响。
2.3 交替迭代法:实现简单但收敛性依赖初值
交替迭代法本质上是统一迭代法的简化版本。它的核心思想是把交直流混合求解拆成两个独立的子问题:先求解交流系统方程,此时直流系统被视为交流节点上的负荷——既包括有功功率负荷,也包括无功功率负荷;再求解直流系统方程,此时交流系统被模拟为一个位于换流器交流母线上的恒压源。
这种拆分带来的好处是计算速度快,交流部分可以继续使用成熟的交流潮流求解器,直流部分可以用专门的直流求解模块来处理。但代价也很真实——初值敏感性高。文献中明确指出,交替迭代法对交直流系统初值给定有较高要求,这容易导致求解结果收敛性较差,甚至出现不收敛和振荡。
我个人的经验是,交替迭代法的收敛性出问题,通常发生在两个场景下。一是直流系统启动时,换流器交流母线的电压初值给的偏差较大,导致直流功率迭代出现来回震荡;二是负荷水平接近极限运行点时,交流潮流本身的收敛性就在边缘,此时再叠加直流迭代误差,很容易直接发散。
文献对这两个问题分别提出了改进措施。第一个改进是结合快速解耦法:研究交直流系统之间的耦合关系,得出交流系统潮流计算方程受直流系统控制变量的具体影响,并分析控制方式对收敛性的影响。快速解耦法本身利用有功—相角、无功—电压之间的近似解耦特性来简化求解,应用到交替迭代中可以在每轮交流求解时加快速度。第二个改进是处理直流系统系数矩阵不可逆的问题。在某些控制方式下,交替迭代法进行潮流计算会出现直流系统系数矩阵奇异的情况,通过改善这一问题可以提升收敛性。此外,还可以从潮流在线计算鲁棒性和快速性的角度入手,利用牛顿法来求解直流系统,避免因交流母线电压波动导致直流系统求解不收敛。
2.4 统一迭代法与交替迭代法的对比:怎么选
实际工程项目中,两者的选型没有绝对的"哪个更好",只有"哪个更适合当前场景"。下表是我根据这篇文献以及多个实际项目经验整理的对比:
| 维度 | 统一迭代法 | 交替迭代法 |
|---|---|---|
| 收敛特性 | 收敛性好,适应性强 | 对初值敏感,易振荡 |
| 计算量 | Jacobian阶数高,每轮需重算 | 计算量小,速度快 |
| 实现复杂度 | 需要改造现有交流潮流程序 | 可以复用现有交流求解器 |
| 直流多落点场景 | 收敛优势明显 | 容易出现多换流站间的迭代耦合 |
| 在线计算适用性 | 计算量偏大,一般离线用 | 速度快,适合在线快速评估 |
| 改进方向 | 高阶牛顿法、复用Jacobian | 快速解耦、直流牛顿法、改善矩阵可逆性 |
我的建议是:如果做离线方式计算、需要高精度结果,优先考虑统一迭代法,配合六阶牛顿法或简化牛顿法来降低计算量;如果做在线安全校核或者对速度要求较高的场景,可以选交替迭代法,但一定要做好初值估计,必要时给直流系统单独配一个牛顿法求解器来提升鲁棒性。
3. 机组组合的数学本质:从混合整数规划到Benders分解
3.1 机组组合为什么是"大规模非线性混合整数规划"
机组组合(Unit Commitment, UC)问题的目标函数是:在满足负荷需求和各类安全约束的前提下,决定未来24小时内(或其他调度周期内)各机组的启停状态和出力水平,使总运行成本(燃料费用+启停费用)最低。这里的核心难点在于:机组的启停状态是0/1整数变量,而出力水平是连续变量,两者的组合构成了一个混合整数规划问题。
传统机组组合算法(如优先顺序法、动态规划法)存在两个明显短板:计算精度不高、容易陷入局部最优解。优先顺序法按经济性指标排序机组,忽略网络约束,对大规模系统来说结果往往过于粗糙;动态规划法则面临"维数灾"——机组数量超过20台时,状态空间已经膨胀到难以处理。
在交直流混联系统中,机组组合问题还要额外考虑直流输电网络的安全约束。直流线路的输送功率、换流站的控制方式、以及交直流断面之间的耦合关系,都构成了新的约束条件。这使得问题从一般的混合整数规划升级为多约束耦合的大规模非线性混合整数规划。文献中明确提到,应当考虑"计及交直流输电网络安全约束的机组组合",并采用Benders分解法来求解——这实际上是工程上处理大规模SCUC问题的主流做法。
3.2 Benders分解框架下的主层问题与子层问题
Benders分解的核心思想是把一个大规模混合整数规划问题分解为一个主问题(Master Problem)和若干子问题(Subproblem),通过主问题与子问题之间的交替迭代来逼近最优解。
具体到交直流混联系统的SCUC问题,文献给出了清晰的拆解思路:
- 主层问题:机组组合(UC)问题,只考虑机组本身的运行约束(出力上下限、最小启停时间、爬坡约束)和系统整体的功率平衡约束(不考虑详细的网络约束),求解得到一组机组启停状态和出力计划。
- 子层问题:网络安全约束校验,固定主层问题给出的机组启停状态,对网络进行潮流计算或安全校核,检查是否存在线路过载、断面越限、直流输送功率越限等问题。
- Benders割:如果子层问题发现网络约束被违反,则生成一条Benders割(切平面约束),反馈给主层问题,要求主层问题在下一轮迭代中调整机组启停方案,以避开越限区域。
主层问题和子层问题交替迭代,直到子层问题不再产生新的Benders割(即所有网络约束都满足),此时得到的解就是满足安全约束的机组组合最优解。
以Benders分解为框架的机组组合求解流程可以描述如下:
# 伪代码:Benders分解求解交直流SCUC def benders_scuc(load_forecast, dc_network, generator_data): # 初始化 unit_status = initial_commitment(load_forecast) # 初始机组启停方案 benders_cuts = [] # Benders割集合 for iteration in range(max_iterations): # 主层问题:求解含Benders割的机组组合问题 unit_status, generation = solve_unit_commitment( load_forecast, generator_data, benders_cuts ) # 子层问题:固定机组启停,进行交直流潮流安全校核 violations = network_security_check( unit_status, generation, dc_network ) if not violations: # 网络约束全部满足,当前解即为最优解 return unit_status, generation # 生成Benders割,加入主层问题 new_cut = generate_benders_cut(violations) benders_cuts.append(new_cut) raise Exception("达到最大迭代次数,未找到可行解")这段逻辑说明了一个重要特性:主层问题每轮迭代时携带的Benders割会不断"收紧"搜索空间,迫使机组组合方案逐步满足网络约束。max_iterations一般取20到30轮,对实际电网规模的问题通常已经足够。generate_benders_cut这一步是关键——如果割生成不当(过松或过紧),要么导致迭代次数爆炸,要么导致可行域被错误缩小,后面会专门展开讲。
3.3 负荷不确定性处理:分层抽样与情境修正策略
Benders分解解决的是确定性SCUC问题,但实际调度中,负荷预测必然存在误差。文献中给出的方案是采用分层采样方法获取多个场景,并采用情境修正策略来增强解的鲁棒性。
分层抽样的核心思路是:把负荷预测误差的分布按区间分层,在每个区间内分别抽样,而不是在整个分布上均匀抽样。这样做的优点是可以在保证场景代表性的同时,减少场景数量。实际操作中,通常会按照正态分布假设,将预测误差分为高、中、低三个区间(分别对应正偏差、近零、负偏差),每个区间内抽取若干场景。
抽样得到多个场景后,在确定性模型的基础上增加一组子层问题,专门用于检验每个场景的可行性。如果某个场景下网络安全约束被违反,则将该场景对应的约束纳入修正模型,调整确定性模型的最优解。这个"场景校核-约束追加-重新求解"的过程,本质上是一个多场景Benders分解的变体。
更进一步,如果负荷不确定性会影响潮流方程的不平衡量,文献建议将其作为惩罚项计入目标函数,重新构建直流SCUC模型。也就是说,目标函数从"最小化总成本"变为"最小化总成本+惩罚项",惩罚项与负荷不平衡量成正比。这相当于在目标函数中引入了安全裕度的代价,得到的机组组合解会在经济性和鲁棒性之间取一个折中。我一般会把惩罚系数设为燃料单价的20%到50%,具体值需要通过敏感性分析来确定——太小则解对不确定性不敏感,太大则经济性损失过大。
4. Benders分解实操:机组组合主层与网络校核子层的代码骨架
4.1 主层问题建模:目标函数与约束条件的关键取舍
主层问题的目标函数是机组运行总成本最小,包括燃料成本和启停成本。这里的关键在于数学表达式的选择——直接决定求解效率。
import gurobipy as gp from gurobipy import GRB def build_master_problem(generators, load_forecast, benders_cuts): m = gp.Model("UC_Master") # 决策变量 # u[i,t]: 机组i在时段t是否开机 (0/1) # p[i,t]: 机组i在时段t的出力 (连续) u = {} p = {} for i in generators.keys(): for t in range(24): u[i, t] = m.addVar(vtype=GRB.BINARY, name=f"u_{i}_{t}") p[i, t] = m.addVar(lb=0, ub=generators[i]["pmax"], name=f"p_{i}_{t}") # 目标函数:燃料成本 + 启动成本 m.setObjective( gp.quicksum( generators[i]["fuel_cost"] * p[i, t] + generators[i]["start_cost"] * u[i, t] * (1 - u[i, t-1]) for i in generators.keys() for t in range(24) ), GRB.MINIMIZE ) # 系统功率平衡约束(不含网络约束) for t in range(24): m.addConstr( gp.quicksum(p[i, t] for i in generators.keys()) >= load_forecast[t], name=f"power_balance_{t}" ) # 机组出力上下限约束 for i in generators.keys(): for t in range(24): m.addConstr(p[i, t] <= generators[i]["pmax"] * u[i, t], name=f"pmax_{i}_{t}") m.addConstr(p[i, t] >= generators[i]["pmin"] * u[i, t], name=f"pmin_{i}_{t}") # 加入Benders割约束 for cut in benders_cuts: # cut是形如 sum(alpha*t* p + beta * u) >= rhs 的线性约束 m.addConstr(cut_expr(cut, u, p) >= cut.rhs, name=f"benders_cut_{cut.id}") return m, u, p功率平衡约束这里用了>=而不是=,目的是给子层问题留出调整空间——实际系统中,机组组合解需要满足的是"发电≥负荷"的安全裕度要求,精确平衡由AGC(自动发电控制)在实时调度中完成。这在交直流混联系统中尤为重要,因为直流功率的输送计划往往在日内还会调整,主层问题保留一定正向裕度是工程上的常规做法。
Benders割的表达式在cut_expr中实现,本质上是把子层问题返回的对偶乘子与主问题变量做线性组合。割的松紧直接影响迭代次数过松会导致子问题反复报越限,过紧则会切除可行解区域。
4.2 子层问题:交直流潮流校核的关键实现点
子层问题要做的不是重新求解机组组合,而是在固定机组启停状态下,对网络进行交直流潮流计算,检查所有安全约束是否满足。
def network_security_check(unit_status, generation, dc_network, ac_network): """ 对给定的机组组合方案执行交直流潮流安全校核 返回越限约束列表(供Benders割生成使用) """ violations = [] # 步骤1: 根据机组启停状态构建节点注入功率 bus_injection = compute_bus_injection(unit_status, generation) # 步骤2: 调用交直流潮流求解器(统一迭代法或交替迭代法) # 这里以交替迭代法为例 dc_power = initial_dc_power(dc_network) # 初值 for iter in range(20): # 交流潮流求解:将直流功率作为节点负荷 ac_result = solve_ac_power_flow(bus_injection, dc_power) # 直流潮流求解:将交流母线电压作为恒压源 dc_result = solve_dc_power_flow(ac_result.bus_voltage, dc_network) # 检查交流-直流接口收敛条件 if (abs(dc_result.power_injection - dc_power) < tolerance).all(): break dc_power = 0.5 * dc_result.power_injection + 0.5 * dc_power # 阻尼更新 # 步骤3: 检查网络越限情况 for line in ac_network.lines: if ac_result.line_flow(line) > line.thermal_limit: violations.append(LineViolation(line, ac_result.line_flow(line))) for dc_line in dc_network.lines: if dc_result.power(dc_line) > dc_line.capacity_limit: violations.append(DCViolation(dc_line, dc_result.power(dc_line))) return violations这里有几个实现细节值得注意。交流-直流接口迭代时,我用了0.5的阻尼系数来更新直流功率——这是处理初值敏感问题的常用手段。阻尼系数太大容易振荡发散,太小则收敛速度慢,0.5是一个稳健的起点。实际调试中,如果发现直流功率在两次迭代间来回跳跃,可以把阻尼系数降到0.3;如果收敛速度太慢,可以升到0.7。这个"交流算一次、直流算一次、中间做阻尼耦合"的模式,相当于把交替迭代法嵌入到了安全校核子层问题里,和文献中描述的交替迭代法思路一致。
4.3 Benders割生成:避免"过紧"和"过松"的两个关键参数
Benders割的生成质量决定了整个分解算法的收敛速度。割太松,主层问题迭代很多轮才收敛;割太紧,主层问题可能找不到可行解。
def generate_benders_cut(violations): """ 根据越限信息生成Benders割 关键参数:对偶乘子(lambda)和割的有效范围 """ # 提取越限线路对偶乘子 # lambda值反映了该线路约束的"稀缺程度" lambda_line = extract_dual_multipliers(violations) # 构建割表达式: sum_t sum_i (lambda * sensitivity * p[i,t]) >= rhs # sensitivity是线路潮流对机组出力的灵敏度系数 cut_expr = build_linear_constraint(lambda_line, sensitivity_coefficients) # 设置割的容忍度参数 # tolerance太小则割过紧(容易误判),太大则割过松(迭代次数多) cut_expr.tolerance = 1e-4 return cut_exprtolerance参数是割生成中容易被忽视但影响很大的量。我建议设为1e-4(对应潮流计算结果的精度量级)——如果小于潮流计算的收敛精度,子层问题会把数值噪声误判为越限,导致割过于激进;如果大于1e-3,一些真实的越限会被掩盖,割的作用被削弱。sensitivity_coefficients可以根据直流潮流(DC power flow)的灵敏度公式解析计算,也可以用摄动法数值求解,前者快但精度受假设限制,后者慢但更准确。对于交直流混联系统,我建议用摄动法——直流线路的投切会改变网络拓扑,解析灵敏度公式在这种情况下往往不适用。
这个"主问题+Benders割+子问题校核"的三层循环,就是文献中提到的"交替迭代计算主层问题和子层问题,获得交直流混联电力系统机组组合最优解"的具体工程实现。关键在于:主层问题使用混合整数规划求解器,子层问题使用潮流求解器,二者通过Benders割进行信息交互。这种架构的好处在于,每次迭代需要重复计算的只是"修正"部分,而不是整个问题从零开始求解。
5. 避坑实录:交直流潮流计算与SCUC项目的五个高频翻车点
5.1 统一迭代法Jacobian矩阵不更新的"翻车"
现象:采用简化模型,设定Jacobian矩阵只计算一次,结果在某种控制方式下,迭代到第3轮时残差不再下降,反而回升,最终发散。
原因:文献中提到"控制方式不改变时Jacobian矩阵可以复用",但实际操作中,换流器的控制方式在迭代过程中可能因为触发角越限而切换(例如定功率控制切换到定最小触发角控制)。控制方式一变,Jacobian矩阵中直流分块的数值就必须更新,复用假设失效。
解决:在每次迭代前增加一个控制方式状态检测——检查所有换流器的触发角是否处于允许范围内,如果越限,强制更新Jacobian矩阵中对应的直流分块。我在项目里加了这个检测后,统一迭代法的收敛可靠性显著提升。
5.2 交替迭代法初值给不好的"玄学"问题
现象:同样的网络模型和负荷水平,初值用平启动(flat start,电压幅值1.0,相角0度)能收敛,但用前一天的历史潮流结果做初值反而振荡不收敛。
原因:交替迭代法对初值的敏感度极高。历史潮流结果虽然接近真实解,但因为是"接近"而不是"在收敛域内",在某些工况下恰好落在交替迭代的振荡区内。平启动虽然粗糙,但各节点电压一致,不会误导直流系统迭代的初值估计。
解决:交替迭代法不要直接使用历史工况的数据做初值。推荐做法是:先用恒定阻抗负荷模型跑一轮纯交流潮流,把得到的电压结果作为交直流交替迭代的初值,直流功率初值用额定功率的50%起步,逐步逼近。这个方法不需要额外求解器,实现成本最低。
5.3 直流系统系数矩阵不可逆
现象:在某些控制方式下(特别是定熄弧角控制方式),交替迭代法求解直流系统方程时,系数矩阵奇异,程序直接报错。
原因:这是文献中明确提到的"直流系统系数矩阵不可逆"问题。定熄弧角控制下,换流器的控制方程与某些变量之间存在线性相关关系,导致系数矩阵秩亏。
解决:两个方案,按优先级排序。第一,切换控制方式模型的表示方法,把熄弧角约束从等式约束改为不等式约束,配合目标函数中的最小功率损耗项来求解——这相当于把直流系统方程从"方程求解"变成"优化求解",矩阵奇异问题自然消失。第二,用牛顿法替代直接解法来求解直流系统方程,利用阻尼因子避免在奇异点附近跳跃。
5.4 Benders分解迭代次数爆炸
现象:SCUC问题在Benders分解框架下跑了50轮还没收敛,每轮生成的Benders割越来越弱,主层问题解几乎不变。
原因:割过松。子层问题返回的越限信息只包含了线路号,没有包含越限程度的加权信息,导致生成的割只约束了"越限线路下游的机组出力",而没有约束"引起越限的上游机组组合"。本质上是没有利用对偶乘子信息来构造"强割"。
解决:生成Benders割时纳入对偶乘子与灵敏度系数。从越限线路的潮流表达式中提取对偶乘子,然后乘以灵敏度系数构建线性约束。这相当于把"线路有功越限"翻译成"哪些机组的出力组合导致了越限",割的强度完全不同。实际项目中,用强割替代弱割后,迭代次数从50轮降到8到12轮。
5.5 负荷不确定性场景数量失控
现象:为了处理负荷不确定性,生成了200个随机场景,每个场景都做一次网络校核,结果子层问题计算时间占了整个SCUC求解的80%以上,主层问题反而成了"空闲等待"的一方。
原因:场景生成没有使用分层抽样,直接在连续分布上随机抽样,导致大量冗余场景聚集在概率密度高的区域,而这些场景的解耦约束高度相关,没有提供新的信息。
解决:改用分层抽样,把预测误差分布分成5个区间(正偏差大、正偏差小、近零、负偏差小、负偏差大),每个区间抽取3到4个代表性场景,总计15到20个场景。这相当于把场景数量降了一个数量级,而覆盖的误差范围不缩小。我在实际项目中用这个方法,子层问题计算时间从42分钟降到9分钟,而最终机组组合方案的鲁棒性几乎没变。此外还需要在每个场景校核后,将所有场景的Benders割合并进主层问题,而不是逐场景串行迭代,这样能充分利用并行计算能力。
6. 收敛性调优与在线计算落地:一个容易被忽视的阻尼系数技巧
交直流混联潮流计算和SCUC项目的最后一步,往往是收敛性瓶颈。统一迭代法虽然收敛性好,但Jacobian矩阵重计算开销大;交替迭代法速度快,但初值和振荡问题让人头疼。这里分享一个在两套算法里都适用的调试习惯。
交替迭代法的核心问题是交流系统和直流系统之间的耦合迭代。交流系统算完给出母线电压,直流系统用这个电压算功率,功率反馈回交流系统再算一遍。这两个系统在电气上是强耦合的,但在数值上却被拆开了。如果直接把新算出的直流功率作为下一次交流迭代的输入,极易形成"过修正"——交流算出的功率注入偏大,直流纠正后偏小,下一次交流又偏大,形成等幅振荡。
我习惯的做法是对直流功率的更新引入阻尼系数。假设第k轮迭代后直流系统的功率注入为P_dc^(k),则下一轮交流潮流使用的直流功率注入为:
P_dc^(k+1) = alpha × P_dc^(k) + (1 - alpha) × P_dc^(k-1)
alpha的取值在0.2到0.5之间。alpha越小,阻尼越强,收敛越稳定但速度变慢;alpha越大,响应越快但容易振荡。这个公式实现起来只需要三行代码,但效果往往比更换迭代方法更立竿见影。
有一次我接手一个特高压直流馈入系统的潮流计算项目,对方用交替迭代法怎么调初值都不收敛,看了一下他们的控制台日志,直流功率在两次迭代间波动幅度达到20%。我加了一行阻尼更新,alpha取0.3,第二轮迭代波动降到5%,第五轮就稳定收敛了。从那以后,我每次搭交替迭代法的交直流潮流程序,都会强制要求第一步先把阻尼更新逻辑写好,再谈其他参数——这是花最少时间解决最多问题的步骤。
同样的道理也适用于SCUC的Benders分解框架。主层问题给出的机组组合方案在第一次校核时通常会有少量越限,如果直接把这些越限全部作为硬约束塞回去,主层问题可能直接无解;如果用阻尼思想,只纳入60%的越限约束强度,迭代过程会平稳很多。具体实现上,可以给Benders割的右侧常数乘一个0.6到0.8的松弛系数,每一轮迭代后逐渐恢复到1.0。这种做法在工程上叫"逐步紧化约束",比一次性把所有约束塞入的方式更容易收敛,最终解的质量也不受影响。
希望这些从实际项目中磨出来的参数和经验,能帮你在做交直流混联电力系统潮流计算和SCUC求解时少走几步弯路。数据、公式、控制方式和迭代策略,都是可以在模型上反复验证的——关键是先跑通一条完整的链路,再去追求最优。
本文还有配套的精品资源,点击获取