通过向量对矩阵乘积的Pyomo求和

时间:2017-01-24 16:42:33

标签: matrix pyomo

我编辑我的代码,包括所涉及的所有参数和变量:

(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)

任何帮助?

1 个答案:

答案 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 Varm.x1)和矩阵(m.D)的顺序。根据您的其他问题(Importing a matrix from Python to Pyomo),我假设矩阵是NumPy矩阵。将NumPy值与Pyomo组件(VarParam)相乘时,请始终将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))