代码:
import numpy as np
from harold import Transfer, simulate_linear_system
import matplotlib.pyplot as plt
from scipy import signal
nbr_inputs = 5
t_in = np.arange(0, 10, 0.2)
dim = (nbr_inputs, len(t_in))
x = np.cumsum(np.random.normal(0, 2e-3, dim), axis=1)
H = Transfer([[[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 1, 5]]], [[[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 1, 5]]])
y, t = simulate_linear_system(H, x.T, t_in[0:1], per_channel=True)
y = y.squeeze()
plt.plot(t, y)
plt.xlabel('Time')
plt.ylabel('Output')
plt.title('System Output Response')
plt.legend(['Input 1', 'Input 2', 'Input 3', 'Input 4', 'Input 5'])
plt.show()
我想使用simulate_linear_system进行一步操作,例如: 对于范围内的 i(x.shape[1]): 'y[:, i], _ = 模拟线性系统(H, x.T[i], t_in, per_channel=True)' 但错误:时间数组需要是一维数组。
我想单步多信号输入
我尝试为simulate_linear_system找到精确的解决方案,但失败了。相反,我想出了这个解决方案。
simulate_linear_system
函数需要时间数组t
至少有两个时间点。如果您尝试仅使用一个来模拟系统,则功能将无法工作。
此外,据我所知,
simulate_linear_system
不提供每一步更新系统状态。
所以你可以只使用
scipy.signal
来实现它。
所以试试这个:
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
nbr_inputs = 5
t_in = np.arange(0, 10, 0.2)
dt = t_in[1] -t_in[0]
dim= (nbr_inputs, len(t_in))
x = np.cumsum(np.random.normal(0, 2e-3, dim), axis=1)
num = [[1, 1, i+1] for i in range(nbr_inputs)]
den = [[1, 1, i+1] for i in range(nbr_inputs)]
systems = []
for n, d in zip(num, den):
sys_tf =signal.TransferFunction(n, d)
sys_ss= sys_tf.to_ss()
discrete_sys_ss= sys_ss.to_discrete(dt)
systems.append(discrete_sys_ss)
states = [np.zeros((sys.A.shape[0],)) for sys in systems]
y = np.zeros((nbr_inputs,len(t_in)))
for i in range(len(t_in)):
u = x[:, i]
for idx, sys in enumerate(systems):
states[idx] = sys.A @ states[idx] + sys.B.flatten() * u[idx]
y[idx, i] = sys.C.flatten() @ states[idx] +sys.D.flatten() * u[idx]
plt.plot(t_in,y.T)
plt.xlabel('Time')
plt.ylabel('Outpt')
plt.title('System Output Response')
plt.legend([f'Input {i+1}' for i in range(nbr_inputs)])
plt.show()