2016-08-23 4 views
0

У меня есть независимая переменная x, которая является вектором, обрабатываемым как массив numpy. Я хотел бы иметь возможность ограничить некоторые из значений в этом векторе, основываясь на других значениях вектора. то есть x_ (k) < x_ (k + 1). Я пробовал:Передача одного скаляра из массива numpy в OpenMDAO 1.x

root.add('p1',IndepVarComp('x',x=np.ones(10,dtype=float)) 
root.add('con',ExecComp('c0=x[1]-x[0]') 
root.connect('p1.x','con.x') 

Это дает мне ошибки о переменной не существует и массивы пытаются подключиться к поплавков. Каков правильный синтаксис для подключения определенного значения из выходного массива к входу масштабирования?

ответ

0

В коде, который вы набрали, есть пара отсутствующих скобок, но они должны быть переписаны здесь. Главное, что вам не хватало, это дополнительный аргумент ExecComp, чтобы он знал, как изменить размер входящего x.

import numpy as np 

from openmdao.api import Problem, Group, IndepVarComp, ExecComp 

prob = Problem() 
prob.root = root = Group() 

root.add('p1', IndepVarComp('x', np.array([3, 7, 5], dtype=float))) 
root.add('con', ExecComp('co = x[1] - x[0]', x=np.zeros(3,))) 
root.connect('p1.x','con.x') 

prob.setup() 
prob.run() 
print('con', prob['con.co']) 

Когда я запускаю это, я получаю ожидаемый результат:

############################################## 
Setup: Checking root problem for potential issues... 

No recorders have been specified, so no data will be saved. 

Setup: Check of root problem complete. 
############################################## 

('con', 4.0) 

Альтернативный способ сделать это, чтобы использовать выражение SCALER, а затем выдавать соединения из одного индекса «p1.x ':

root.add('con2', ExecComp('co = b - a')) 
root.connect('p1.x', 'con2.a', src_indices=[0]) 
root.connect('p1.x', 'con2.b', src_indices=[1])