2017-01-24 64 views
1

修改我的代碼,包括所有的參數和所涉及的變量:Pyomo總和由矢量

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

任何幫助嗎?

回答

0

最簡單的事情是隻使用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對象放在第一位。這是由於在當前版本的Pyomo中,NumPy運算符重載和Pyomo運算符重載(至少5.1)之間的衝突。


編輯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)) 
+0

非常感謝!我改變了它,但我仍然有一個錯誤... ValueError:具有多個元素的數組的真值是不明確的。使用a.any()或a.all()任何想法? :) – Michael

+0

在我們診斷您的問題之前,您需要提供更多的模型。具體來說,你如何定義'm.f_x1','m.x1'和'm.D'。還要注意:如果你使用'model'作爲規則(函數)的第一個參數,那麼你需要在函數內部使用'model'。 – jsiirola