OpenModelica使用Modelica_LinearSystems2库报错的原因及解决方法
报错原因分析
第一个报错(维度推导失败)
核心原因是OpenModelica的前端实例化逻辑限制:Modelica_LinearSystems2.StateSpace记录内部的A、B、C、D矩阵采用了未定长度的符号维度声明,前端只会在变量声明阶段尝试推导维度,不会从后续algorithm段的赋值语句中反向推导维度信息。你将ss的赋值放在algorithm段,实例化阶段无法获取ss内部矩阵的维度信息,因此抛出缺失绑定方程的错误。你参考的官方示例默认适配Dymola编译器,Dymola支持从赋值语句反推维度,因此可以正常运行。
第二个报错(无提示的实例化失败)
属于OpenModelica旧版本的已知前端bug:当你手动硬编码StateSpace内部矩阵的维度时,硬编码的维度信息和fromABCDMatrices构造函数的泛型维度参数产生冲突,导致实例化流程异常终止,没有返回具体错误信息。
解决方法
- 方法1:在声明StateSpace记录时直接通过构造函数初始化,让前端可以直接获取维度信息,修改后的代码示例如下:
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 = Modelica_LinearSystems2.StateSpace.'constructor'.fromABCDMatrices(A, B, C, D); equation end test3;
- 方法2:如果确实需要在algorithm段修改ss的值,声明时先给定同维度的初始值占位确定维度,后续再修改值即可:
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(A=zeros(1,1), B=zeros(1,1), C=zeros(1,1), D=zeros(1,1)); algorithm ss := Modelica_LinearSystems2.StateSpace.'constructor'.fromABCDMatrices(A, B, C, D); equation end test3;
- 方法3:升级到OpenModelica 1.22及以上版本,新版本对Modelica_LinearSystems2库的维度推导兼容性做了大量修复,这类旧版本的实例化bug多数已经被解决。
- 额外提示:你用到的
Modelica_LinearSystems2.WorkInProgress.Controller.KalmanFilter.KF属于库中未完成开发的实验性模块,不同版本OpenModelica对其兼容性差异极大,不建议在生产环境直接使用,可以自行基于标准卡尔曼滤波公式手写实现,或使用第三方稳定的状态估计库。
内容的提问来源于stack exchange,提问作者no_pro
相关产品推荐
相关产品推荐

