1

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

(D 是从 Python 导入的 numpy 矩阵)

import pyomo
from pyomo.environ import *
from array import *


import numpy as np
import scipy as sp
from diff_matrix import D  ##N=10????
print(D)


m =ConcreteModel()
...
m.n = Param(initialize = 10, within = Integers)               
m.Ns = Set(initialize = range(0,value(m.n)))   
m.x1 = Var(m.N, domain = Reals)
m.D = Param(m.N, m.N, initialize=D)

m.f_x1 = Var(m.N)
def f_x1_definition(model,i):
        return m.f_x1[i] == sum(m.x1[j]*m.D[i,j] for j in range(value(m.n)))
m.f_x1_const = Constraint(m.Ns, rule = f_x1_definition)

但我得到下一个错误:

   ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

有什么帮助吗?

4

1 回答 1

2

最简单的事情是只使用 Pythonsum()函数而不是 Pyomosummation()函数:

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 组件(VarParam)相乘时,始终将 Pyomo 对象放在首位。这是由于当前版本的 Pyomo(至少 5.1)中 NumPy 运算符重载和 Pyomo 运算符重载之间的冲突。


编辑 1:关于颠倒操作数顺序的注意事项:在您最初的问题中,尚不清楚将m.D其定义为 Pyomo Param。表达式中 Pyomo 对象的顺序无关紧要。上面提到的运算符重载问题在将 NumPy 对象与 Pyomo 组件相乘时出现。此外,此时(直到 Pyomo 5.1),Pyomo 不支持矩阵代数 - 即矩阵-矩阵或矩阵-向量乘积之类的运算。由于每个表达式都是标量表达式,因此交换运算 ( +, *) 中的项的顺序不会改变表达式的含义。

编辑 2 :您的错误与您最初发布的sum/无关。summation问题在于你如何初始化你的参数。此时(直到 Pyomo 5.1),您不能直接从numpy.ndarray. 您需要首先将 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))
于 2017-01-24T17:05:58.220 回答