9

具有时间延迟的 LTI 系统的传递函数有一个分子项 exp(-Td * s),其中 Td 是时间延迟。在 Matlab 中,可以通过多种方式创建这样的 LTI 系统(例如,使用“s”运算符并直接设置指数项或通过设置对象的inputdelay outputdelay属性tf。)但是,我在 Scipy Signal LTI 中找不到任何方法来做到这一点对象。我还检查了 Python 控制系统库,但仍然找不到方法。

我不想将 Pade 近似用于时间延迟,并且想为 LTI 系统设置准确的时间延迟。

有谁知道如何在 Scipy 或任何其他外部 Python 库中实现这一点?

4

1 回答 1

7

我在 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])

在此处输入图像描述

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

plot(y1[1])

在此处输入图像描述

#delay works
于 2012-09-25T13:20:53.927 回答