如何在 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;
我有一个大小为 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;