Алгоритмическое дифференцирование и множественные явные компоненты с аналитическими производными - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть проблема, состоящая из 6 математических выражений - т.е. (f (g (z (y (x))))), где x - два независимых массива.

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

Насколько я понимаю, нелегко заранее определить возможную разницу в вычислительной производительности между этими двумя подходами.Это может зависеть от возможностей инструментов алгоритмического дифференцирования в случае обратного режима, но, возможно, система будет очень большой с несколькими явными компонентами, поэтому было бы неплохо использовать algo diff.

мои вопросы:

Возможно дифференцировать.общий инструмент, используемый кем-либо из разработчиков / пользователей?Я нашел AlgoPY , но не уверен насчет других инструментов Python.

1 Ответ

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

Начиная с OpenMDAO v2.4, команда разработчиков OpenMDAO не интенсивно использовала инструменты AD ни для каких компонентов чисто python.Мы немного поэкспериментировали с этим и обнаружили примерно двукратное увеличение вычислительных и ручных дифференцированных компонентов.Хотя ожидается некоторое увеличение вычислительных затрат, я не хочу указывать, что я ожидаю, что 2х будет последним практическим правилом.У нас просто недостаточно данных, чтобы предоставить такую ​​оценку.

Инструменты AD на основе Python гораздо менее развиты, чем инструменты для компилируемых языков.Динамическая типизация и общая гибкость языка усложняют написание хороших инструментов AD.

Мы связали OpenMDAO с скомпилированными кодами, использующими AD, такими как инструменты CFD и FEA.В этих случаях вы всегда используете безматричные производные API для OpenMDAO (apply_linear и compute_jacvec_product).

Если ваш компонент достаточно мал, чтобы поместиться в памяти и достаточно быстр, чтобы работать в одном процессе, я советую вам вручную дифференцировать код.Это даст вам лучшую общую производительность на данный момент.

Поддержка AD для небольших последовательных компонентов - это то, что мы рассмотрим в будущем, но у нас нет ничего, что мы могли бы предложить вам в ближайшей перспективе (начиная с OpenMDAO v2.4)

...