Pyomo电压下限约束配置致IPOPT求解不可行,求代码修正
电压下限约束导致IPOPT求解不可行的问题解决
问题背景
使用Pyomo编写配电网电压约束,求解器采用IPOPT,定义电压法定限值V_statutory_lim=[0.95, 1.05],编写的电压下限约束规则如下:
def V_limit_rule_lower(model,k,s,t): if k=='slack': return pyo.Constraint.Skip else: V_nom = Bus_Vnom.loc[k, 'Vnom_pn'] ex=model.V_mag_2[k, s, t]/(V_nom**2) #print("exL") if value(ex) < 0.95*0.95: #print("RETURN") #return ((V_nom * V_statutory_lim[0]) ** 2, model.V_mag_2[k, s, t]) return (model.V_mag_2[k, s, t]>=(V_nom * V_statutory_lim[0]) ** 2) #return (model.V_mag_2[k, s, t] == V_nom ** 2) #return model.V_mag_2[k, s, t] >= (V_nom * V_statutory_lim[0]) ** 2 else: return pyo.Constraint.Skip model.V_limits_lower_con = pyo.Constraint(model.Buses, model.Phases_abc, model.time, rule=V_limit_rule_lower)
同时存在逻辑类似的电压上限约束,运行后IPOPT返回不可行结果,报错信息:
EXIT: Converged to a point of local infeasibility. Problem may be infeasible.
WARNING: Loading a SolverResults object with a warning status into
model.name="unknown";
- termination condition: infeasible
- message from solver: Ipopt 3.11.1: Converged to a locally infeasible point. Problem may be infeasible.
核心问题分析
代码中的致命错误是在约束构建阶段调用value(ex):
model.V_mag_2是决策变量,在模型构建阶段还未被求解,value()只能获取其初始值(通常为0或默认初始化值)- 这种条件判断会导致:初始值高于限值的节点被错误跳过约束,初始值低于限值的节点被强制添加约束,完全违背了电压约束的本质——所有非松弛节点在整个求解过程中都必须满足电压上下限
修正方案
移除基于初始值的条件判断,直接为所有非松弛节点添加全局电压上下限约束:
修正后的电压约束代码
# 电压下限约束 def V_limit_lower_rule(model, k, s, t): if k == 'slack': return pyo.Constraint.Skip V_nom = Bus_Vnom.loc[k, 'Vnom_pn'] lower_bound = (V_nom * V_statutory_lim[0]) ** 2 return model.V_mag_2[k, s, t] >= lower_bound model.V_limits_lower_con = pyo.Constraint(model.Buses, model.Phases_abc, model.time, rule=V_limit_lower_rule) # 电压上限约束(对应逻辑) def V_limit_upper_rule(model, k, s, t): if k == 'slack': return pyo.Constraint.Skip V_nom = Bus_Vnom.loc[k, 'Vnom_pn'] upper_bound = (V_nom * V_statutory_lim[1]) ** 2 return model.V_mag_2[k, s, t] <= upper_bound model.V_limits_upper_con = pyo.Constraint(model.Buses, model.Phases_abc, model.time, rule=V_limit_upper_rule)
额外建议
- 检查
Bus_Vnom数据是否正确,确保每个节点的额定电压Vnom_pn取值合理 - 若确实需要针对特定节点或时段调整约束,应基于已知的拓扑/运行参数(而非决策变量初始值)进行条件判断
- 可以先关闭电压约束,验证基础潮流模型是否可行,逐步添加约束排查问题
内容的提问来源于stack exchange,提问作者Kirn Zafar
相关产品推荐
相关产品推荐

