我有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
中有效,是否有更清晰,最佳的实践方法?我想在多个不同的父母中使用孩子,我可能想要改变我与之交互的方式,所以我不想过度定义它。
答案 0 :(得分:3)
嗯,应该很清楚child
不平衡,因为正如你所指出的那样,它没有与未知数相同的方程数。 parent
模型没问题,因为它与未知数具有相同数量的方程。它从child
得到一个等式,并提供两个等式。由于正好有三个变量child.a
,child.b
和child.c
,所以整个事情是平衡的。
但是更大的问题(我认为是你想要的)是如何避免child
看起来像“坏”模型的问题。一个简单的解决方案是:
model child
input Real a;
output Real b;
input Real c;
equation
a^3 + b^3 + c^3 = 1;
end child;
这表达了a
和c
的值将来自某个地方的“外部”的想法。
预测你的下一个问题......“但是当我想指定b
和c
并解决a
时会发生什么?当然我不必写另一个具有相同方程和变量的模型,但在不同变量上使用input
和output
限定符?“
您可以毫无问题地使用上述型号。原因是input
和output
限定符仅限制连接的方式。我们实际上没有建立任何联系,所以我们没事。因此,您可以为output
提供方程式并求解input
。虽然看起来有点反直觉,但这在Modelica中完全合法。 input
和output
在这里有用的原因是它们隐含地指定了我们期望这个模型本身提供多少个方程(输出)以及我们期望从外部(输入)有多少个方程。但是他们没有(也不能)限制我们为哪些变量提供明确的方程式。
最后一点,我建议您在声明中添加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
允许你将它换成其他人。这种情况的一个典型应用是将一个状态方程替换为另一个或一个平衡条件。
希望有所帮助。