2012-09-17 76 views
7

具有時間延遲的LTI系統的傳遞函數具有分子項exp(-Td * s),其中Td是時間延遲。在Matlab中,可以通過多種方式創建這樣的LTI系統(例如,使用「s」運算符並直接設置指數項或設置tf對象的屬性)。但是,我找不到任何方式來執行此操作Scipy Signal LTI對象。我也檢查了Python控制系統庫,但仍然找不到方法。如何在Scipy中定義帶時間延遲的LTI系統?

我不想使用時間延遲的帕德近似,並且想要爲LTI系統設置精確的時間延遲。

有誰知道如何在Scipy或任何其他外部Python庫中實現?

回答

4

我在github上檢出了ltisys模塊,並試圖創建一個帶時間延遲的LTI類。我認爲,如果用BU(t-Td)代替BU(t),其中Td是時間延遲,那麼在狀態方程中引入輸入時間延遲應該是直接的。 以下方法適用於單輸入單輸出系統。可能不是沒有錯誤,但它解決了我的目的。

#Inherit the parent LTI class to create LTI class with time delay 


class ltidelay(lti): 
    def __init__(self,inputdelay,*args,**kwargs): 
     super(ltidelay,self).__init__(*args,**kwargs)  
     self.d =inputdelay 

#define a method to simulate LTI with time delay . just copied lsim2 and made 2 changes. 1. passed the delay from the `ltidelay` object and 2. modified the state equation. 


def lsim3(system , U=None, T=None,X0=None, **kwargs): 
    if isinstance(system,lti): 
     sys = system 
    else: 
     sys = lti(*system) 
    delay = sys.d 
    if X0 is None: 
     X0 = zeros(sys.B.shape[0],sys.A.dtype)   
    if T is None: 
     T = linspace(0,10,101) 
    T = atleast_1d(T) 
    if len(T.shape) != 1: 
     raise ValueError("T must be a rank1 array") 
    if U is not None: 
     U = atleast_1d(U) 
     if len(U.shape)==1: 
      U=U.reshape(-1,1) 
     sU = U.shape 
     if sU[0] != len(T): 
      raise ValueError("U must have the same number of rows as elements in T") 
     if sU[1] != sys.inputs: 
      raise ValueError("The number of inputs in U is not compatible") 
     ufunc = interpolate.interp1d(T, U, kind ='linear',axis =0,bounds_error =False) 
     def fprime(x,t,sys,ufunc): 
      return dot(sys.A,x)+squeeze(dot(sys.B,nan_to_num(ufunc([t-delay])))) 
     xout = odeint(fprime,X0,T,args=(sys,ufunc),**kwargs) 
     yout = dot(sys.C,transpose(xout)) 
    else: 
     def fprime(x,t,sys): 
      return dot(sys.A,x) 
     xout = odeint(fprime,X0,T,args=(sys,),**kwargs) 
     yout = dot(sys.C, transpose(xout)) 
    return T , squeeze(transpose(yout)),xout 

#create an LTI system with delay 10 

tf = ltidelay(10,2,[4,1]) 

#create a step signal and time vector to simulate the LTI and check 


u = linspace(0,0,100) 

u[50:100] = 1 

t = linspace(1,100,100) 

#check the simulation 
y = lsim3(tf,u,t,X0 =0) 

plot(y[1]) 

enter image description here

# compare with LTI without time delay 
y1 =lsim2(tf, u,t, X0=0) 

plot(y1[1]) 

enter image description here

#delay works