You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

额外建议

  1. 检查Bus_Vnom数据是否正确,确保每个节点的额定电压Vnom_pn取值合理
  2. 若确实需要针对特定节点或时段调整约束,应基于已知的拓扑/运行参数(而非决策变量初始值)进行条件判断
  3. 可以先关闭电压约束,验证基础潮流模型是否可行,逐步添加约束排查问题

内容的提问来源于stack exchange,提问作者Kirn Zafar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:20:15