Matrix 使用Modelica IntegraleExp函数的LTI状态空间模型离散化不起作用

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)),从而避免计算矩阵求逆。然而,在这两种情况下

我需要在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))
    ,从而避免计算矩阵求逆。然而,在这两种情况下,矩阵都必须是可逆的,而通常(通常)不成立
  • 使用matrix.IntegrationExp函数,该函数应返回两个离散化矩阵(Ad,Bd),并应适用于一般矩阵A,无论是可逆矩阵还是奇异矩阵;但是,此函数不适用于我-它返回错误消息:“在令牌附近没有可行的替代方案:(”
  • 我附上两种方法的代码用于演示。状态空间模型表示一个非常简单的线性化摆二阶系统,长度为1m,质量为1kg,重力加速度为9.81m/s2。离散化的采样时间为0.1s。第一个代码工作良好(在这种特殊情况下,a是可逆的)但是第二个密码没有。有人知道我做错了什么吗?如果有人给我建议,我将不胜感激

    方法#1:

    方法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;