我需要绘制带有python控制包的MIMO系统的步骤响应。
到目前为止,我已经尝试使用函数step_response,但是在计算步骤响应之前,可以将系统转换为单is,以便只计算一组输出。
然后,我尝试对输入使用不同设置的函数forced_response (例如,常量单位值、numpy数组等,只是为了尝试)。我得到不同的步骤响应,因此与其他输出相关,但不是所有响应(即输入数量x输出数)。
下面是一个最小样本代码,它实现了一个简单的二阶模型,该模型包含2个输入和4个输出以及虚拟数据。在附件中,我得到了一幅回应图。
在我的测试中,我首先运行了step_response函数,yout结果的大小为4 x size_time (因此只有前4个输出是兴奋的)。
然后我运行forced_response函数,而youtForced仍然得到大小4 x size_time的结果,而不是像我预期的那样大小4 x size_time x 2 (或类似的)(在假设条件下,forced_response将系统视为MIMO)。
是否有一种通过forced_response函数(类似于MATLAB步骤函数所做的)完全控制步骤响应的方法?
不幸的是,有关这方面的文档很差,实际例子也很少。
这要感谢谁能帮上忙。
from control import ss, step_response, forced_response
import numpy as np
import matplotlib.pyplot as plt
sz = 2
f1 = 1*2*np.pi
f2 = 1.5*2*np.pi
OM2 = [-f1**2, -f2**2]
ZI = [-2*f1*0.01, -2*f2*0.01]
A11 = np.zeros((sz, sz))
A12 = np.eye(sz)
A21 = np.diag(OM2)
A22 = np.diag(ZI)
A = np.vstack((np.concatenate((A11, A12), axis=1), np.concatenate((A21, A22), axis=1)))
B1 = np.zeros((sz, sz))
B2 = [[1e-6, 1e-7],[2e-6, 2e-7]]
B = np.vstack((B1, B2))
C1 = np.zeros((sz, sz*2))
C1[0] = [1e-4, 2*1e-4, 3*1e-4, 5*1e-5]
C1[1] = [2e-4, 3.5*1e-4, 1.5*1e-4, 2*1e-5]
C2 = np.zeros((sz*2, sz))
C = np.concatenate((C1.T, C2), axis=1)
D = np.zeros((sz*2, sz))
sys = ss(A, B, C, D)
tEnd = 1
time = np.arange(0, tEnd, 1e-3)
tout, youtStep = step_response(sys, T=time)
tout, youtForced, xout = forced_response(sys, T=time, U=1.0)
plt.figure()
for k, y in enumerate(youtStep):
plt.subplot(4,1,k+1)
plt.grid(True)
plt.plot(tout, y,label='step')
plt.plot(tout, youtForced[k], '--r',label='forced')
if k == 0:
plt.legend()
plt.xlabel('Time [s]')发布于 2020-07-17 04:14:59
好的,通过函数control.matlab.step很容易管理step响应,它实际上允许选择MIMO系统的不同输入,我最初忽略了这一点,但在正式文档中有很好的报告:
https://python-control.readthedocs.io/en/0.8.1/generated/control.matlab.step.html
这是输出[MIMO阶跃响应输出]
幸运的是,这是一个简单的修复:)
from control import ss
import control.matlab as ctl
import numpy as np
import matplotlib.pyplot as plt
sz = 2
f1 = 1*2*np.pi
f2 = 1.5*2*np.pi
OM2 = [-f1**2, -f2**2]
ZI = [-2*f1*0.01, -2*f2*0.01]
A11 = np.zeros((sz, sz))
A12 = np.eye(sz)
A21 = np.diag(OM2)
A22 = np.diag(ZI)
A = np.vstack((np.concatenate((A11, A12), axis=1), np.concatenate((A21, A22), axis=1)))
B1 = np.zeros((sz, sz))
B2 = [[1e-6, 1e-7],[2e-6, 2e-7]]
B = np.vstack((B1, B2))
C1 = np.zeros((sz, sz*2))
C1[0] = [1e-4, 2*1e-4, 3*1e-4, 5*1e-5]
C1[1] = [2e-4, 3.5*1e-4, 1.5*1e-4, 2*1e-5]
C2 = np.zeros((sz*2, sz))
C = np.concatenate((C1.T, C2), axis=1)
D = np.zeros((sz*2, sz))
sys = ss(A, B, C, D)
tEnd = 100
time = np.arange(0, tEnd, 1e-3)
yy1, tt1 = ctl.step(sys, T=time, input=0)
yy2, tt2 = ctl.step(sys, T=time, input=1)
plt.figure()
for k in range(0, len(yy1[1,:])):
plt.subplot(4,1,k+1)
plt.grid(True)
plt.plot(tt1, yy1[:,k], label='input=0')
plt.plot(tt2, yy2[:,k], label='input=1')
if k == 0:
plt.legend()
plt.xlabel('Time [s]')https://stackoverflow.com/questions/62692191
复制相似问题