首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用python控制包正确绘制MIMO系统的阶跃响应

如何用python控制包正确绘制MIMO系统的阶跃响应
EN

Stack Overflow用户
提问于 2020-07-02 08:32:01
回答 1查看 1.1K关注 0票数 0

我需要绘制带有python控制包的MIMO系统的步骤响应。

到目前为止,我已经尝试使用函数step_response,但是在计算步骤响应之前,可以将系统转换为单is,以便只计算一组输出。

然后,我尝试对输入使用不同设置的函数forced_response (例如,常量单位值、numpy数组等,只是为了尝试)。我得到不同的步骤响应,因此与其他输出相关,但不是所有响应(即输入数量x输出数)。

下面是一个最小样本代码,它实现了一个简单的二阶模型,该模型包含2个输入和4个输出以及虚拟数据。在附件中,我得到了一幅回应图。

stepResponses

在我的测试中,我首先运行了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步骤函数所做的)完全控制步骤响应的方法?

不幸的是,有关这方面的文档很差,实际例子也很少。

这要感谢谁能帮上忙。

代码语言:javascript
复制
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]')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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阶跃响应输出]

幸运的是,这是一个简单的修复:)

代码语言:javascript
复制
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]')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62692191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档