我想用CSTR关于反应器温度的稳态浓度数据拟合反应常数(k0和EoverR)。 我只使用了一个简单的线性方程来生成拟合的运算数据。(Ca\U数据=-1.5*T\U反应堆/100+4.2)
因为这是稳态数据,所以不需要时间步长(m.time)。请给出如何将下面的模拟代码转换为“Ca vs.T挈U反应堆”的估算代码的建议。你知道吗
import numpy as np
import matplotlib.pyplot as plt
from gekko import GEKKO
# Feed Temperature (K)
Tf = 350
# Feed Concentration (mol/m^3)
Caf = 1
# Steady State Initial Conditions for the States
Ca_ss = 1
T_ss = 304
#%% GEKKO
m = GEKKO(remote=True)
m.time = np.linspace(0, 25, 251)
# Volumetric Flowrate (m^3/sec)
q = 100
# Volume of CSTR (m^3)
V = 100
# Density of A-B Mixture (kg/m^3)
rho = 1000
# Heat capacity of A-B Mixture (J/kg-K)
Cp = 0.239
# Heat of reaction for A->B (J/mol)
mdelH = 5e4
# E - Activation energy in the Arrhenius Equation (J/mol)
# R - Universal Gas Constant = 8.31451 J/mol-K
EoverR = 8700
# Pre-exponential factor (1/sec)
k0 = 3.2e15
# U - Overall Heat Transfer Coefficient (W/m^2-K)
# A - Area - this value is specific for the U calculation (m^2)
UA = 5e4
# initial conditions = 280
T0 = 304
Ca0 = 1.0
T = m.MV(value=T_ss)
rA = m.Var(value=0)
Ca = m.CV(value=Ca_ss)
m.Equation(rA == k0*m.exp(-EoverR/T)*Ca)
m.Equation(Ca.dt() == q/V*(Caf - Ca) - rA)
m.options.IMODE = 1
m.options.SOLVER = 3
T_reactor = np.linspace(220, 260, 11)
Ca_results = np.zeros(np.size(T_reactor))
for i in range(np.size(T_reactor)):
T.Value = T_reactor[i]
m.solve(disp=True)
Ca_results[i] = Ca[-1]
Ca_data = -1.5*T_reactor/100 + 4.2 # for generating the operation data
# Plot the results
plt.plot(T_reactor,Ca_data,'bo',linewidth=3)
plt.plot(T_reactor,Ca_results,'r-',linewidth=3)
plt.ylabel('Ca (mol/L)')
plt.xlabel('Temperature (K)')
plt.legend(['Reactor Concentration'],loc='best')
plt.show()
对于线性或非线性回归,Gekko中有一个steady state estimation mode(
IMODE=2
)。两个例子是nonlinear regression和energy price regression。对于发布的问题,以下是一些建议:m.FV()
类型;对于每个时间点具有不同值的参数,应该是m.MV()
类型。你知道吗Ca.FSTATUS=1
告诉解算器它应该尝试将Ca
的预测与Ca.value
中加载的数据相匹配。你知道吗kf.STATUS=1
告诉解算器它是一个参数,应该进行调整以最小化Ca
错误。你知道吗kf
成为可调参数,而不是直接将k0
设置为可调参数,以提高问题的可伸缩性。较大的值(如>;1e10或<;-1e10)可能会给解算器带来问题(无需自动缩放),因为渐变很小。我创建了新的参数kf
作为中间变量,以删除另外一个等式。你知道吗可以选择任意数量的参数进行估计,以改进拟合。它不需要仅限于
kf
。你的帖子提到EoverR
是另一个可能要估计的参数,但这可能不会显著改善拟合,因为k0
和EoverR
是共线的。这两个参数可以增加或减少,并给出几乎相同的解决方案。作为一个警告,需要有明显的温度变化来估计两者。你知道吗相关问题 更多 >
编程相关推荐