我想使用用 OpenMDAO 编写的代码块来提取输出表达式作为几个变量的函数(需要声明为符号)。在这种情况下,问题的结构不是高度嵌套的,所以也许我会浪费更少的时间直接手动完成它,但我想知道是否存在任何类似的功能来执行此操作。
在这种情况下,结构如下:仅计算作为马赫数 (M) 和升力系数 (CL) 函数的阻力系数 CD:
每个贡献(CD0 和 e)都是由多个组件(在本例中为 ExplicitComponents)组成的组,并进一步依赖于 M 和 CL。
您正在寻找
ExecComp
,它可以让您只需在初始化参数中键入一个方程。
文档位于此处。
从这些文档复制的简单示例:
import openmdao.api as om
prob = om.Problem()
model = prob.model
model.add_subsystem('comp', om.ExecComp('y=x+1.'))
model.set_input_defaults('comp.x', 2.0)
prob.setup()
prob.run_model()
print(prob.get_val('comp.y'))
如果您想编写一些复杂的表达式并通过它们自动获取导数,那么您可能需要考虑 Jax 甚至与 Julia 交互。如果您正在考虑使用自己的符号引擎(如 sympy)与代码进行交互,可以通过多种方法将生成的导数表达式转换为可执行的 Python 代码,但根据我的经验,这不是一个无缝的过程。
与 Jax 交互需要一些样板功能,但此处记录了一些示例:https://openmdao.org/newdocs/versions/latest/features/building_blocks/jax_subpackage/jax_subpackage.html