Matrix 使用Modelica IntegraleExp函数的LTI状态空间模型离散化不起作用
我需要在OpenModelica(OMEdit)中对连续LTI状态空间模型执行ZOH离散化。 我尝试了两种方法:Matrix 使用Modelica IntegraleExp函数的LTI状态空间模型离散化不起作用,matrix,modelica,exponential,openmodelica,discretization,Matrix,Modelica,Exponential,Openmodelica,Discretization,我需要在OpenModelica(OMEdit)中对连续LTI状态空间模型执行ZOH离散化。 我尝试了两种方法: 使用矩阵指数(matrix.exp函数)计算离散化A矩阵(Ad)并随后计算离散化B矩阵(Bd),公式如下:Bd=A-1(Ad-I)B,其中I为单位矩阵;该代数方程可以通过直接计算矩阵求逆(Matrices.inv函数)或更有效地使用Matrices.solve2函数求解Bd矩阵:Bd=Matrices.solve2(A,(Ad恒等式(2)),从而避免计算矩阵求逆。然而,在这两种情况下
Bd=Matrices.solve2(A,(Ad恒等式(2))
,从而避免计算矩阵求逆。然而,在这两种情况下,矩阵都必须是可逆的,而通常(通常)不成立Oliver您忘记了示例2中的equation关键字。它在OpenModelica中仍然不起作用,因为它在该函数中的别名
na=size(a,1)
似乎有问题,但您可以轻松修复源代码以使其起作用
model ssDiscretization
import Modelica.Math.Matrices;
// Continuous LTI state-space model of pendulum: L=1, m=1, g=9.81
Real A[2,2] = [0, 1; -9.81, 0] "system matrix";
Real B[2,1] = [0; 1] "input matrix";
// Discretization with sampling time 0.1 s
Real Ad[2,2];
Real Bd[2,1];
equation // This was missing
(Ad,Bd) = Matrices.integralExp(A,B,0.1) "T = 0.1 s";
end ssDiscretization;
没有真正的帮助,但是
(Ad,Bd)=矩阵。integrateExp(A,B,0.1)“T=0.1s”
在从Dymola的“命令”运行时给出与第一个代码段相同的结果行。所以这似乎是一个与工具有关的问题,而不是用法…我不能对OpenModelica给出任何建议…很高兴知道代码在Dymola中工作。也许有人会在我在OMEdit中运行它时给出为什么它不工作的建议。谢谢你,Markus。问题已经解决了,谢谢。事实上我没有忘记把等式放进去
关键字在第二个示例中,我仔细考虑了一下,因为我认为它应该在没有方程/算法部分的情况下工作,就像第一个示例一样。现在我知道我错了。但是正如您所建议的,将最后一个方程放在方程部分并不能解决问题。我还必须修复IntegraleExp函数的代码。修复程序重新编写行input Real A[:,size(A,1)];
到input Real A[:,:];
和类似地,重新编写行input Real B[size(A,1),:];
到input Real B[:,:];
。现在它也应该在OpenModelica每晚构建中工作,而不更改标准库:好的,很高兴知道,谢谢!
model ssDiscretization
import Modelica.Math.Matrices;
// Continuous LTI state-space model of pendulum: L=1, m=1, g=9.81
Real A[2,2] = [0, 1; -9.81, 0] "system matrix";
Real B[2,1] = [0; 1] "input matrix";
// Discretization with sampling time 0.1 s
Real Ad[2,2];
Real Bd[2,1];
(Ad,Bd) = Matrices.integralExp(A,B,0.1) "T = 0.1 s";
end ssDiscretization;
model ssDiscretization
import Modelica.Math.Matrices;
// Continuous LTI state-space model of pendulum: L=1, m=1, g=9.81
Real A[2,2] = [0, 1; -9.81, 0] "system matrix";
Real B[2,1] = [0; 1] "input matrix";
// Discretization with sampling time 0.1 s
Real Ad[2,2];
Real Bd[2,1];
equation // This was missing
(Ad,Bd) = Matrices.integralExp(A,B,0.1) "T = 0.1 s";
end ssDiscretization;