我编辑我的代码,包括所涉及的所有参数和变量:
(D是从Python导入的numpy矩阵)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
但我得到了下一个错误:
> functionBody(functionName)
任何帮助?
答案 0 :(得分:1)
最简单的方法是使用Python sum()
函数而不是Pyomo summation()
函数:
def f_x1_definition(model,i):
return model.f_x1[i] == sum(model.x1[j]*model.D[i,j] for j in range(value(model.n)))
另请注意,我颠倒了Pyomo Var
(m.x1
)和矩阵(m.D
)的顺序。根据您的其他问题(Importing a matrix from Python to Pyomo),我假设矩阵是NumPy矩阵。将NumPy值与Pyomo组件(Var
或Param
)相乘时,请始终将Pyomo对象放在第一位。这是由于NumPy运算符重载与当前Pyomo版本中Pyomo运算符重载之间的冲突(至少达到5.1)。
编辑1 :关于颠倒操作数顺序的注意事项:在原始问题中,不清楚m.D
是否被定义为Pyomo Param
。表达式中没有关于Pyomo对象的顺序。当NumPy对象与Pyomo组件相乘时,上面提到的运算符重载问题仅 。此外,此时(通过Pyomo 5.1),Pyomo不支持矩阵代数 - 即矩阵矩阵或矩阵向量乘积等运算。由于每个表达式都是标量表达式,因此交换操作(+
,*
)中的术语顺序不会改变表达式的含义。
编辑2 :您的错误与您最初发布的sum
/ summation
无关。问题在于如何初始化Param。此时(通过Pyomo 5.1),您无法直接从numpy.ndarray
初始化Param。您需要先将NumPy对象转换为Python字典,例如:
m.D = Param(m.N, m.N, initialize=dict(((i,j),D[i,j]) for i in m.N for j in m.N))