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

Python 了解时间常数和稳态值如何在gekko中建立过程模拟器,python,process,simulator,gekko,non-linear,Python,Process,Simulator,Gekko,Non Linear,我有一个非常复杂的非线性动力学系统,我从CFD(计算流体动力学)中知道每个时间点的时间常数和稳态响应。我(1)如何使用这些信息构建流程模拟器?和(2)如果我知道测量的输入和输出以及稳态值,我如何调整时间常量值 问题1:构建过程模拟器 你可能想先尝试一个线性时间序列模型,如果不行的话,再去非线性模型。下面是一个识别线性时间序列模型的示例脚本 从gekko导入gekko 作为pd进口熊猫 将matplotlib.pyplot作为plt导入 #加载数据并解析为列 url='1〕http://apmo

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

问题1:构建过程模拟器

你可能想先尝试一个线性时间序列模型,如果不行的话,再去非线性模型。下面是一个识别线性时间序列模型的示例脚本

从gekko导入gekko
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
#加载数据并解析为列
url='1〕http://apmonitor.com/do/uploads/Main/tclab_dyn_data2.txt'
数据=pd.read\u csv(url)
t=数据[‘时间’]
u=数据[['H1','H2']]
y=数据[['T1','T2']]
#生成时间序列模型
m=GEKKO(remote=False)#对于MacOS,remote=True
#系统识别
na=2#输出系数
nb=2#输入系数
yp,p,K=m.sysid(t,u,y,na,nb,diaglevel=1)
plt.图()
plt.子地块(2,1,1)
plt.绘图(t,u)
plt.legend([r'$u_0$',r'$u_1$'))
plt.ylabel('MVs')
plt.子地块(2,1,2)
plt.绘图(t,y)
plt.绘图(t,yp)
plt.legend([r'$y_0$',r'$y_1$',r'$z_0$',r'$z_1$'))
plt.ylabel('CVs'))
plt.xlabel(“时间”)
plt.savefig('sysid.png'))
plt.show()
请注意,数据可以是动态数据,不一定分为稳态部分和动态部分。您需要使用正确的输入调用
m.sysid
。一旦你有了一个好的模型,你就可以用
m.arx(p)
把它转换成一个模拟器,其中
p
m.sysid
函数输出的参数

如果线性识别不起作用,那么您可以尝试非线性方法,如中所示。您可以使用来简化编码。一旦建立了稳态关系,添加一阶或二阶关系的动力学和一个微分方程,该微分方程将稳态输出与动态输出相关联,例如
m.方程(tau*x.dt()+x=x_ss)
,其中
tau
是时间常数,
x.dt()
是时间导数,
x
是动态输出,
x\u ss
是稳态输出。这被称为Hammerstein模型,因为稳态先于动态计算。您还可以将输入上的动力学作为维纳模型。你可以在网上找到更多关于Hammerstein-Wiener模型的信息

问题2:调整时间常数

如果您已经有一个稳态关系,并且您想要调整时间常数,那么回归是一个强大的方法,因为它可以尝试时间常数的许多不同组合,以最小化模型和测量之间的差异。有一些使用和执行此操作的示例

将numpy导入为np
将matplotlib.pyplot作为plt导入
作为pd进口熊猫
从gekko进口gekko
#导入或生成数据
文件名='tclab\u dyn\u data2.csv'
尝试:
data=pd.read\u csv(文件名)
除:
url='1〕http://apmonitor.com/do/uploads/Main/tclab_dyn_data2.txt'
数据=pd.read\u csv(url)
#创建GEKKO模型
m=GEKKO()
m、 时间=数据['time']。值
#要估计的参数
U=m.FV(值=10,磅=1,磅=20)
alpha1=m.FV(值=0.01,磅=0.003,磅=0.03)#W/%加热器
alpha2=m.FV(值=0.005,磅=0.002,磅=0.02)#W/%加热器
#状态=1允许解算器调整参数
美国地位=1
alpha1.STATUS=1
alpha2.STATUS=1
#测量输入
Q1=毫伏(值=数据['H1'].值)
Q2=毫伏(值=数据['H2'].值)
#状态变量
TC1=m.CV(值=数据['T1'].值)
TC1.FSTATUS=1#最小化FSTATUS*(meas pred)^2
TC2=m.CV(值=数据['T2'].值)
TC2.FSTATUS=1#最小化FSTATUS*(meas pred)^2
Ta=m.Param(值=19.0+273.15)#K
质量=m.Param(值=4.0/1000.0)#kg
Cp=m.Param(值=0.5*1000.0)#J/kg-K
A=m.Param(值=10.0/100.0**2)#不在m^2内加热器之间的区域
As=m.Param(值=2.0/100.0**2)#加热器之间的面积,单位为m^2
eps=m.Param(值=0.9)#发射率
sigma=m.Const(5.67e-8)#Stefan Boltzmann
#加热器温度(开尔文)
T1=m.中间值(TC1+273.15)
T2=m.中间值(TC2+273.15)
#两个加热器之间的传热
Q_C12=m.中间(U*As*(T2-T1))#对流
Q_R12=m.中间(eps*σ*As*(T2**4-T1**4))#辐射
#半基本关联(能量平衡)
m、 方程(TC1.dt()==(1.0/(质量*Cp))*(U*A*(Ta-T1)\
+eps*西格玛*A*(Ta**4-T1**4)\
+Q_C12+Q_R12\
+字母1*Q1)
m、 方程(TC2.dt()==(1.0/(质量*Cp))*(U*A*(Ta-T2)\
+eps*西格玛*A*(Ta**4-T2**4)\
-Q_C12-Q_R12\
+字母2*Q2)
#选择权
m、 options.IMODE=5#MHE
m、 options.EV_TYPE=2#目标类型
m、 options.NODES=2个#配置节点
m、 options.SOLVER=3#IPOPT
#解决
m、 求解(disp=True)
#参数值
打印('U:'+str(U.value[0]))
打印('alpha1:'+str(alpha1.value[0]))
打印('alpha2:'+str(alpha2.value[0]))
#创建绘图
plt.图()
ax=零件子批次(2,1,1)
ax.grid()
plt.绘图(数据['Time'],数据['T1'],'ro',标签=r'$T_1$measured')
plt.plot(m.time,TC1.value,color='purple',linestyle='-->\
线宽=3,标签=r'$T\U 1$predicted')
plt.plot(数据['Time'],数据['T2'],'bx',标签=r'$T_2$measured')
plt.plot(m.time,TC2.value,color='orange',linestyle='--'\
线宽=3,标签=r'$T\U 2$predicted')
plt.ylabel('温度(摄氏度)')
plt.图例(loc=2)
ax=零件子批次(2,1,2)
ax.grid()
plt.绘图(数据['Time'],数据['H1'],'r-'\
线宽=3,标签=r'$Q_1$')
plt.plot(数据['Time'],数据['H2'],'b:'\
线宽=3,标签=r'$Q_2$')
plt.ylabel(“加热器”)
plt.xlabel(‘时间(秒)’)
plt.图例(loc='best')
plt.show()

非常感谢您的宝贵建议。我相信,正如你所说的那样