[英]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]
看來分母總是對的,我試過其他例子,但是轉帳function的分子不對應。
我是否以不正確的方式使用 scipy?
(另一個例子)
A=[[0, 1, 0], [0, 0, 1], [-8, -14, -7]]
B=[[0], [0], [1]]
C=[[15, 5, 0]]
D=[[0]]
這是SciPy中的錯誤。 當ss2tf
創建一個數組來保存分子時,它使用輸入的數據類型來確定分子數組的數據類型。 在您的情況下,這些值都是整數,因此分子的數據類型是 integer。 但是,分子的系數是浮點計算的結果,因此會損失精度。 當計算值被復制到分子數組中時,這些值將被截斷為整數。 在您的示例中,這會導致很大的錯誤。 當我重現分子的浮點計算時,我得到[0.0, 0.0, 0.9999999999999947, 4.999999999999995]
,當這些值被復制到 integer 數組中時,結果是[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]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.