openmdao - 算法微分与具有分析导数的多个显式组件
问题描述
我有一个由大约 6 个数学表达式组成的问题 - 即 (f(g(z(y(x))))) 其中 x 是两个独立的数组。
我可以将此表达式划分为具有解析导数的多个显式组合,或者使用算法微分方法来获得将系统简化为单个显式组件的导数。
据我了解,提前说出这两种方法之间可能的计算性能差异并不容易。它可能取决于反向模式情况下的算法微分工具功能,但可能系统将非常大,具有多个显式组件,使用算法差异仍然可以。
我的问题是:
是算法差异。任何开发人员/用户都在使用的通用工具?我找到了 AlgoPY,但不确定其他 python 工具。
解决方案
从 OpenMDAO v2.4 开始,OpenMDAO 开发团队还没有在任何纯 Python 组件上大量使用 AD 工具。我们对其进行了一些试验,发现计算组件与手动区分组件相比大约增加了 2 倍。虽然预计会增加一些计算成本,但我不想表明我希望 2x 是最终的经验法则。我们根本没有足够的数据来提供这样的估计。
基于 Python 的 AD 工具的开发程度远不如编译语言的工具。动态类型和通用语言灵活性都使得编写好的 AD 工具变得更具挑战性。
我们已将 OpenMDAO 与使用 AD 的编译代码(例如 CFD 和 FEA 工具)连接起来。在这些情况下,您总是使用 OpenMDAO(apply_linear
和compute_jacvec_product
)的无矩阵派生 API。
如果您的组件足够小以适合内存并且足够快以在单个进程上运行,我建议您手动区分您的代码。这将为您提供目前最好的整体性能。
对小型串行组件的 AD 支持是我们将来考虑支持的东西,但我们在短期内没有任何东西可以为您提供(从 OpenMDAO v2.4 开始)
推荐阅读
- python - 如何有效地按行插入 Pandas DataFrame 中的数据?
- python - 无法通过 Pandas 中的 lambda 填充多列中的 NaN 值
- c++ - Fortran 子例程在链接到 c++ 程序时产生“未定义符号”错误
- vue.js - nuxt-link 作为图像
- ajax - CSRF 令牌丢失或无效。-> 第一种形式使其他 CSRF 令牌工作失败
- java - 如何使用 GNU Prolog for Java 运行包含列表作为参数的谓词?
- actionscript-3 - 如何修复 ActionScript3.0 Adobe Animate 中的“TypeError: Error #1009”错误
- javascript - 如何绘制具有 n 边的任意不规则多边形?
- r - flextable:如何仅将组标题显示为值而不是变量名:值
- java - 有没有办法在新的导航组件上按下后恢复 recyclerview 上的状态