微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用隐式组件组装完整的系统?

如何解决如何使用隐式组件组装完整的系统?

我现在正在处理面板方法代码。为了避免陷入细节问题,我不会显示代码-这是有关整体程序结构的问题。

当前,我通过以下方法解决我的系统

  1. 针对每个边界条件在显式组件中生成 A 矩阵和 b 向量的相应行
  2. 将部分输出组装到完整的 A b 中。
  3. 使用LinearSystemComp解决线性系统 Ax = b

下面是一个(粗略的)图:

Current method of assembling explicit components

我希望能够做到这一点,只需编写一个隐式组件来表示每个边界条件,将输入/输出向量化以表示矩阵中的多个行/列,然后让openMDAO求解 x ,同时将每个边界条件的残差驱动为0。

由于每个隐式组件的不确定性(输出向量 x 中的行多于该组件的输出残差;即 A 1 x - b 1 = R 1 ,长度( R 1 ) x )。本质上,我希望openMDAO接受每个这些欠定的隐式系统,然后找到 x 的值即可解决确定的完整系统-无需自己完成所有组装工作。

类似这样的事情:

Desired method of assembling inviscid components.

为了使目标更清晰,我将从面板方法的角度解释我真正想要的。我想要一个组件,比方说Impact,它可以计算给定面板在面板参考系中给定点所感应的电势。我想对输入面板和点进行矢量化处理,以便它可以计算一个点上的多个面板,一个面板上的多个点或多个面板上的多个点的影响系数。

Influence coefficient calculation

然后,我希望使用一个隐式边界条件系统来找到 mu 的正确值来求解该系统。同样,这些边界条件应该能够被矢量化,以计算在许多面板的影响下在许多点上违反边界条件的情况。

在这一部分再次感到困惑。并非每个边界条件都会使用影响系数值-像Kutta条件一样,某些条件只是在 mu 向量上强制执行,例如

Kutta condition

。 我如何将其实现为隐式组件?它没有输入,也不会输出完整的 mu 向量。

enter image description here

我很欣赏这个问题很漫长和漫不经心,但是我很困惑。总结一下:

  1. 我如何使用openMDAO来解决多个单独不确定的(但组合的,完全确定的)隐式系统?
  2. 如何使用openMDAO编写一个隐式组件,该隐式组件不使用任何输入,而只使用整个解决方案向量的一部分?

解决方法

在OpenMDAO文档中,您可以使用node-voltage analysis tutorial与您尝试完成的工作非常相似。在该代码中,balance comp用于创建与您所描述的相似的隐式关系。它本身是单数形式,但较大的一部分是定义完善的系统。

您将需要找到一种为模型构建相似组件的方法。方程中的每个“行”都将与一个状态变量(x向量中的一个条目)相关联。

在最简单的情况下,每一行(或一组行)将具有一个输入(它是A矩阵的关联行)和第二个输入(它是x的所有其他值),最后一个输入是b向量(右侧向量)的输入。然后,您可以评估该特定行的残差,如下所示:

R['x_i'] = np.sum(A*x_full) - b

其中x_full是来自x_other输入和x_i状态变量的完整x向量的组合。

##########

提出了以上解决方案后,我不得不说,我认为这不是构建或解决此线性系统的特别有效的方法。它是模块化的,可能会给您带来一定的灵活性,但是您会遇到很多麻烦,以避免做一些索引运算,而是将所有内容都放入一个矩阵中。

当然,派生类在您的设计中可能会更容易一些,因为矩阵装配将通过必须在各个行组件之间创建的连接来“神奇地”处理。所以也许值得交易……但是我想说,您可以尝试一种更传统的编码方法,并使用JAX或其他一些AD代码使派生操作更容易。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。