Как установить параметры состояния, управления и параметров в задачах Dymos с размерностью?

#openmdao

#openmdao

Вопрос:

У меня есть ODE, заданный в формеa1, где x, u и d являются векторами (например a2). Я сформулировал эту систему в OpenMDAO / Dymos, используя размерные входы и выходы

 self.add_input('x',shape(num_nodes,Nx))
 

для состояний Nx. Смотрите: https://openmdao.github.io/dymos/getting_started/defining_odes.html ?выделить = размерные #размерные-входы-и-выходы

Мои ODE и траектория работают хорошо, однако мне интересно уточнить некоторую информацию:

(1) Я вижу, что при добавлении состояний, входных данных и параметров я могу указать уникальные ограничения поля через upper и lower (https://openmdao.github.io/dymos/features/phases/constraints.html ?выделить = размерность #ограничения пути). Например, состояние 1 может иметь границы [0,1], в то время как состояние 2 имеет границы [-1,5]. Мой вопрос в том, работает ли suppling ref и ref0 information таким же образом? Я протестировал это (например ref0 = [0,-1] ), но я не могу сказать, действительно ли это что-то делает?

(2) Можете ли вы указать единицы измерения для конкретных элементов задач с размерностью? Например, состояние 1 — это температура, а состояние 2 — напряжение. Не похоже, что я могу просто сделать:

 self.add_input('x',shape=(num_nodes,2),units=['K','V'])
 

потому что это возвращает ошибку.

(3) Можете ли вы указать различные свойства оптимизации для отдельных элементов в векторах состояния, ввода и измерения? Например, скажем, я хочу оптимизировать ввод 1 ( opt=True ), но не ввод 2 ( opt=False ). В идеале я ожидал бы

 phase.add_parameter('u',opt=[True,False])
 

но это возвращает ошибку.

Если эта функциональность возможна, не могли бы вы направить меня туда, где я мог бы найти дополнительную информацию. Я просмотрел документацию Dymos, но не смог найти много по этой теме.

Комментарии:

1. Первоначально мы решили не поддерживать масштабирование на основе массива, в значительной степени потому, что Майкл Росс и др. приводят убедительный аргумент, что это неверно с математической точки зрения. Смотрите Раздел, озаглавленный «Ошибка дискретного масштабирования» в их статье «Масштабирование и балансировка для высокопроизводительных вычислений оптимальных элементов управления» здесь: arxiv.org/pdf/1810.11073.pdf Если вы чувствуете, что это было бы действительно важно, и хотите проигнорировать совет Росса, я бы не был полностью против добавления этой возможности. Масштабирование для каждого индекса состояния или элемента управления со значением массива уже должно работать, будет протестировано.

2. Я думаю, что масштабирование, против которого выступал Майк Росс, было немного другим. Это было переменное масштабирование вдоль num_nodes оси, которое он приводит в качестве убедительного аргумента, плохо. Я полагаю, что в этом случае масштабирование переменной будет происходить вдоль «первичной» оси векторного состояния (т. Е. Вдоль оси, по которой вы бы разделили векторное состояние на несколько скалярных состояний). В этом нет ничего математически неправильного, что я вижу, и, похоже, он частично работает с версии V1.3 для ref / ref0. однако это не работает для верхнего / нижнего. Это может быть устранено в ошибке, указанной в ответе ниже

Ответ №1:

  1. В общем OpenMDAO вы можете иметь векторное значение ref / ref0 для проектных переменных. Теоретически Dymos также должен поддерживать это. Вы можете указать ref / ref0 того же размера, что и ваше состояние, а затем Dymos расширит его до полного num_nodes размера для вас. К сожалению, начиная с версии Dymos 1.30, похоже, что это не совсем работает. Мы зарегистрировали эту ошибку здесь, и она должна быть исправлена в версии V1.4.
  2. OpenMDAO не допускает смешанных блоков в массивах. Это был преднамеренный выбор дизайна, связанный с подробностями о том, как обрабатываются преобразования единиц измерения и как поддерживать их эффективность (как с точки зрения использования памяти, так и вычислений). Поскольку OpenMDAO этого не позволяет, Dymos не может.

Итак, вам нужно либо разделить состояние на несколько переменных, либо работать с безразмерными величинами.

  1. Для параметров и элементов управления это довольно просто сделать через API OpenMDAO. Если вы хотите более мелкозернистый контроль индекса, просто установите opt=False для всех из них. Dymos предоставит их вам в качестве входных данных в верхней части фазы / траектории (вы можете использовать N2, чтобы найти их). Затем вы можете вызвать собственный API add_design_var OpenMDAO для этих входных данных уровня фазы / траектории с любыми индексами, которые вы хотите.

Делать это для состояний — не лучшая идея. Не вдаваясь в математику… Dymos очень усердно работает, чтобы сохранить для вас четко определенную (в математическом смысле) задачу оптимизации. Для состояний это означает тщательное сопоставление ограничений дефектов с проектными переменными. Вы не можете просто отключить часть массива состояний, не обратившись также к соответствующим ограничениям дефектов. Конечно, если вы нарушаете ограничения дефектов, вы больше не получаете действительную физику. Это такая огромная банка с червями, что вы действительно просто не хотите к ней прикасаться.

Комментарии:

1. Потрясающе. Это очень полезно, и спасибо за открытие этого сообщения об ошибке. Чтобы уточнить, для (3) я бы не хотел удалять состояния из списка проектных переменных. Однако мне могут понадобиться некоторые состояния с фиксированным начальным условием, в то время как другие свободны. Похоже, что это все еще может быть «хорошо». Но, основываясь на том, что вы оба упомянули, кажется, что лучшим подходом было бы избежать размерной проблемы и приложить некоторые усилия для переформулировки моей системы как безразмерной.

2. Если у вас есть векторное состояние, то вы можете управлять fix_intial fix_final настройкой или только для ВСЕХ вложенных состояний в этом массиве в виде блока. Если вам нужен более точный контроль, тогда вам следует разбить вектор на более мелкие переменные. По крайней мере, так это работает с версии V1.3. Хотя мы бы приветствовали запрос на извлечение, который мог бы обновить функциональность, я думаю, нам нужно было бы убедить, что это не создаст много потенциальных проблем для пользователей. Достаточно сложно правильно настроить BCs при работе с целыми переменными. Логические массивы просто усложнили бы задачу.

3. Ох. Хорошо, это помогает урегулировать наш подход. Нам придется разбить каждое из состояний и др. на их собственную переменную. Я избавлю вас от головной боли, связанной с необходимостью выполнения этого обновления. Спасибо за разъяснение!