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

使用Pyomo优化家庭电池储能时SOE计算报错如何解决

修复方案

核心错误原因

你的报错由变量与约束重名覆盖导致:你先将model.soe定义为储能能量状态的索引变量,后续写SOE时序平衡约束时,又用了model.soe作为约束名称,直接覆盖了原有变量,导致后续所有调用model.soe的逻辑失效,触发内核重启。

其他需要同步修正的问题

  • 冗余的初始SOE约束:你已经在时序平衡规则中给t=1的场景设置了初始值等于soe_start,不需要再单独定义soe_start_rule重复约束
  • 未定义的demand变量:你没有提前声明model.demand变量就直接在约束中调用,会触发变量不存在报错
  • 目标函数遍历集合错误:目标函数中你遍历了不存在的model.n属性,正确的遍历对象是你定义的时间集合model.t

修正后完整代码

model = ConcreteModel()

n = 30
model.t = RangeSet(1, n)

model.consumption = Param(model.t, initialize = df['Consumption'])
model.pv = Param(model.t, initialize = df['PV'])
model.emissionen = Param(model.t, initialize = df['CO2-Emissions'])
model.heatpump = Param(model.t, initialize = df['Heatpump'])

in_out_leistung = bt.iloc[1]['Values']
in_out_efficiency = bt.iloc[2]['Values']
battery_capacity = bt.iloc[0]['Values'] 
soe_start = 0
elec_import_max = 200

# 变量定义
model.soe = Var(model.t, initialize = 0, within = NonNegativeReals)
model.charge = Var(model.t, within = NonNegativeReals, initialize = 0)
model.discharge = Var(model.t, within = NonNegativeReals, initialize = 0)
model.elec_grid = Var(model.t, bounds = (0, elec_import_max), within = NonNegativeReals)

# 充放电功率上限约束
def discharge_capacity_rule(model, t):
    return model.discharge[t] <= in_out_leistung
model.discharge_capacity_rule = Constraint(model.t, rule = discharge_capacity_rule)

def charge_capacity_rule(model, t):
    return model.charge[t] <= in_out_leistung
model.charge_capacity_rule = Constraint(model.t, rule = charge_capacity_rule)

# 储能容量上限约束
def max_capacity_rule(model, t):
    return model.soe[t] <= battery_capacity
model.max_capacity_rule = Constraint(model.t, rule = max_capacity_rule)

# SOE时序平衡约束:改名避免和变量重名
def soe_balance_rule(model, t):
    if t == 1:
        return model.soe[t] == soe_start
    else:
        return model.soe[t] == model.soe[t-1] + (model.charge[t] * in_out_efficiency) - model.discharge[t] / in_out_efficiency
model.soe_balance_rule = Constraint(model.t, rule = soe_balance_rule)

# 周期末SOE等于0,满足首尾为空要求
def soe_end_rule(model):
    return model.soe[n] == 0
model.soe_end_rule = Constraint(rule = soe_end_rule)

# 功率平衡约束:直接合并需求侧计算,无需额外定义demand变量
def lastdeckung_rule(model, t):
    return model.pv[t] + model.elec_grid[t] + model.discharge[t] == model.heatpump[t] + model.consumption[t] + model.charge[t]
model.lastdeckung_rule = Constraint(model.t, rule = lastdeckung_rule)

# 目标函数:修正遍历集合为model.t
def emissionsreduzierung_rule(model):
    return sum(model.elec_grid[t] * model.emissionen[t] for t in model.t)
model.emissionsreduzierung = Objective(rule = emissionsreduzierung_rule, sense = minimize)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:36:03