【问题标题】:Modelica: assign array return value to scalarsModelica:将数组返回值分配给标量
【发布时间】:2019-08-14 09:47:18
【问题描述】:

以下模型尝试将函数调用的向量返回值分配给标量向量。如果它在方程式部分内,它会检查并工作,但在算法部分内会失败。这是我正在使用的 Modelica 工具中的错误,还是我做错了什么?还有,不引入中间变量x[2]怎么写?

model returnVector
  Real x1;
  Real x2;
  Real x[2];
  Real A[2,2] = [1,2;3,4];
  Real b[2] = {8,7};
algorithm 
  x = Modelica.Math.Matrices.solve(A,b);
  {x1, x2} = Modelica.Math.Matrices.solve(A,b);
end returnVector;

【问题讨论】:

    标签: algorithm matrix vector modelica dymola


    【解决方案1】:

    你做错了什么:-)

    在方程中,左边是任何表达式;所以你甚至可以写Modelica.Math.Matrices.solve(A,b)={x1,x2};

    在算法中,左侧必须是组件引用(Modelica 3.4 中的第 11.2 节;https://modelica.org/documents/ModelicaSpec34.pdf),右侧被评估,然后分配给左侧变量。

    【讨论】:

      【解决方案2】:

      在“算法”下,必须使用“:=”来表示 Modelica 中的Assignment,而不是像 C/C++ 中的“=”。 所以代码可以改写如下:

      model returnVector
        Real x1;
        Real x2;
        Real x[2];
        Real A[2,2] = [1, 2; 3, 4];
        Real b[2] = {8, 7};
      algorithm 
        x := Modelica.Math.Matrices.solve(A, b);
        x1 := x[1];
        x2 := x[2];
        //{x1, x2} = Modelica.Math.Matrices.solve(A, b);
      end returnVector;
      

      【讨论】:

        【解决方案3】:

        只需将左侧写在圆括号内:

        ({x1, x2}) := Modelica.Math.Matrices.solve(A, b);

        【讨论】:

        • 请不要在算法中使用此变体。它应该(并且将来会)生成与问题中类似的错误消息,并且还可能导致更细微的错误。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        相关资源
        最近更新 更多