2012-09-17 38 views
7

Chức năng truyền của một hệ thống LTI với thời gian trễ có một số hạng term exp (-Td * s) trong đó Td là thời gian trễ. Trong Matlab, người ta có thể tạo ra một hệ thống LTI theo nhiều cách (ví dụ: sử dụng toán tử "s" và đặt trực tiếp số mũ theo số mũ hoặc bằng cách đặt thuộc tính inputdelayoutputdelay của tf đối tượng.) Tuy nhiên, tôi không thể tìm thấy cách nào để thực hiện điều này Các đối tượng LTI tín hiệu Scipy. Tôi cũng đã kiểm tra Thư viện Hệ thống Kiểm soát Python, nhưng vẫn không thể tìm được cách nào.Làm thế nào để xác định các hệ thống LTI với thời gian trễ trong Scipy?

Tôi không muốn sử dụng ước lượng Pade cho thời gian trễ và muốn đặt thời gian trễ chính xác cho hệ thống LTI.

Có ai biết cách thực hiện điều này trong Scipy hoặc trong bất kỳ thư viện Python bên ngoài nào khác không?

Trả lời

4

Tôi đã kiểm tra mô-đun ltisys tại github và cố gắng tạo một lớp LTI với thời gian trễ. Tôi nghĩ, nó nên được đơn giản để giới thiệu một sự chậm trễ thời gian đầu vào trong phương trình nhà nước, nếu chúng ta thay thế BU (t) bởi BU (t-Td) trong đó Td là thời gian trễ. Cách tiếp cận sau hoạt động đối với hệ thống đầu ra đơn đầu vào đơn. Có thể không có lỗi, nhưng nó đã giải quyết được mục đích của tôi.

#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 
Các vấn đề liên quan