LTI state-space 使用 Modelica integralExp 函数的模型离散化不起作用
LTI state-space model discretization using Modelica integralExp function not working
我需要在 OpenModelica (OMEdit) 中对连续 LTI 状态 space 模型执行 ZOH 离散化。
我尝试了两种方法:
- 利用矩阵指数函数(Matrices.exp函数)计算离散化A矩阵(Ad)及后续计算离散化B 矩阵 (Bd) 如下等式:Bd = A-1 (Ad - I) B,其中I为单位矩阵;这个代数方程可以通过直接计算矩阵求逆(Matrices.inv 函数)或者更有效地通过求解 B 来求解d矩阵使用Matrices.solve2函数:
Bd = Matrices.solve2(A,(Ad-identity(2)))
,从而避免计算矩阵求逆。然而,在这两种情况下 A 矩阵必须是可逆的,通常(并且经常)不成立。
- 使用 Matrices.integralExp 函数应该 return 两个离散化矩阵 (Ad, Bd) 并且应该适用于一般矩阵 A,无论是可逆的还是奇异的;但是,此功能对我不起作用 - 它 return 的错误消息:“令牌附近没有可行的替代方案:(”。
出于演示目的,我附上了两种方法的代码。状态 space 模型表示一个非常简单的二阶线性摆系统,长度为 1 m,质量为 1 kg,重力加速度为 9.81 m/s2。离散化的采样时间为 0.1 秒。第一个代码工作正常(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;
奥利弗
您忘记了示例 2 中的等式关键字。它在 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;
我需要在 OpenModelica (OMEdit) 中对连续 LTI 状态 space 模型执行 ZOH 离散化。 我尝试了两种方法:
- 利用矩阵指数函数(Matrices.exp函数)计算离散化A矩阵(Ad)及后续计算离散化B 矩阵 (Bd) 如下等式:Bd = A-1 (Ad - I) B,其中I为单位矩阵;这个代数方程可以通过直接计算矩阵求逆(Matrices.inv 函数)或者更有效地通过求解 B 来求解d矩阵使用Matrices.solve2函数:
Bd = Matrices.solve2(A,(Ad-identity(2)))
,从而避免计算矩阵求逆。然而,在这两种情况下 A 矩阵必须是可逆的,通常(并且经常)不成立。 - 使用 Matrices.integralExp 函数应该 return 两个离散化矩阵 (Ad, Bd) 并且应该适用于一般矩阵 A,无论是可逆的还是奇异的;但是,此功能对我不起作用 - 它 return 的错误消息:“令牌附近没有可行的替代方案:(”。
出于演示目的,我附上了两种方法的代码。状态 space 模型表示一个非常简单的二阶线性摆系统,长度为 1 m,质量为 1 kg,重力加速度为 9.81 m/s2。离散化的采样时间为 0.1 秒。第一个代码工作正常(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;
奥利弗
您忘记了示例 2 中的等式关键字。它在 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;