gPROMS二次开发教程(03):第一个模型——把一台 CSTR 写成 gPROMS 能解的方程组
版本声明块
- 工具/软件:gPROMS 桌面建模环境
gPROMS ModelBuilder;检索期官方发布锚点gPROMS Process 2022.1.0,适用版本以官方发布说明为准- 语言/环境:gPROMS 语言(equation-oriented modelling);顶层实体
MODELS/PROCESSES- 本文目标:把一台连续搅拌釜反应器(CSTR)从"物理描述"逐步翻译成 gPROMS 能求解的稳态方程组,并完成建模的第一条纪律——自由度核对
一句话结论:一台 CSTR 稳态模型的本质只有三组方程——总物料衡算、组分衡算、能量衡算——再加一组本构式(如反应速率式);把它们写进MODELS,在PROCESSES里实例化并赋参数,然后核对"方程数 = 未知数"(本文示例为 6 个未知量对 6 个方程),你就完成了第一次真正意义上的 gPROMS 建模。
〇、本篇要解决的认知问题
- Q1:从"物理模型"到"方程组",中间到底要经过哪几步?每步要交出什么?
- Q2:
MODELS实体的最小骨架长什么样?参数段、变量段、方程段各装什么? - Q3:怎么用
PROCESSES把模型实例化并给参数赋值? - Q4:稳态求解后,怎么判断"这个解是可信的",而不是"软件随便给了我一组数"?
- Q5:什么是自由度?怎么用直觉快速检查"方程数够不够"?
一、机制解析
1.1 从物理到方程:四步翻译流程
gPROMS 是 equation-oriented 平台,建模的第一动作不是"点模块",而是写方程。任何单元模型的翻译都走同一条流水线:
① 划控制体 ② 写守恒方程 ③ 补本构方程 ④ 定参数 (选一个"盒子", (质量/组分/能量 (速率式、相平衡、 (把已知量从 声明进出流股) 进出之差 = 累积) 传递关系等) 方程里"摘"出来) │ │ │ │ ▼ ▼ ▼ ▼ 图:进出口 式:Σin - Σout = 0 式:r = f(T, C…) 表:已知量清单四步里最容易出错的是第 ③ 步与第 ④ 步的边界:哪些量放"方程"里求,哪些量当"参数"给定?这个决定直接决定模型的可解性(§1.5)。
经验法则:先在纸上写出方程,数一遍方程个数、再数一遍未知量个数,两数不等就不要打开软件。软件不会替你补方程,只会告诉你"解不出来"。
1.2 CSTR 控制体与它的方程组
取一台连续搅拌釜反应器,做如下假设:全釜理想混合(出口浓度/温度 = 釜内值)、恒体积(液位恒定)、单一放热反应、夹套等温冷却。控制体示意:
F_in, T_in, C_Ain │ ▼ ┌───────────────────────────┐ │ 理想混合釜 │ ← 釜内:C_A, T, V │ (全釜同一浓度与温度) │ 反应:A → B(放热) │ 反应速率 r = f(T, C_A) │ └───────────┬───────────────┘ │ ▲ 冷却介质带走热量(夹套) ▼ F_out, T_out, C_Aout (= 釜内 C_A, T)稳态(无累积)下的方程清单:
| 编号 | 方程 | 物理意义 | 类型 |
|---|---|---|---|
| E1 | F_in - F_out = 0 | 总物料衡算(恒体积、稳态 ⇒ 进=出) | 守恒 |
| E2 | F_in*C_Ain - F_out*C_A - r*V = 0 | 组分 A 衡算(进 - 出 - 反应消耗 = 0) | 守恒 |
| E3 | 焓衡算(进料带入 - 出料带出 ± 反应热 - 冷却移热 = 0) | 能量衡算 | 守恒 |
| E4 | r = k0*exp(-Ea/(R*T))*C_A | 反应速率(Arrhenius 本构) | 本构 |
| E5 | V - F_out*tau = 0之类的停留时间关系 | 几何/水力约束 | 本构 |
| E6 | 冷却移热与温差的关系式 | 换热本构 | 本构 |
铁律 8(建模先算自由度):任何模型示例给出后,必须同步给出"方程数 vs 未知数"核对与已知量清单。本节与 §二.3 会完整兑现这条。
1.3MODELS实体的最小骨架
一个模型的骨架由声明与方程两部分组成(具体段关键字与书写规则以官方文档为准):
MODELS ┌─ 声明区:把模型用到的所有量"登记造册" │ PARAMETER ← 已知量(几何、进料、动力学常数)——已确证关键字 │ VARIABLE ← 待求量(出口状态、反应速率)——已确证关键字 └─ 方程区:把 E1~E6 写进去(段名以官方文档为准)关键点:声明区是"给求解器看的清单",方程区是"给求解器看的约束"。二者必须严格对应——声明了却不出现在方程里的变量会变成"自由变量",直接破坏可解性。
1.4PROCESSES:把模型变成"一台具体的设备"
MODELS只是"蓝本",不带任何具体数值。要真正算起来,需要在PROCESSES里做三件事:
PROCESSES ① UNIT 声明 ← 把 MODELS 里的模型实例化成一台设备(已确证关键字) ② 参数赋值 ← 把该实例的 PARAMETER 填上具体数值 ③ TOPOLOGY 连接 ← 把设备端口 PORT 连起来(连接即方程)——已确证关键字心法:模型与工况分离。同一个MODELS里的 CSTR,可以被实例化成"进料 100 kg/h 的工况甲"和"进料 200 kg/h 的工况乙"两台设备,互不干扰。这正是第 13 篇"一个模型多种工况"的基础。
1.5 自由度:为什么"方程数 = 未知数"是铁律
gPROMS 求解的是联立方程组。可解的前提是方程数 = 未知量数。破坏这个平衡的两种典型情形:
| 情形 | 数学表现 | 你会看到的现象 |
|---|---|---|
| 方程太少(欠定) | 方程数 < 未知量数 | 报"自由度不足 / 无法确定唯一解" |
| 方程太多(超定) | 方程数 > 未知量数 | 报"超定 / 约束冲突",或无解 |
| 数量相等但结构奇异 | 方程线性相关(例如把同一个衡算写了两遍) | 能进求解但残差不降、结果荒谬 |
直觉检查法(三步):① 列出所有未知量(变量段里的每一个);② 列出所有独立约束(每一条不重复的方程);③ 逐一"消元"——每用一个方程消掉一个未知量,最后能否恰好把所有未知量都消掉。消不掉的量就是"自由度缺口"。
经验法则:把"已知量清单"和"方程清单"分别写在两张纸上,用"消元计数"而不是"感觉"来判定。第 10 篇会把这套直觉升级为系统的诊断流程。
二、完整模型与逐行剖析
代码 2-1:CSTR 稳态模型(MODELS,结构示意,全段抄录)
% --------------------------------------------------------------------------- % 说明:本块为"结构示意"。除已确证的实体与段关键字(MODELS / PARAMETER / % VARIABLE)外,方程段的段名与方程书写规则以官方 gPROMS 文档为准。 % 方程本身是标准守恒式,数值均为教学示例值,请以文献或官方示例数据替换。 % --------------------------------------------------------------------------- MODELS % 顶层实体:模型定义 %% ---- 声明区:已知量(参数)---- PARAMETER % 段:已知量(已确证关键字) F_in = 1.0 % 进料体积流量(示意单位) C_Ain = 2.0 % 进料中 A 的浓度 T_in = 320.0 % 进料温度 V = 0.5 % 釜有效体积 k0 = 1.0e6 % Arrhenius 指前因子(示例值,需文献替换) Ea = 5.0e4 % 活化能(示例值,需文献替换) R = 8.314 % 通用气体常数 dH = -8.0e4 % 反应焓(负值表示放热,示例值) rho_cp = 4.0e3 % 物料体积热容 UA = 500.0 % 夹套总传热系数×面积 T_c = 300.0 % 冷却介质温度 %% ---- 声明区:待求量(变量)---- VARIABLE % 段:待求量(已确证关键字) F_out % 出口体积流量 C_A % 釜内(= 出口)A 的浓度 T % 釜内(= 出口)温度 r % 反应速率 tau % 平均停留时间 Q_cool % 夹套移热速率 %% ---- 方程区:守恒 + 本构(段名与书写规则以官方文档为准)---- %% E1 总物料衡算:稳态、恒体积 ⇒ 进 = 出 F_in - F_out = 0 %% E2 组分衡算:进 - 出 - 反应消耗 = 0 F_in*C_Ain - F_out*C_A - r*V = 0 %% E3 能量衡算:进料带入 - 出料带出 + 反应放热 - 夹套移热 = 0 % 注:反应放热以 |dH|*r*V 形式进入;夹套移热 Q_cool 是待求量之一 F_in*rho_cp*(T_in - T) - dH*r*V - Q_cool = 0 %% E4 速率本构:Arrhenius 形式 r = k0*exp(-Ea/(R*T))*C_A %% E5 停留时间定义:tau = V / F_out tau*F_out - V = 0 %% E6 夹套移热本构:Q_cool = UA*(T - T_c) Q_cool - UA*(T - T_c) = 0逐行剖析:
- 声明区为什么分两段:
PARAMETER装"已知量"(进料、几何、动力学常数),VARIABLE装"待求量"(出口状态、速率、移热)。把量放错段,是"模型写得出来但解不出来"的第一大来源——把一个待求量误写成参数,就等于少了一个未知量、多了一个约束。 E1为什么这么"废话":稳态 + 恒体积下"进=出"看似平凡,但它是闭合方程组的必要一环;省略它会立刻造成欠定。E2的符号约定:反应消耗以- r*V出现,因为r定义为消耗 A 的速率。符号约定必须在模型里统一,否则会算出"负浓度"。E3的能量衡算把反应热与冷却并在一起:这是 CSTR 非等温特性的核心;dH取负值时,- dH*r*V为正,表示放热。E4的 Arrhenius 是:本构式,不是守恒式;它把速率与温度、浓度联系起来,是"物理化学进入方程"的入口。E5/E6是两条"定义式":它们把辅助量(tau、Q_cool)与主状态量绑定,作用是补齐未知量数目,让方程组闭合。- 数值均为示例值:请务必用可引用文献或官方示例的数据替换(铁律 10)。
代码 2-2:PROCESSES——实例化与赋参数(结构示意)
% --------------------------------------------------------------------------- % 说明:本块为"结构示意",展示"模型 → 设备"的实例化与赋参流程。 % UNIT 与 TOPOLOGY 为已确证关键字;具体语法以官方 gPROMS 文档为准。 % --------------------------------------------------------------------------- PROCESSES % 顶层实体:流程(已确证关键字) %% ---- ① UNIT 声明:把 MODELS 里的 CSTR 模型实例化成一台设备 ---- UNIT cstr_main AS cstr_steady % 声明一台设备,引用模型 cstr_steady %% ---- ② 参数赋值:给这台设备的已知量填具体数值 ---- F_in = 1.0 % 覆盖模型默认的进料流量 C_Ain = 2.0 % 本工况的进料浓度 T_in = 320.0 % 本工况的进料温度 T_c = 300.0 % 本工况的冷却介质温度 %% 其余参数沿用模型默认值;跨工况复用时应显式列出,避免"隐式继承" %% ---- ③ TOPOLOGY 连接:把设备端口连起来(连接即方程)---- %% 本例为单台设备稳态演示,暂不连接上下游; %% 若接入流程,则在此把上游出口 PORT 与本设备入口 PORT 相连, %% 语义上等价于"两端 PORT 内所有变量逐一写成相等方程"。逐行剖析:
UNIT cstr_main AS cstr_steady是"实例化":左边是这台设备在流程里的名字(cstr_main),右边是它引用的模型(cstr_steady)。改流程不改模型,改模型影响所有引用它的设备。- 参数赋值要显式:即使某参数与模型默认值相同,跨工况复用时也建议显式列出,避免"隐式继承"导致"我明明改了参数,结果没变"的困惑。
TOPOLOGY段的存在感在单台设备时不强,但它才是流程建模的主战场(第 09 篇):连接不是"画线",而是"生成一批相等方程"。- 整段没有任何"求解指令":给方程与参数,求解是平台的事——这正是 equation-oriented 与"按顺序调用模块"最大的体验差异。
代码 2-3:自由度核对表(本篇必须完成的一步)
【未知量清单】仅计 VARIABLE 段的 6 个: 1) F_out 2) C_A 3) T 4) r 5) tau 6) Q_cool → 共 6 个 【独立方程清单】仅计 6 条互不重复的约束: E1 总物料 E2 组分 E3 能量 E4 速率本构 E5 停留时间 E6 移热本构 → 共 6 条 【核对结论】 方程数(6) = 未知量数(6) ⇒ 自由度 = 0 ⇒ 稳态问题可解(前提:结构不奇异) 【已知量清单】PARAMETER 段(进料、几何、动力学、传热共 11 项): F_in, C_Ain, T_in, V, k0, Ea, R, dH, rho_cp, UA, T_c ——这 11 项必须在 PROCESSES 里被明确赋值(或使用模型默认值并被记录)。 【风险点】 若把 C_A 误放进 PARAMETER:未知量变 5 个、参数变 12 个 ⇒ 系统欠定; 若把 E5 与 E6 删掉:未知量仍 6 个、方程变 4 条 ⇒ 系统欠定,直接报错。逐行剖析:这张表就是铁律 8 的落地。请把它当成"每次建新模型的肌肉动作"——先数未知量、再数方程、写结论、列已知量、标风险点。第 10 篇会把"结构奇异"与"数值奇异"的区分补上。
三、常见报错与排查
报错 3-1:提示自由度不足 / 无法确定唯一解(欠定)。
现象:模型能载入,但求解器拒绝求解或给出"解不唯一"。根因:方程数 < 未知量数,常见于"漏写一条衡算"或"把待求量误放进参数段"。解法:回到代码 2-3 的表,逐条重数;重点检查辅助量(如本例tau、Q_cool)是否都有对应的定义式。
报错 3-2:提示超定 / 约束冲突。
现象:求解报约束过多。根因:方程数 > 未知量数,常见于"同一衡算写了两遍"“在流程里又额外加了一条相同约束”,或模型参数被两处赋值而不是一处。解法:检查是否有重复或线性相关的方程;确认参数赋值唯一。
报错 3-3:残差不降 / 结果荒谬(负浓度、温度冲出量程)。
现象:能进求解,但解不可信。根因:多为符号约定不一致或初值离真实解太远。解法:统一符号(本模型约定r为消耗速率、dH负值为放热);给变量合理初值(温度从T_in附近起步),并参考第 10 篇的初始化思路。
报错 3-4:单位不一致导致的解偏离。
现象:解的量级明显错误(如温度算出 30000)。根因:R = 8.314与Ea = 5.0e4必须单位配套(如 J/mol/K 配 J/mol);rho_cp、UA的单位也要与流量、温度单位自洽。解法:把每条方程的量纲手工推一遍,确保等式两侧同量纲(第 05 篇会系统讲单位一致性)。
报错 3-5:改了MODELS却没生效。
现象:修改模型后结果不变。根因:流程里的UNIT仍引用旧模型,或参数在PROCESSES里被显式赋值覆盖了模型的默认值。解法:检查UNIT ... AS ...指向的模型名,以及PROCESSES中的显式赋值优先级。
四、动手练习
- 练习 1(基线模型):抄录代码 2-1 与 2-2,建立
cstr_steady模型与cstr_main流程,用示例参数求解稳态。判定:求解成功并得到C_A、T的数值;把结果与代码 2-3 的核对表放在一起,作为工程的第一份"回归基线"(铁律 9)。 - 练习 2(自由度破坏实验):故意删掉
E5(停留时间定义式),重新求解。判定:能观察到欠定类报错;能用自己的话解释"删一条方程为什么会让未知量消不掉";随后恢复并复跑,结果与练习 1 一致。 - 练习 3(符号约定实验):把
E2中的- r*V改成+ r*V并求解。判定:能观察到解的物理荒谬(浓度或温度超出合理范围);理解符号约定错误的后果,改回并复跑。 - 练习 4(工况复用):在
PROCESSES里新增第二台设备,引用同一个cstr_steady模型,但把F_in从 1.0 改为 2.0 并重算。判定:两台设备共享模型、各自有参数;能说明"模型与工况分离"带来的复用收益。 - 练习 5(思考题,无标准答案):如果要把这台 CSTR 从稳态扩展为动态模型,你预计需要在方程组里增加什么(时间自变量、累积项、初值)?写出你的三条猜测,第 08 篇会给出答案。
五、小结与下一篇预告
本篇完成了从"物理"到"方程"的第一次完整跨越:四步翻译流程(划控制体 → 写守恒 → 补本构 → 定参数)、MODELS骨架(PARAMETER/VARIABLE两段声明 + 方程)、PROCESSES三步(UNIT实例化 → 赋参数 →TOPOLOGY连接)、以及建模第一纪律自由度核对(本文 6 方程对 6 未知量)。请把"先数方程、再数未知量"变成肌肉记忆(铁律 8),并坚持数值必须来自可引用来源(铁律 10)。
第 04 篇《语言的骨架》将把本篇用到的零散关键字系统化:MODELS/PROCESSES/TASKS三类顶层实体各自的分工、TASK的PARAMETER/VARIABLE/SCHEDULE三段结构、UNIT/TOPOLOGY/PORT与"连接即方程"的语义,以及方程导向建模与顺序模块式模拟器的本质差别。
本篇认知问题回显(FAQ)
Q1:从物理模型到方程组,中间要经过哪几步?
A:四步:①划控制体,选一个"盒子"并声明进出流股;②写守恒方程,质量、组分、能量各自的"进出之差 = 累积"(稳态时累积为零);③补本构方程,如反应速率式、相平衡、传热关系;④定参数,把已知量从方程里摘出来放进参数段,形成已知量清单。四步走完才打开软件。
Q2:MODELS 实体的最小骨架包含哪几部分?
A:两部分:声明区与方程区。声明区用 PARAMETER 段登记已知量、用 VARIABLE 段登记待求量(两段均已确证);方程区写入守恒与本构方程,其中守恒式是标准物理关系。声明与方程必须严格对应——声明了却不出现在方程里的量会成为自由变量,直接破坏可解性。方程段的关键字以官方文档为准。
Q3:怎么用 PROCESSES 把模型实例化并赋参数?
A:三步:①用 UNIT 声明,把一个模型实例化成一台具名设备(如 UNIT cstr_main AS cstr_steady);②给该实例的参数填具体数值(如 F_in、C_Ain、T_c),跨工况复用时建议显式列出以免隐式继承;③用 TOPOLOGY 连接上下游的 PORT。这样模型与工况分离,同一模型可被多台设备、多种工况复用。
Q4:稳态求解后怎么判断解是可信的?
A:三条判据:一是自由度核对通过,即方程数等于未知量数且结构不奇异;二是量纲自洽,逐条推一遍每条方程两侧同量纲,避免温度算出 30000 这类量级错误;三是物理合理性,检查浓度非负、温度在合理区间、符号约定一致。再用固定算例复跑对比作为回归基线。
Q5:什么是自由度?怎么快速检查方程数够不够?
A:自由度指方程数与未知量数之差,为零才可解唯一。检查法三步:①列出变量段里的每个待求量;②列出每条互不重复的独立约束;③逐一消元,每用一个方程消掉一个未知量,看能否恰好全部消掉。消不掉的即自由度缺口。本文示例 6 个未知量对 6 条方程,故可解。
本文涉及的语言细节以所购版本随附的官方 gPROMS 文档为准。