使用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
相关产品推荐
相关产品推荐

