2017-01-24 19 views
1

отредактировать мой код, включая все параметры и переменные, участвующих:Pyomo суммирования произведения матрицы на вектор

(D является NumPy матрица импортируется из Python)

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 Var (m.x1) и матрица (m.D) , Исходя из ваших других вопросов (Importing a matrix from Python to Pyomo), я предполагаю, что матрица является матрицей NumPy. При умножении значения NumPy и компонента Pyomo (Var или Param) всегда сначала ставьте объект Pyomo. Это связано с конфликтом между перегрузкой оператора NumPy и перегрузкой оператора Pyomo в текущих версиях Pyomo (до 5,1).


EDIT 1: Примечание на изменение порядка операндов: в исходном вопросе, не было ясно, что m.D был быть определен как Pyomo Param. Нет никаких проблем с порядком объектов Pyomo в выражениях. Проблема перегрузки оператора, упомянутая выше, равна только при умножении объектов NumPy на компоненты Pyomo. Далее, в это время (вплоть до Pyomo 5.1), Pyomo не поддерживает матричную алгебру, то есть операции, подобные матрично-матричным или матрично-векторным произведениям. Поскольку каждое выражение является скалярным выражением, упорядочение членов в коммутативной операции (+, *) не изменяет значения выражения.

EDIT 2: Ваша ошибка не имеет ничего общего с sum/summation, который вы изначально разместили. Проблема заключается в том, как вы инициализируете свой параметр Param. В это время (до 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