如何在gekko中构建过程模拟器,了解时间常数和稳态值

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

我有一个非常复杂的非线性动力学系统,从CFD(计算流体动力学)中,我知道每个时间点的时间常数和稳态响应。我如何(1)使用此信息构建过程模拟器? (2)如果我知道测量的输入和输出以及稳态值,如何调整时间常数值?

python process simulator gekko non-linear
1个回答
0
投票

问题1:构建流程模拟器

您可能首先要尝试线性时间序列模型,然后在不起作用的情况下使用非线性模型。下面是一个示例脚本,用于识别线性时间序列模型。

Linear 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()

请注意,数据可以是动态数据,不一定要分为稳态和动态部分。您需要使用正确的输入作为m.sysid来调用detailed in the documentation。建立好模型后,可以使用m.arx(p)将其转换为模拟器,其中pm.sysid函数的参数输出。

如果线性识别不起作用,则可以尝试非线性方法,如TCLab B Exercise (See Python Gekko Neural Network)中所示。您可以使用Gekko's Deep Learning capabilities简化编码。拥有稳态关系后,请添加具有一阶或二阶关系的动力学,以及将稳态输出与动态输出相关的微分方程,例如m.Equation(tau * x.dt() + x = x_ss),其中tau是时间常数, x.dt()是时间导数,x是动态输出,x_ss是稳态输出。之所以称为Hammerstein模型,是因为稳态先于动态计算。您也可以将动态特性作为维纳模型放置在输入上。您将可以在线找到有关Hammerstein-Wiener模型的更多信息。

问题2:调整时间常数

如果您已经具有稳态关系并且想要tune时间常数,那么回归法是一种强大的方法,因为它可以尝试许多不同的时间常数组合,以最大程度地减少模型和度量之间的差异。有一些使用scipy.optimize.minimizescipy.optimize.minimize进行此操作的示例。

gekko

Estimate Parameters with Python Gekko
© www.soinside.com 2019 - 2024. All rights reserved.