Python:为系统识别状态空间模型

7
我希望能够使用Python获得我所拥有系统的状态空间模型。该系统已经过测试,因此我具有其输入和测量输出。因此,我有一组相应的输入和输出数据。
是否有一个Python函数,可以通过输入和输出数据来提供代表该系统的状态空间模型呢?
5个回答

5
我尝试了GitHub上提供的这个软件包:SIPPY(Python系统识别软件包)。
它运作良好,而且非常容易使用。有许多可用于状态空间模型的识别算法(N4SID、MOESP、CVA、PARSIM方法)。我认为这是Python中最完整的代码。

2
您想使用n4sid方法,这是我所知道的Python中唯一的代码: pyN4DIS

1

工业化学和炼油应用是模型预测控制最早的应用之一。它们通常使用其他形式的识别,例如ARX(自回归外部输入)、FIR(有限脉冲响应)或传递函数模型。有很好的商业工具可以用于识别模型,例如MATLAB系统识别工具箱、DMC+(AspenTech)和RMPCT(Honeywell)。最近还有一些关于Python中Seeq系统识别的发展。SIPPY包是一个替代方案,但安装依赖项Slycot(最近商业化)可能会带来需要Fortran编译器的挑战。这里是另一篇关于模型预测控制的简单MIMO识别,使用了gekko,可通过pip install gekko获得。

System Identification

from gekko import GEKKO
import pandas as pd
import matplotlib.pyplot as plt

# load data and parse into columns
url = 'http://apmonitor.com/do/uploads/Main/tclab_dyn_data2.txt'
data = pd.read_csv(url)
t = data['Time']
u = data[['H1','H2']]
y = data[['T1','T2']]

# generate time-series model
m = GEKKO(remote=False) # remote=True for MacOS

# system identification
na = 2 # output coefficients
nb = 2 # input coefficients
yp,p,K = m.sysid(t,u,y,na,nb,diaglevel=1)

plt.figure()
plt.subplot(2,1,1)
plt.plot(t,u)
plt.legend([r'$u_0$',r'$u_1$'])
plt.ylabel('MVs')
plt.subplot(2,1,2)
plt.plot(t,y)
plt.plot(t,yp)
plt.legend([r'$y_0$',r'$y_1$',r'$z_0$',r'$z_1$'])
plt.ylabel('CVs')
plt.xlabel('Time')
plt.savefig('sysid.png')
plt.show()

有标准方法可以将ARX模型精确地转换为状态空间形式。如果预期的应用是预测控制器,则可以使用ARX模型而不是转换为状态空间形式。


0

尝试阅读这篇文章:状态空间模型这个状态空间模型2。后者使用其他Python包创建模型,您可以将其用作模块输入以满足您的需求。不确定是否有除这两组脚本之外的其他包。


0

还有sysid。我还没有尝试过这些中的任何一个,对于你已经发现或尝试过的其他东西,我很感兴趣听听。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接