如何正确地将标量连接到向量条目?

问题描述

我们正在寻找一种将标量(作为输出)连接到向量条目(作为输入)的方法

"Nonlinear Circuit Analysis" 示例中,class Node 中有一个解决方法,它循环标量的数量并将每个标量添加为新输入。在 class Circuit 中,添加的输入然后通过它们的“索引”(例如 'I_in:0')访问。

在我们的例子中,这个循环必须由一个新的组件集成,它只循环新的输入。这就是为什么我们要避免循环并直接使用向量和矩阵运算的原因。就电路示例而言,实现此目的的一种方法是使用某种尚未实现的目标索引(请参阅 tgt_indices)(尚未实现)。 在这种情况下,两个类都将如下所示:

class Node(om.ImplicitComponent):
    """Computes voltage residual across a node based on incoming and outgoing current."""

    def initialize(self):
        self.options.declare('n_in',default=1,types=int,desc='number of connections with + assumed in')
        self.options.declare('n_out',desc='number of current connections + assumed out')

    def setup(self):
        self.add_output('V',val=5.,units='V')

        self.add_input('I_in',units='A',shape=self.options['n_in'])
        self.add_input('I_out',shape=self.options['n_out'])

    def apply_nonlinear(self,inputs,outputs,residuals):
        residuals['V'] = 0.
        residuals['V'] += inputs['I_in'].sum()
        residuals['V'] -= inputs['I_out'].sum()

class Circuit(om.Group):

    def setup(self):
        self.add_subsystem('n1',Node(n_in=1,n_out=2),promotes_inputs=[('I_in')])
        self.add_subsystem('n2',Node())  # leaving defaults

        self.add_subsystem('R1',Resistor(R=100.),promotes_inputs=[('V_out','Vg')])
        self.add_subsystem('R2',Resistor(R=10000.))
        self.add_subsystem('D1',diode(),'Vg')])

        self.connect('n1.V',['R1.V_in','R2.V_in'])
        self.connect('R1.I','n1.I_out',tgt_indices=[0])
        self.connect('R2.I',tgt_indices=[1])

        self.connect('n2.V',['R2.V_out','D1.V_in'])
        self.connect('R2.I','n2.I_in',tgt_indices=[0])
        self.connect('D1.I','n2.I_out',tgt_indices=[0])

        ...

所以主要方面是将输出标量连接到类似于 src_indices 选项的输入向量的条目。有没有办法做到这一点或有理由反对

由于我们计划使用 Dymos,因此我们希望将此功能提高一维,并将输出向量连接到输入矩阵的行。

解决方法

您是对的,目前 OpenMDAO 中没有类似 tgt_indices 的功能。虽然它在技术上是可行的,但它确实存在一些 API 设计和内部实际挑战。如果您强烈认为此功能的需求/价值,您可以考虑提交一份 POEM 描述您提议的 API 以供开发团队考虑。您可以从提供的示例开始,但您需要仔细考虑以下细节:

  • 如果用户同时提供 src_indicestgt_indices 会怎样?
  • 如果 tgt_indices 重叠,错误信息会是什么样子
  • api 如何扩展到 promotes 函数。

与此同时,您需要使用 MuxComponent,或者编写您自己的该组件版本,该版本将接收数组输入并将它们推送到组合矩阵中。添加这样的组件有点低效,但从宏观的角度来看,它应该不会太糟糕(只要你花时间为它定义解析导数。CS/FD这个组件会很昂贵)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...