Pyomo带字符串索引参数定义及PI/PJ除法运算报错求助
Pyomo带索引参数除法运算报错解决方案
错误原因
- 集合初始化逻辑错误:原有代码误将集合长度作为初始化值,没有传入实际的字符串元素,导致集合与后续参数的索引维度不匹配
- 参数初始化格式错误:传入参数字典时额外嵌套了列表,导致Pyomo无法正确读取键值对
- 表达式定义不符合Pyomo语法:在expr参数内写入生成器表达式,且未给带索引的参数
PI、PJ指定对应维度的索引,同时表达式括号逻辑有误,减1操作本该在指数运算的结果后执行,原有写法将其放到了整个乘法项外
修正后完整代码
from pyomo.environ import ConcreteModel, Set, Param, Expression HN_model = ConcreteModel() # 修正集合初始化:直接传入实际元素 i = ['U4241', 'U241', 'U241A'] HN_model.i = Set(initialize=i) j = ['U4283', 'U283', 'U283A', 'U3283', 'U2280', 'U1280'] HN_model.j = Set(initialize=j) k = ['PSA4241', 'PSA241', 'PSA241A', 'PSA3241'] HN_model.k = Set(initialize=k) s = [1] HN_model.s = Set(initialize=s) # 直接传入s列表,和后续参数的s=1匹配 HN_model.ij = Set(within=HN_model.i*HN_model.j, initialize = [(i,j) for i in HN_model.i for j in HN_model.j]) # 固定参数定义无问题 HN_model.T = Param(initialize=300.00) HN_model.Cp_hidrogenio = Param(initialize=29.00) HN_model.Cp_metano = Param(initialize=50.00) HN_model.Cp_medio = Param(initialize=35.00) HN_model.ef = Param(initialize=0.6) HN_model.T0 = Param(initialize=288.7) HN_model.P0 = Param(initialize=1.00) HN_model.R = Param(initialize=8.314) HN_model.PPi = Param(initialize=5.5) HN_model.gama = Expression(expr=HN_model.Cp_medio/(HN_model.Cp_medio - HN_model.R)) # 修正参数初始化:直接传入字典,不要嵌套列表 PJ = {} PJ['U4283',1] = 137 PJ['U283',1] = 88.5 PJ['U283A',1] = 88.5 PJ['U3283',1] = 30 PJ['U2280',1] = 30 PJ['U1280',1] = 30 HN_model.PJ = Param(HN_model.j, HN_model.s, initialize=PJ) PI = {} PI['U4241',1] = 21.3 PI['U241',1] = 21.1 PI['U241A',1] = 21.1 HN_model.PI = Param(HN_model.i, HN_model.s, initialize=PI) # 修正表达式定义:用rule函数按索引生成对应表达式,修正括号逻辑 def u_power_rule(model, i, j, s): return (model.T/model.ef) * model.Cp_medio * ( (model.PJ[j,s]/model.PI[i,s])**((model.gama-1)/model.gama) - 1 ) * (model.T/model.T0) * (model.P0/model.PPi) HN_model.u_power = Expression(HN_model.ij, HN_model.s, rule=u_power_rule)
内容的提问来源于stack exchange,提问作者Patricia Rodrigues da Silva
相关产品推荐
相关产品推荐

