2012-09-17 1 views
7

시간 지연을 갖는 LTI 시스템의 전달 함수는 분자 항 exp (-Td * s)를 가지며, 여기서 Td는 시간 지연이다. Matlab에서는 여러 가지 방법으로 LTI 시스템을 만들 수 있습니다 (예 : "s"연산자를 사용하고 지수 기간을 직접 설정하거나 inputdelayoutputdelay 속성을 tf 개체로 설정). 그러나이 방법은 찾을 수 없습니다. Scipy 신호 LTI 개체. 또한 Python Control Systems Library를 확인했지만 여전히 방법을 찾지 못했습니다.Scipy에서 시간 지연을 사용하여 LTI 시스템을 정의하는 방법은 무엇입니까?

시간 지연을 위해 Pade 근사를 사용하지 않고 LTI 시스템에 정확한 시간 지연을 설정하고 싶습니다.

누구나 Scipy 또는 다른 외부 Python 라이브러리에서이를 수행하는 방법을 알고 있습니까?

답변

4

github에서 ltisys 모듈을 체크 아웃하고 시간 지연이있는 LTI 클래스를 만들려고 시도했습니다. BU (t)를 BU (t-Td)로 대체하면 상태 방정식에 입력 시간 지연을 도입하는 것이 간단해야합니다. 여기서 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