Scipy 与 Matlab 传递函数的不同结果
Differing results in Scipy vs Matlab transfer functions
我不明白为什么 scipy.signal.ss2tf()
和 scipy.signal.StateSpace().to_tf()
给出(相同的)意外结果。
示例:
A=[[0, 1, 0], [0, 0, 1], [-3, -4, -2]]
B=[[0], [0], [1]]
C=[[5, 1, 0]]
D=[[0]]
scipy的结果是
num = array([[0, 0, 0, 4]]),
den = array([1., 2., 4., 3.])
在 Matlab 中结果是
num = [0,0,1,5],
den = [1,2,4,3]
好像分母总是对的,我试了其他例子,但是传递函数的分子不对应
我使用 scipy 的方式不正确吗?
(另一个例子)
A=[[0, 1, 0], [0, 0, 1], [-8, -14, -7]]
B=[[0], [0], [1]]
C=[[15, 5, 0]]
D=[[0]]
这是一个bug in SciPy。当 ss2tf
创建一个数组来保存分子时,它使用输入的数据类型来确定分子数组的数据类型。在您的例子中,这些值都是整数,因此分子的数据类型是整数。但是,分子的系数是浮点计算的结果,因此容易丢失精度。当计算值被复制到分子数组中时,这些值被截断为整数。在您的示例中,这会导致很大的错误。当我重现分子的浮点计算时,我得到 [0.0, 0.0, 0.9999999999999947, 4.999999999999995]
,当这些值被复制到整数数组时,结果是 [0, 0, 0, 4]
.
一种解决方法是确保您的输入(或至少 A
)包含浮点值。例如,
In [33]: A = [[0., 1., 0.], [0., 0., 1.], [-8., -14., -7.]]
...: B = [[0], [0], [1]]
...: C = [[15, 5, 0]]
...: D = [[0]]
In [34]: num, den = ss2tf(A, B, C, D)
In [35]: num
Out[35]: array([[0.00000000e+00, 1.77635684e-15, 5.00000000e+00, 1.50000000e+01]])
我不明白为什么 scipy.signal.ss2tf()
和 scipy.signal.StateSpace().to_tf()
给出(相同的)意外结果。
示例:
A=[[0, 1, 0], [0, 0, 1], [-3, -4, -2]]
B=[[0], [0], [1]]
C=[[5, 1, 0]]
D=[[0]]
scipy的结果是
num = array([[0, 0, 0, 4]]),
den = array([1., 2., 4., 3.])
在 Matlab 中结果是
num = [0,0,1,5],
den = [1,2,4,3]
好像分母总是对的,我试了其他例子,但是传递函数的分子不对应
我使用 scipy 的方式不正确吗?
(另一个例子)
A=[[0, 1, 0], [0, 0, 1], [-8, -14, -7]]
B=[[0], [0], [1]]
C=[[15, 5, 0]]
D=[[0]]
这是一个bug in SciPy。当 ss2tf
创建一个数组来保存分子时,它使用输入的数据类型来确定分子数组的数据类型。在您的例子中,这些值都是整数,因此分子的数据类型是整数。但是,分子的系数是浮点计算的结果,因此容易丢失精度。当计算值被复制到分子数组中时,这些值被截断为整数。在您的示例中,这会导致很大的错误。当我重现分子的浮点计算时,我得到 [0.0, 0.0, 0.9999999999999947, 4.999999999999995]
,当这些值被复制到整数数组时,结果是 [0, 0, 0, 4]
.
一种解决方法是确保您的输入(或至少 A
)包含浮点值。例如,
In [33]: A = [[0., 1., 0.], [0., 0., 1.], [-8., -14., -7.]]
...: B = [[0], [0], [1]]
...: C = [[15, 5, 0]]
...: D = [[0]]
In [34]: num, den = ss2tf(A, B, C, D)
In [35]: num
Out[35]: array([[0.00000000e+00, 1.77635684e-15, 5.00000000e+00, 1.50000000e+01]])