如何一次性使用 scipy 信号进行 MIMO 系统

问题描述 投票:0回答:1

代码:

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)' 但错误:时间数组需要是一维数组。

我想单步多信号输入

python signals
1个回答
0
投票

我尝试为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()
© www.soinside.com 2019 - 2024. All rights reserved.