无效的Modelica模型在另一个模型中实例化时工作正常。为什么?

时间:2015-02-19 13:42:00

标签: instantiation modelica

我有2个Modelica模型:

model parent
  child dingus;
equation 
  dingus.a = 37;
  dingus.c = 666;
end parent;

model child
  Real a;
  Real b;
  Real c;
equation 
  a^3 + b^3 + c^3 = 1;
end child;

当我检查代码时,parent检查结果没问题,但child给出了未知数和方程不匹配的错误,正如预期的那样。为什么它在parent中有效,是否有更清晰,最佳的实践方法?我想在多个不同的父母中使用孩子,我可能想要改变我与之交互的方式,所以我不想过度定义它。

1 个答案:

答案 0 :(得分:3)

嗯,应该很清楚child不平衡,因为正如你所指出的那样,它没有与未知数相同的方程数。 parent模型没问题,因为它与未知数具有相同数量的方程。它从child得到一个等式,并提供两个等式。由于正好有三个变量child.achild.bchild.c,所以整个事情是平衡的。

但是更大的问题(我认为是你想要的)是如何避免child看起来像“坏”模型的问题。一个简单的解决方案是:

model child
  input Real a;
  output Real b;
  input Real c;
equation 
  a^3 + b^3 + c^3 = 1;
end child;

这表达了ac的值将来自某个地方的“外部”的想法。

预测你的下一个问题......“但是当我想指定bc并解决a时会发生什么?当然我不必写另一个具有相同方程和变量的模型,但在不同变量上使用inputoutput限定符?“

您可以毫无问题地使用上述型号。原因是inputoutput限定符仅限制连接的方式。我们实际上没有建立任何联系,所以我们没事。因此,您可以为output提供方程式并求解input。虽然看起来有点反直觉,但这在Modelica中完全合法。 inputoutput在这里有用的原因是它们隐含地指定了我们期望这个模型本身提供多少个方程(输出)以及我们期望从外部(输入)有多少个方程。但是他们没有(也不能)限制我们为哪些变量提供明确的方程式。

最后一点,我建议您在声明中添加child实例的等式。我似乎记得Modelica中有一些特殊规则可以在确定某些东西是否平衡时进行处理。所以我记得,正确的方法是:

model child
  input Real a;
  input Real b;
  output Real c; // A bit arbitrary which one is output
equation 
  a^3 + b^3 + c^3 = 1;
end child;

model parent
  child dingus(a=37, c=666);
end parent;

通过这种方式,您可以将child视为“命名等式”。更好的是,你可以使replaceable允许你将它换成其他人。这种情况的一个典型应用是将一个状态方程替换为另一个或一个平衡条件。

希望有所帮助。