簡體   English   中英

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]

看來分母總是對的,我試過其他例子,但是轉帳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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM