我正在尝试使用Modelica_LinearSystem2库OpenModelica中的卡尔曼滤波器,但在我的测试模型中,该库的功能似乎没有正常工作。
为了找到问题,我从文档(LinearSystems2.StateSpace.%27constructor%27.fromABCDMatrices.html)中复制了代码示例
model test3
Real A[1,1] = [1];
Real B[1,1] = [1];
Real C[1,1] = [1];
Real D[1,1] = [0];
public
Modelica_LinearSystems2.StateSpace ss;
algorithm
ss := Modelica_LinearSystems2.StateSpace.'constructor'.fromABCDMatrices(A, B, C, D);
equation
end test3; 当我单击check model时,会收到以下错误:
Modelica_LinearSystems2.StateSpace: 7:3-8:68:由于缺少绑定方程,无法推导出A的维数1.
这指的是行
Real A[:,size(A, 1)];例如,当我预定义这个(和其他)矩阵时
Real A[4,4];我知道错误了
test3的内部错误实例化失败,没有错误消息。
我的问题是:为什么是这样,我怎样才能防止这些错误?
发布于 2021-11-02 16:22:50
调查结果
看来Modelica_LinearSystems2只受Dymola的支持。他们的github储存库的登陆页面是:
请注意,已知的图书馆只与Dymola合作。
现在看来情况仍然是这样。至少在我的机器上,库Modelica_LinearSystems2 v2.4.1在OpenModelica v1.18.0中存在严重问题。大多数示例都有错误退出,或者什么也不做。
不过,问题中的代码在Dymola中不起作用。下面你可以找到一个解释和纠正的例子,成功地测试了Dymola。在所有工具中,基本问题应该是相同的,我希望一旦OpenModelica支持Modelica_LinearSystems2库,我的解决方案也能在它中工作。
原始答案(与Dymola用户最相关)
示例代码的问题是,在执行模拟时,Modelica工具必须知道向量、矩阵和数组的大小,而不是在调用函数时。由于您正在构建模型,因此该工具假设您想要模拟它。
代码实例化StateSpace记录ss。ss保存矩阵A、B、C和D。只要您不给ss分配任何东西,就不知道它们的大小。当然,有一种算法可以设置ss,但这是在模拟过程中发生的。在翻译过程中,无法确定ss中矩阵的大小。因此,典型的Modelica工具要求您使用绑定等式。
要使您的剪短工作,您可以将其更改为:
model Demo
Real A[1,1] = [1];
Real B[1,1] = [1];
Real C[1,1] = [1];
Real D[1,1] = [0];
Modelica_LinearSystems2.StateSpace ss = Modelica_LinearSystems2.StateSpace.'constructor'.fromABCDMatrices(A, B, C, D);
end Demo;请注意,ss现在有一个绑定方程。因此,可以确定ss内部矩阵的大小。
问题是,如果您真的想使用您的StateSpace记录运行模拟。通常,线性系统库中的函数在Modelica函数中使用。在这种情况下,代码可以如下所示:
function demo
output Modelica_LinearSystems2.StateSpace ss;
protected
Real A[1,1] = [1];
Real B[1,1] = [1];
Real C[1,1] = [1];
Real D[1,1] = [0];
algorithm
ss = Modelica_LinearSystems2.StateSpace.'constructor'.fromABCDMatrices(A, B, C, D);
end demo;我建议查看包Modelica_LinearSystems2.Examples.StateSpace中的各种示例,以正确使用StateSpace记录。
https://stackoverflow.com/questions/69812521
复制相似问题