OpenMDAO1.x: обратная связь переменной для нескольких запусков (список выполнения)

У меня есть два компонента comp1 и comp2, которые образуют задачу, которую нужно запускать несколько раз. Для этого я обнаружил, что могу использовать UniformDriver (я не знаю, является ли он наиболее подходящим для моей цели). Тем не менее, я хотел бы отправить отзыв из comp2 в comp1. Итак, после первого запуска я получаю вывод от comp2, который для следующего запуска должен быть вводом для comp1. Я думаю, что следующий пример немного проясняет, что я хотел бы сделать:

from openmdao.api import Component, Group, Problem, UniformDriver


class Times2Plus(Component):
    def __init__(self):
        super(Times2Plus, self).__init__()
        self.add_param('x', 1.0)
        self.add_param('z', 2.0)
        self.add_output('y', shape=1)

    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['y'] = params['x'] * 2.0 + params['z']

class Power3(Component):
    def __init__(self):
        super(Power3, self).__init__()
        self.add_param('y', shape=1)
        self.add_output('x', shape=1) # feedback to params['x'] as input in next run

    def solve_nonlinear(self, params, unknowns, resids):
        unknowns['x'] = params['y'] ** 3.0

prob = Problem(root=Group())
prob.driver = UniformDriver(num_samples=5)
prob.root.add('comp1', Times2Plus())
prob.root.add('comp2', Power3())
prob.root.connect('comp1.y', 'comp2.y')
prob.setup()
prob.run()

По сути, выход x компонента Power3 предыдущего запуска должен быть подключен к входу x компонента Times2Plus. Кроме того, у меня есть заранее известный параметр z для компонента Times2Plus, который отличается для каждого запуска. Как лучше всего включить этот изменяющийся параметр и опцию обратной связи?


person maxbec    schedule 20.11.2015    source источник
comment
Выполняете ли вы итерацию с фиксированной точкой, продолжая запускать comp1 и comp2 до тех пор, пока значения не перестанут изменяться и система не сойдется?   -  person Kenneth Moore    schedule 20.11.2015
comment
По сути, мой comp1 является оберткой для некоторой внешней программы для расчета нагрузок для определенной скорости, а comp2 принимает нагрузки в качестве входных данных для расчета перемещений. Теперь для следующей скорости, которая соответствует следующему запуску, я хотел бы передать рассчитанные смещения в качестве входных данных для comp1 для расчета новых нагрузок. Я знаю количество прогонов, которое просто соответствует длине моего вектора скорости, поэтому мне не нужно повторять. Как я могу реализовать такую ​​структуру в OpenMDAO?   -  person maxbec    schedule 21.11.2015
comment
Судя по тому, как вы описываете проблему, я предлагаю использовать несколько экземпляров comp1 и comp2, а не какой-то диск. Вы запускаете comp1a, передаете его вывод в comp2a, затем передаете его вывод в comp1b и т. д.   -  person Justin Gray    schedule 23.11.2015
comment
Хорошо, это, конечно, решение, но я подумал, что, возможно, существует более приятный способ его реализовать. Я предполагаю, что это, вероятно, довольно уникальная проблема. Спасибо за помощь.   -  person maxbec    schedule 24.11.2015


Ответы (1)


Вам не нужен диск в этом случае. Вы говорите о решателе (отличном от драйвера в OpenMDAO > 1.0).

Вы можете увидеть пример того, как настроить такие вещи в нашем примере Sellar, используя файл Нелинейная модель Гаусса-Зейделя. По сути, вам просто нужно соединить компоненты по кругу, а затем добавить соответствующий решатель, чтобы убедиться, что они сходятся.

person Justin Gray    schedule 20.11.2015
comment
Я вижу, что это решение математической задачи, где я ищу какое-то сходящееся значение. Однако для моей проблемы, как объяснено в моем другом комментарии, я думаю, что нет сходящегося значения, для которого я могу решить, поскольку я хочу запустить только фиксированное количество прогонов. Каков был бы правильный способ реализовать это для этой специальной проблемы? - person maxbec; 21.11.2015