我运行了10次scipy.signal.lsim,好像x0只在第一次使用,为什么?
t=np.linspace(0.0,100,100*100)
transfun=[]
for i in range(10):
transfun.append(signal.lti([1],[1+i,1]))
y=[]
for i in range(10):
y.append(np.sin(2*np.pi*300*t)+np.random.normal(0,1,10000)+50)
sensor_output=[]
for i in range(10):
tout, yout, xout =signal.lsim(transfun[i],y[i],t,X0=[50.0])
sensor_output.append(yout)
fig=plt.figure()
for i in range(10):
plt.subplot(10,1,i+1)
plt.plot(t,y[i])
plt.plot(t,sensor_output[i])
plt.show()
1条答案
按热度按时间zazmityj1#
lsim
将初始 * 状态向量 * 作为参数,而不是初始输出。传递函数实际上并没有状态向量,但在幕后,
lsim
将传递函数转换为状态空间实现(它 * 确实 * 有一个状态向量),并使用它来模拟系统。一个问题是,对于给定的传递函数,没有唯一的实现。
lsim
没有说明它如何将传递函数转换为状态空间实现,但根据您的结果,我进行了一个猜测,这个猜测碰巧起作用(见下文),但它并不鲁棒。为了解决一般传递函数(即不仅仅是一阶)的问题,您需要使用特定的状态空间实现,并指定不仅仅是初始输出,否则问题将是欠约束的(我猜典型的方法是要求d(y)/dt = 0,对于所有高阶导数也是如此)。
下面是对您的问题的快速修复,以及如何对一阶状态空间实现进行此修复的草图。