运行两次时scipy.signal.lsim得到奇怪结果

mklgxw1f  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(157)

我运行了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()

zazmityj

zazmityj1#

lsim将初始 * 状态向量 * 作为参数,而不是初始输出。
传递函数实际上并没有状态向量,但在幕后,lsim将传递函数转换为状态空间实现(它 * 确实 * 有一个状态向量),并使用它来模拟系统。
一个问题是,对于给定的传递函数,没有唯一的实现。lsim没有说明它如何将传递函数转换为状态空间实现,但根据您的结果,我进行了一个猜测,这个猜测碰巧起作用(见下文),但它并不鲁棒。
为了解决一般传递函数(即不仅仅是一阶)的问题,您需要使用特定的状态空间实现,并指定不仅仅是初始输出,否则问题将是欠约束的(我猜典型的方法是要求d(y)/dt = 0,对于所有高阶导数也是如此)。
下面是对您的问题的快速修复,以及如何对一阶状态空间实现进行此修复的草图。

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

nex = 3

t = np.linspace(0, 40, 1001)

taus = [1, 5, 10]

transfun = [signal.lti([1],[tau,1])
            for tau in taus]

u = np.tile(50, t.shape)
yinit = 49

sensor_output = [signal.lsim(tf,u,t,X0=[yinit*tau])[1]
                 for tf, tau in zip(transfun, taus)]

fig=plt.figure()
for i in range(nex):
    plt.subplot(nex,1,i+1)
    plt.plot(t,u)
    plt.plot(t,sensor_output[i])
plt.savefig('img1.png')

# different SS realizations of the same TF need different x0

# to get the same initial y0

g = signal.tf2ss([1], [10, 1])

# create SS system with the same TF

k = 1.234
g2 = (g[0], k*g[1], g[2]/k, g[3])

# desired initial value

y0 = 321

# solve for initial state for the two SS systems

x0 =  y0 / g[2]
x0_2 = y0 / g2[2]
output = [signal.lsim(g,u,t,X0=x0)[1],
          signal.lsim(g2,u,t,X0=x0_2)[1]]

fig=plt.figure()
for i,out in enumerate(output):
    plt.subplot(len(output),1,i+1)
    plt.plot(t,u)
    plt.plot(t,out)
plt.savefig('img2.png')

plt.show()

相关问题