当 t[0] != 0 时从 signal.lsim 得到奇怪的结果
Getting strange results from signal.lsim when t[0] != 0
我正在 运行模拟 LTI state-space 模型,我需要 运行 在不同的时间使用不同的输入。换句话说,模拟从t0 = 0 到t1=1 秒,根据t1 的结果更改系统的输入,然后从t1= 1 秒继续到t2= 2 秒。
我在t[0]试过运行初始条件X0=array([0,0]),然后取xout1的最后一个元素作为下一个[=25=的初始条件] 并给它一个从 t[0] = 1
开始的新时间序列
import numpy as np
import scipy.signal as sig
import matplotlib.pyplot as plt
r_wh = 60e-3 / 2.0 # m
m_v = 20 # kg
R_m = 21.2 # Ohms
L_m = 1.37e-3 # Henries
K_t = 21.2e-3 # Nm.A^-1
K_v = 60 / (450 * 2 * np.pi) # V.rad^-1.s^-1
I_m = 4.2e-7 # kg.m^2
I_gb = 0.4e-7 # kg.m^2
I_wh = 65275e-9 # kg.m^2
gr = 1.0/19.0
I_eq = ((I_m + I_gb) / gr) + (gr * (I_wh + 0.25 * m_v * r_wh ** 2))
A = np.array([[-R_m/L_m, (-K_v/L_m) / gr],[K_t/I_eq, 0]])
B = np.array([[1/L_m,0],[0,-1/I_eq]])
C = np.array([[0,0],[0,1]])
D = np.zeros((2,2))
SS = sig.StateSpace(A,B,C,D)
T1 = np.arange(0,1,0.01)
T2 = np.arange(1,2,0.01)
U1 = np.array([12*np.ones_like(T1),np.zeros_like(T1)]).transpose()
U2 = np.array([12*np.ones_like(T2),np.zeros_like(T2)]).transpose()
tout1, yout1, xout1 = sig.lsim(SS,U1,T1)
tout2, yout2, xout2 = sig.lsim(SS,U2,T2,X0=xout1[-1])
plt.plot(T1,xout1[:,1],T2,xout2[:,1])
您希望状态向量输出数组 "xout2" 中的第一个元素与 X0 条件匹配,但事实并非如此。这个函数"lsim"是否要求第一个时间点为0?
lsim
假设 X0
是时间 0 的状态,而不是时间 T[0]
的状态。您可以使用
获得(几乎)预期的行为
tout2, yout2, xout2 = sig.lsim(SS, U2, T2 - T2[0], X0=xout1[-1])
我说"almost",因为在xout1
到xout2
过渡的时候,剧情还是会有一个小缺口。那是因为 T1
中的值是 [0., 0.01, 0.02, ..., 0.98, 0.99]
。请注意 1.0
不在 T1
中。所以 xout1
中的最后一个值是 t=0.99 时的状态,而不是 t=1.0 时的状态。解决这个问题的一种方法是在 T1
和 T2
中包含最终的 t 值,例如使用 np.linspace
而不是 np.arange
:
T1 = np.linspace(0, 1, 101)
T2 = np.linspace(1, 2, 101)
我正在 运行模拟 LTI state-space 模型,我需要 运行 在不同的时间使用不同的输入。换句话说,模拟从t0 = 0 到t1=1 秒,根据t1 的结果更改系统的输入,然后从t1= 1 秒继续到t2= 2 秒。
我在t[0]试过运行初始条件X0=array([0,0]),然后取xout1的最后一个元素作为下一个[=25=的初始条件] 并给它一个从 t[0] = 1
开始的新时间序列import numpy as np
import scipy.signal as sig
import matplotlib.pyplot as plt
r_wh = 60e-3 / 2.0 # m
m_v = 20 # kg
R_m = 21.2 # Ohms
L_m = 1.37e-3 # Henries
K_t = 21.2e-3 # Nm.A^-1
K_v = 60 / (450 * 2 * np.pi) # V.rad^-1.s^-1
I_m = 4.2e-7 # kg.m^2
I_gb = 0.4e-7 # kg.m^2
I_wh = 65275e-9 # kg.m^2
gr = 1.0/19.0
I_eq = ((I_m + I_gb) / gr) + (gr * (I_wh + 0.25 * m_v * r_wh ** 2))
A = np.array([[-R_m/L_m, (-K_v/L_m) / gr],[K_t/I_eq, 0]])
B = np.array([[1/L_m,0],[0,-1/I_eq]])
C = np.array([[0,0],[0,1]])
D = np.zeros((2,2))
SS = sig.StateSpace(A,B,C,D)
T1 = np.arange(0,1,0.01)
T2 = np.arange(1,2,0.01)
U1 = np.array([12*np.ones_like(T1),np.zeros_like(T1)]).transpose()
U2 = np.array([12*np.ones_like(T2),np.zeros_like(T2)]).transpose()
tout1, yout1, xout1 = sig.lsim(SS,U1,T1)
tout2, yout2, xout2 = sig.lsim(SS,U2,T2,X0=xout1[-1])
plt.plot(T1,xout1[:,1],T2,xout2[:,1])
您希望状态向量输出数组 "xout2" 中的第一个元素与 X0 条件匹配,但事实并非如此。这个函数"lsim"是否要求第一个时间点为0?
lsim
假设 X0
是时间 0 的状态,而不是时间 T[0]
的状态。您可以使用
tout2, yout2, xout2 = sig.lsim(SS, U2, T2 - T2[0], X0=xout1[-1])
我说"almost",因为在xout1
到xout2
过渡的时候,剧情还是会有一个小缺口。那是因为 T1
中的值是 [0., 0.01, 0.02, ..., 0.98, 0.99]
。请注意 1.0
不在 T1
中。所以 xout1
中的最后一个值是 t=0.99 时的状态,而不是 t=1.0 时的状态。解决这个问题的一种方法是在 T1
和 T2
中包含最终的 t 值,例如使用 np.linspace
而不是 np.arange
:
T1 = np.linspace(0, 1, 101)
T2 = np.linspace(1, 2, 101)