gpt4 book ai didi

python - 如何在 Scipy 中定义具有时间延迟的 LTI 系统?

转载 作者:太空狗 更新时间:2023-10-29 21:50:35 29 4
gpt4 key购买 nike

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

我不想对时间延迟使用 Pade 近似,而是想为 LTI 系统设置准确的时间延迟。

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

最佳答案

我检查了 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

关于python - 如何在 Scipy 中定义具有时间延迟的 LTI 系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451767/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com