Pyomo抽象模型Set未构建无法迭代实现阻抗转导纳的问题咨询
报错原因
Pyomo的AbstractModel是抽象模板,所有Set、Param组件都只是占位符,没有绑定实际数据,因此无法直接遍历、取值。同时你原代码中的循环写法for model.i in model.i存在严重错误:循环变量和你的Set组件重名,会直接覆盖model.i组件,即便模型实例化后也会导致后续逻辑异常。此外代码中的break会导致仅计算第一个Set元素的导纳,如需完成全量转换需要删除。
解决方案
方案1:使用Param内置规则定义计算逻辑(推荐)
这是Pyomo抽象模型的标准用法,无需手动写循环,Pyomo会在模型实例化时自动遍历所有Set元素完成计算:
import numpy as np from pyomo.environ import AbstractModel, Set, Param, Var, Reals model = AbstractModel() model.i = Set() model.j = Set() model.R = Param(model.i, mutable=True) model.X = Param(model.i, mutable=True) # 定义导纳计算规则 def G_calc_rule(model, i): return model.R[i] / (model.R[i] ** 2 + model.X[i] ** 2) def B_calc_rule(model, i): return - model.X[i] / (model.R[i] ** 2 + model.X[i] ** 2) # 用rule参数绑定计算逻辑,实例化时自动完成赋值 model.G = Param(model.i, rule=G_calc_rule, mutable=True) model.B = Param(model.i, rule=B_calc_rule, mutable=True) # 其余组件定义保持不变 model.Pd = Param(model.j, mutable=True) model.Qd = Param(model.j, mutable=True) model.vol = Var(model.j, bounds=(0.9,1.1), domain=Reals) model.ang = Var(model.j, bounds=(-np.pi/6, np.pi/6), domain=Reals) model.Pg = Var(model.j, bounds=(0,2), domain=Reals) model.Qg = Var(model.j, bounds=(-1.5,1.5), domain=Reals)
后续你正常传入数据调用model.create_instance()生成实例即可,导纳会自动完成计算。
方案2:模型实例化后手动循环赋值
如果你需要手动控制赋值流程,可以先完成抽象模型定义,等生成实际实例后再执行循环:
# 抽象模型定义阶段,不要写循环逻辑 model = AbstractModel() model.i = Set() model.j = Set() model.R = Param(model.i, mutable=True) model.X = Param(model.i, mutable=True) model.G = Param(model.i, mutable=True) model.B = Param(model.i, mutable=True) model.Pd = Param(model.j, mutable=True) model.Qd = Param(model.j, mutable=True) model.vol = Var(model.j, bounds=(0.9,1.1), domain=Reals) model.ang = Var(model.j, bounds=(-np.pi/6, np.pi/6), domain=Reals) model.Pg = Var(model.j, bounds=(0,2), domain=Reals) model.Qg = Var(model.j, bounds=(-1.5,1.5), domain=Reals) # 传入数据生成实例后再执行循环 instance = model.create_instance("你的数据文件路径") # 也可以传入dict格式数据 for i in instance.i: instance.G[i] = instance.R[i] / (instance.R[i] ** 2 + instance.X[i] ** 2) instance.B[i] = - instance.X[i] / (instance.R[i] ** 2 + instance.X[i] ** 2)
内容的提问来源于stack exchange,提问作者ZHEHAN ZHAO
相关产品推荐
相关产品推荐

