Почему конечные различия статических входных переменных используются для вычисления якобиана?(OpenMDAO 2.4) - PullRequest
0 голосов
/ 25 октября 2018

Я использовал алгоритм SLSQP для запуска некоторых проблем MDO только с ExplicitComponents.Каждый компонент имеет время выполнения около 10 секунд и 60-100 входных переменных.Большинство входных переменных являются статическими входными переменными, которые будут оставаться постоянными в течение всей оптимизации.Статические входные переменные происходят от IndepVarComp.ExplicitComponents - это черные ящики, поэтому информация о частичках отсутствует.

Я заметил, что когда якобиан вычисляется в compute_totals(), компоненты линеаризуются относительно всех их входных значений.В compute_approximations() конечная разница рассчитывается по всем входным значениям, включая статические входные значения.Итак, мой вопрос: почему вычисление конечной разности выполняется для этих статических входных переменных?Поскольку значения остаются постоянными, я не уверен, почему эта информация была бы полезна?

Кроме того, если я правильно понимаю, компоненты линеаризуются, чтобы получить субякобианцев, которые затем используются для вычислениятотальный якобиан.Однако можно ли напрямую рассчитать конечную разность по всей группе вместо линеаризации каждого компонента?С учетом времени выполнения моих компонентов и количества входных переменных выполнение линеаризации каждого компонента займет много времени.Тем не менее, проблема оптимизации имеет только 3 проектных переменных.Итак, если бы я мог выполнить три вычисления конечных разностей по всему MDA для вычисления общего якобиана, общее время выполнения значительно уменьшится.

1 Ответ

0 голосов
/ 25 октября 2018

Чтобы ответить на ваши вопросы в обратном порядке:

1) Можете ли вы FD по всей модели вместо каждого отдельного компонента?Да!

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

2) Почему вычисление конечных разностей выполняется для этих статических входных переменных?

Теоретически, вы правы, что вам не нужны частные производные от входных данных, которые не могут измениться.Начиная с OpenMDAO 2.4, мы не обрабатываем эту ситуацию автоматически, и у нас нет планов добавлять это в ближайшем будущем.Тем не менее, фреймворк принимает FD только через те части, о которых вы говорите.Звучит так, как будто вы объявляете свои партиалы следующим образом:

self.declare_partials(of=['*'], wrt=['*'], method='fd')

Итак, вы специально просите платформу вычислить все эти партиалы.Вместо этого вы можете указать в аргументе wrt только те входные данные, которые, как вы знаете, действительно меняются.Конечно, это математически неверно, потому что есть производная по отношению к статическим входам.Если кто-то позже подключит что-то к этим входам и попытается провести оптимизацию, он получит неправильный ответ.Но пока вы осторожны, вы можете специально запрашивать только те части, которые вы хотели от любого компонента, и просто оставить неизменяемые входные данные настолько эффективными, насколько это будет 0.

...