Я просто играю с учебником Paraboloid в OpenMDAO. Я пробовал что-то простое, в основном меняя входные значения на компонент Paraboloid. См. Следующий код. Когда я запустил его, он напечатает тот же результат, как если бы ничего не произошло. Так, что происходит? если у меня есть группа, как мне изменить входные данные?В OpenMDAO как указать значения для IndepVarComp или других компонентов?
from __future__ import print_function
from openmdao.api import IndepVarComp, Component, Problem, Group
class Paraboloid(Component):
""" Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """
def __init__(self):
super(Paraboloid, self).__init__()
self.add_param('x', val=0.0)
self.add_param('y', val=0.0)
self.add_output('f_xy', val=0.0)
def solve_nonlinear(self, params, unknowns, resids):
"""f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3
"""
x = params['x']
y = params['y']
unknowns['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0
def linearize(self, params, unknowns, resids):
""" Jacobian for our paraboloid."""
x = params['x']
y = params['y']
J = {}
J['f_xy', 'x'] = 2.0*x - 6.0 + y
J['f_xy', 'y'] = 2.0*y + 8.0 + x
return J
if __name__ == "__main__":
top = Problem()
root = top.root = Group()
root.add('p1', IndepVarComp('x', 3.0))
root.add('p2', IndepVarComp('y', -4.0))
root.add('p', Paraboloid())
root.connect('p1.x', 'p.x')
root.connect('p2.y', 'p.y')
root.p1.x=3.0;
root.p2.y=-4.0;
top.setup()
top.run()
print(root.p.unknowns['f_xy'])
root.p1.x=5.0;
root.p2.y=5.0;
top.setup()
top.run()
print(root.p.unknowns['f_xy'])
мне удалось изменить входные значения для этой системы путем установки значений с следующий код: top.setup() root.p1.unknowns ['x'] = 5.0; root.p2.unknowns ['y'] = 5.0; top.run() print (root.p.unknowns ['f_xy']) –
Кажется, OpenMDAO игнорирует элементы данных. Когда добавляется вывод, он не является членом, а просто строкой для словарного ключа, которая должна быть заполнена при доступе к компоненту. Кажется, IndepVarComp строит свой словарь в настройке со значением по умолчанию, поэтому раньше он был проигнорирован. –
Я задаю вопрос, правильно ли я устанавливаю значения? Есть ли метод get() и set(), который я должен использовать вместо этого? Поддерживает ли OpenMDAO отслеживание изменений ввода для других целей? –