作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
具有时间延迟的 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])
# compare with LTI without time delay
y1 =lsim2(tf, u,t, X0=0)
plot(y1[1])
#delay works
关于python - 如何在 Scipy 中定义具有时间延迟的 LTI 系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12451767/
我是一名优秀的程序员,十分优秀!