Поддерживают ли драйверы оптимизации openmdao типы массивов, если присутствует только одна цель? - PullRequest
0 голосов
/ 07 февраля 2019

У меня настроена целевая функция - obj = (x0-u0) ^ 2 + (u0) ^ 2 Я рассчитываю минимумы, используя Scipyoptimizer с SLSQP.Я даю x0 в качестве входных данных и, следовательно, он вычисляет u0 на лету, одновременно минимизируя также obj .Теперь я пытаюсь использовать массив значений вместо x0, но он выдает ошибку и выдает - возвращает только скалярные значения.

Я пробовал функцию run_model ().Модель работает отлично.Но при запуске функции - run_driver () выдает ошибку.

p.model.add_subsystem ('obj_f', ExecComp ('obj = (x0-u0) ** 2 + (u0) **2 ', u0 = {' shape ': (2,)}, x0 = {' shape ': (2,)}, obj = {' shape ': (2,)}), продвигает = [' x0 ','u0'])

для x0 = [1,5, 1,2] Должен дать результат = 0,72, что является оптимальным значением для x0 = 1,2 при u0 = 0,6

1 Ответ

0 голосов
/ 21 февраля 2019

Ошибка, которую вы получаете, связана с тем, что ваша цель является вектором.Оптимизаторы на основе градиента требуют единственного скалярного значения в качестве цели.Вы можете попробовать суммировать массив, чтобы сделать скаляр.

p.model.add_subsystem('obj_f', ExecComp('obj = sum((x0-u0)**2 + (u0)**2)', u0={'shape': (2, )}, 
                                                                           x0={'shape': (2, )}, 
                                                                           obj={'shape': (1, )}), 
                                        promotes=['x0', 'u0'])
...