了解 Openmdao 设计背后的原因

Understanding the reasons behind Openmdao design

我正在阅读有关 MDO 的文章,我发现 openmdao 非常有趣。然而,我对一些基本选择背后的原因感到困惑understanding/justifying。

  1. 为什么要进行基于梯度的优化?由于基于梯度的优化器永远不能保证全局最优,所以它是首选。我知道对于具有众多设计变量的 MDO 问题来说,找到一个全局最小值真的很难,而局部最优远比人工设计好得多。但考虑到该应用通常用于飞机或卫星等昂贵的系统,为什么要满足于局部最小值?在梯度方法之上使用元启发式或元启发式收敛到全局最优不是更好吗?因此计算时间会很长,但现在几乎每个大学/领先行业都可以使用超级计算机,我认为这是一个可以接受的权衡。

  2. 谈到计算时间,为什么 python ?我同意 python 使脚本编写变得方便并且可以与编译语言接口。仅此一项就可以使天平偏向 Python 吗?但是,如果计算时间是导致很难找到全局最小值的主要原因之一,那么使用 C++ 或任何其他节能语言不是更好吗?

阐明这个 post 的唯一目的是证明(对我自己)使用 Openmdao 是正确的,因为我刚刚开始学习 MDO。

  1. 没有算法可以保证在有限时间内找到全局最优解,但基于梯度的方法通常比无梯度方法更快地找到局部。 OpenMDAO 专注于基于梯度的方法,因为它们能够比无梯度方法更快地遍历设计space。

    无梯度方法通常有利于更广泛地探索设计 space 以获得更好的局部最优值,并且没有什么可以阻止用户将基于梯度的优化驱动程序包装在无梯度调用程序下。 (例如,参见有关单调盆地跳跃等算法的文献)

  2. 选择
  3. Python 是因为虽然它在 运行 时间内不是最有效的,但它大大减少了开发时间。由于使用 OpenMDAO 意味着编写代码,因此 Python 相对较低的学习曲线、易于访问和跨平台的特性使其具有吸引力。还有很多用 Python 编写的开源代码,这使得合并第 3 方求解器和驱动程序等内容变得更加容易。 OpenMDAO 之所以成为可能,是因为我们站在了很多肩膀上。

尽管是用 Python 编写的,但我们实现了相对较好的性能,因为所涉及的算法非常高效,我们试图通过使用 Numpy 而不是矢量化等方式来最小化 Python 的性能问题比 Python 循环。

此外,Python 在 OpenMDAO 核心处理的计算通常成本非常低。对于像 PDE 求解器(例如 CFD 或 FEA)这样的复杂工程计算,代码的昂贵部分可以用 C、C++、Fortran 甚至 Julia 编写。这些语言很容易与 python 交互,许多 OpenMDAO 用户就是这样做的。

OpenMDAO 在许多应用程序中得到积极使用,这些应用程序的需求推动了它的设计。虽然我们现在没有内置的单调盆地跳跃功能(例如),但如果我们的利益相关者确定这是需要的,我们会考虑添加它。随着我们的发展继续,如果我们如果遇到可以通过切换不同语言来克服的障碍,我们会考虑,但向后兼容性(用户使用现有 Python 模型的能力)将是一项要求。