Matlab中ss2tf背后的算法
The algorithm behind ss2tf in Matlab
传递函数有 canonical 状态-space 的可控和可观察形式。
但是,当我从 Matlab 尝试 ss2tf
时,我收到了不同的结果。 Matlab 使用什么样的算法?是否也有任何文档或开源实现?
>> a = [1 0.4 1];
>> b = [1 2 1];
>> [A,B,C,D] = tf2ss(b,a)
A =
-0.4000 -1.0000
1.0000 0
B =
1
0
C =
1.6000 0
D =
1
刚刚查看了 ss2tf
,您想了解哪些内部功能。它基本上从状态-space 系统计算极点和零点,然后形成传递函数。它使用函数 ss2zp
来执行此操作。通过计算状态矩阵 A 的特征值可以很容易地确定极点。但是,我实际上并不知道它是如何计算零点的。因为功能。 ltipack.sszero
计算状态 space 系统的零点是 protected. However, most likely it uses an algorithm similar to http://www.mathworks.com/matlabcentral/fileexchange/2199-digital-control/content/sszero.m。
您还可以检查https://github.com/ilayn/harold/blob/master/harold/harold.py#L2162 which uses the algorithm described in http://perso.uclouvain.be/paul.vandooren/publications/MisraVV94.pdf
首先要记住的是状态表示不是唯一的。不同的状态表示可以导致相同的转移表示(它们实际上形成等价 class 直到 pole/zero 取消)。
这里的区别仅此而已。检查以下系统:它们都具有相同的传递函数但具有不同的 C 矩阵(G、H 与 J 不同)但 H、J 是规范形式
G = ss(tf(b,a))
H = ss2ss(G,rot90(eye(2)))
J = canon(H,'companion')
和 canon
使用非对角线的负数可能在平衡后使用 A 矩阵。也可能是一个错误。
As WG~ mentioned (shameless plug I'm the author of harold
),通常有更多涉及转换的算法,因为 MIMO 系统需要更多的关注。我实现了 W.A 第 4.4 节的变体。 Wolowich,线性多变量系统 (1974)。我认为 matlab 做了类似的事情,但也平衡了(某种)我尚未添加的实现。
一般来说,由于伴随结构,这些可控和可观察的形式在数值上不是很好的条件。因此,如果有相当大的规模和严重性,则需要格外小心。
在实践中,除了一些教科书练习之外,不要将它们用于评估可控性或可观察性。而是使用 minreal
并使用最小系统。
之所以会出现伴矩阵,是因为实数多项式的根和这个多项式的系数构成的伴矩阵的特征值重合。对于一些历史评论,请查看关于根的 Cleve Moler's blog post。
举一个class为什么这是病态问题的例子here is the example from the master himself。
传递函数有 canonical 状态-space 的可控和可观察形式。
但是,当我从 Matlab 尝试 ss2tf
时,我收到了不同的结果。 Matlab 使用什么样的算法?是否也有任何文档或开源实现?
>> a = [1 0.4 1];
>> b = [1 2 1];
>> [A,B,C,D] = tf2ss(b,a)
A =
-0.4000 -1.0000
1.0000 0
B =
1
0
C =
1.6000 0
D =
1
刚刚查看了 ss2tf
,您想了解哪些内部功能。它基本上从状态-space 系统计算极点和零点,然后形成传递函数。它使用函数 ss2zp
来执行此操作。通过计算状态矩阵 A 的特征值可以很容易地确定极点。但是,我实际上并不知道它是如何计算零点的。因为功能。 ltipack.sszero
计算状态 space 系统的零点是 protected. However, most likely it uses an algorithm similar to http://www.mathworks.com/matlabcentral/fileexchange/2199-digital-control/content/sszero.m。
您还可以检查https://github.com/ilayn/harold/blob/master/harold/harold.py#L2162 which uses the algorithm described in http://perso.uclouvain.be/paul.vandooren/publications/MisraVV94.pdf
首先要记住的是状态表示不是唯一的。不同的状态表示可以导致相同的转移表示(它们实际上形成等价 class 直到 pole/zero 取消)。
这里的区别仅此而已。检查以下系统:它们都具有相同的传递函数但具有不同的 C 矩阵(G、H 与 J 不同)但 H、J 是规范形式
G = ss(tf(b,a))
H = ss2ss(G,rot90(eye(2)))
J = canon(H,'companion')
和 canon
使用非对角线的负数可能在平衡后使用 A 矩阵。也可能是一个错误。
As WG~ mentioned (shameless plug I'm the author of harold
),通常有更多涉及转换的算法,因为 MIMO 系统需要更多的关注。我实现了 W.A 第 4.4 节的变体。 Wolowich,线性多变量系统 (1974)。我认为 matlab 做了类似的事情,但也平衡了(某种)我尚未添加的实现。
一般来说,由于伴随结构,这些可控和可观察的形式在数值上不是很好的条件。因此,如果有相当大的规模和严重性,则需要格外小心。
在实践中,除了一些教科书练习之外,不要将它们用于评估可控性或可观察性。而是使用 minreal
并使用最小系统。
之所以会出现伴矩阵,是因为实数多项式的根和这个多项式的系数构成的伴矩阵的特征值重合。对于一些历史评论,请查看关于根的 Cleve Moler's blog post。
举一个class为什么这是病态问题的例子here is the example from the master himself。