【问题标题】:LTI state-space model discretization using Modelica integralExp function not working使用 Modelica integralExp 函数的 LTI 状态空间模型离散化不起作用
【发布时间】:2021-07-06 00:43:38
【问题描述】:

我需要在 OpenModelica (OMEdit) 中对连续 LTI 状态空间模型执行 ZOH 离散化。 我尝试了两种方法:

  1. 使用矩阵指数(Matrices.exp函数)计算离散化A矩阵(Ad)和后续计算离散化B矩阵(Bd sub>) 下列等式:Bd = A-1 (Ad - I) B,其中 I 是单位矩阵;这个代数方程可以通过直接计算矩阵求逆(Matrices.inv 函数)来求解,或者更有效地通过求解 Bd矩阵使用Matrices.solve2函数:Bd = Matrices.solve2(A,(Ad-identity(2))),从而避免了矩阵求逆的计算。但是,在这两种情况下,A 矩阵都必须是可逆的,这通常(并且经常)不成立。
  2. 使用 Matrices.integralExp 函数,该函数应该返回两个离散矩阵(Ad、Bd)并且应该适用于一般矩阵A,无论是可逆的还是单数的;但是,此功能对我不起作用 - 它返回错误消息:“令牌附近没有可行的替代方案:(”。

出于演示目的,我附上了这两种方法的代码。状态空间模型表示一个非常简单的线性化摆的二阶系统,长度为 1 m,质量为 1 kg,重力加速度为 9.81 m/s2。离散化的采样时间为 0.1 s。第一个代码工作正常(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] = Matrices.exp(A,0.1) "T = 0.1 s";
  Real Bd[2,1] = Matrices.inv(A)*(Ad - identity(2))*B;
end ssDiscretization;

方法#2:

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;

奥利弗

【问题讨论】:

  • 没有真正的帮助,但(Ad,Bd) = Matrices.integralExp(A,B,0.1) "T = 0.1 s"; 从 Dymola 的“命令”行运行时给出的结果与第一个代码 sn-p 相同。所以这似乎是一个与工具相关的问题,而不是使用......虽然我不能就 OpenModelica 提供任何建议......
  • 很高兴知道代码在 Dymola 中工作。也许有人会提出建议,为什么当我在 OMEdit 中运行它时它不起作用。谢谢你,马库斯。

标签: matrix modelica exponential openmodelica discretization


【解决方案1】:

您忘记了示例 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;

【讨论】:

  • 问题已解决,谢谢。实际上我没有忘记在第二个示例中添加 equation 关键字,我是故意这样做的,因为我认为它应该像第一个示例一样在没有方程/算法部分的情况下工作。现在我知道我错了。但正如你所建议的,将最后一个方程放在方程部分并没有解决问题。我还必须修复integralExp 函数的代码。修复包括将input Real A[:, size(A, 1)]; 行重写为input Real A[:,:];,类似地,将input Real B[size(A, 1), :]; 行重写为input Real B[:,:];
  • 它现在应该也可以在 OpenModelica nightly 构建中工作,而无需更改标准库:github.com/OpenModelica/OpenModelica/commit/9b527bc6bf
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多