如何在 Modelica 中使用 MultiSum 函数?

How to use MultiSum function in Modelica?

我有一个大小为 5 的向量,我想在一个变量 (summ) 中的每一步对它的每个元素求和,但我不知道如何在这种情况下使用 MultiSum 函数。

model add
import Modelica.Blocks.Math.MultiSum;
Real k[5]={1,2,3,4,5};
Real summ;
equation
for i in 1:4 loop
summ = MultiSum(???)
end for;

end add; 

如果您能提供帮助,我将不胜感激。

您正在尝试将块作为函数调用。这在 Modelica 中目前是不允许的。有一个 proposal (as PDF) 来启用它,但它仍在讨论中。 因此你需要调用一个function。其中许多定义在 Modelica.Math 或 built-in 中(取决于您使用的工具)。

如果您真的想在模型中使用块,则有必要创建块的实例。作为替代方案,re-use 块中的代码是有意义的。

还有一个更简单的方法来做你想做的事,使用 built-in 函数 sum,它在 Modelica Language Specification 的第 10.3.4 节“归约函数和运算符”。

model add
  Real k[5]={1,2,3,4,5};
  Real summ;
equation 
  summ = sum(k);
end add;

注意:在第 10.3.4 节“归约函数和运算符”中,您将了解如何将 for 语句添加到 sum 函数以对其进行自定义。使用它来计算 n 个元素的总和将是:

model addN
  parameter Integer n(max=size(k,1)) = 3;
  Real k[5]={1,2,3,4,5};
  Real summ;
equation 
  summ = sum(k[i] for i in 1:n);
end addN;

MarkusA 的解决方案很好,但如果您真的想要使用该块,您可以这样做:

model add
  import Modelica.Blocks.Math.MultiSum;
  Real k[5]={1,2,3,4,5};
  Modelica.Blocks.Sources.RealExpression realExpression[size(k, 1)](y=k);
  Modelica.Blocks.Interfaces.RealOutput summ;
  MultiSum multiSum(nu=size(k, 1));
equation
  connect(multiSum.y, summ);
  connect(realExpression.y, multiSum.u);
end add;

或带有注释:

model add
  import Modelica.Blocks.Math.MultiSum;
  Real k[5]={1,2,3,4,5};
  Modelica.Blocks.Sources.RealExpression realExpression[size(k, 1)](y=k)
    annotation (Placement(transformation(extent={{-110,16},{-90,36}})));
  Modelica.Blocks.Interfaces.RealOutput summ
    annotation (Placement(transformation(extent={{86,4},{106,24}})));
  MultiSum multiSum(nu=size(k, 1))
    annotation (Placement(transformation(extent={{-10,20},{2,32}})));
equation 
  connect(multiSum.y, summ) annotation (Line(points={{3.02,26},{80,26},{80,14},{
          96,14}}, color={0,0,127}));
  connect(realExpression.y, multiSum.u)
    annotation (Line(points={{-89,26},{-10,26}}, color={0,0,127}));
  annotation (uses(Modelica(version="4.0.0")));
end add;