第 05 篇|Aspen Plus 进阶与工程案例:收敛诊断与调试
版本声明块
- 软件:aspenONE V15 版 Aspen Plus(Windows 64 位桌面版;截至 2026-10 公开渠道最新大版本为 V15)
- 单位体系:示例以 METCBAR 为基线并逐处显式标注单位
- 本文目标:把「流程不收敛就去点几次运行按钮」这个动作,升级为「看控制面板的 Err/Tol 与嵌套符号 → 定位到具体回路与变量 → 用方法矩阵与初值修复」
- 事实来源:AspenTech 官方客户支持门户(esupport.aspentech.com)KB 文章 000056985 / 000077076、官方培训课程页(Process Flowsheet Convergence in Aspen Plus、Modeling and Optimizing Chemical Processes Using Aspen Plus)、公开镜像的 Aspen Plus 用户指南与高校课件;凡未获证实的内容一律标注「未验证 / 以本机界面为准」,并给出可自省的核对方法
一句话结论:Aspen Plus 的收敛诊断只需盯住三件事——控制面板里每个收敛块的Max Err/Tol(判据是它降到1.0 以下)、撕裂流(tear stream)被收敛的相对残差上界(默认容差 tolerance = 1e-4,其迹分量阈值 Trace 默认为 1e-6)、以及Results Summary / Run Status下的逐块状态;再配上前置符号>/>>/>>>所标识的回路嵌套层级,就能把「没收敛」定位成「哪一层回路、哪个变量、该换哪种方法」——而收敛之后必须立刻校验质量平衡与能量平衡,因为收敛 ≠ 算对(铁律 4)。
〇、本篇要解决的认知问题
前面几篇把物性方法、参数回归、物性诊断讲通了,你现在有能力给流程搭出一个「物性上站得住脚」的模型。可一旦流程里出现循环回路、设计规定(Design Spec)或优化目标,运行按钮按下去之后,屏幕就不再给你一个干脆的「已完成」。控制面板里滚动的是一行行像天书一样的消息,末尾是一个永远不归零的迭代计数。本篇围绕五个问题展开:
- 控制面板里那行
> Loop $OLVER01 Method: WEGSTEIN Iteration 9 ... Max Err/Tol 0.18603E+1究竟在说什么?Err/Tol 到底是怎么定义的,降到多少才算收敛,为什么不是「迭代次数用完」就算失败? - 撕裂流(tear stream)为什么会产生?Aspen Plus 用什么算法选它、我为什么可以手动指定、又为什么不该随手乱指定?给撕裂流填初值填的到底是哪几个量?
- 收敛块(Convergence block)有几种、什么时候必须自己建一个?系统自动生成的
$OLVER01和用户建的C-1在结果、方法、嵌套顺序上有什么本质差别? - 收敛方法Wegstein / Direct / Broyden / Newton / Secant各自的适用边界是什么,
q上下界、Wait这些参数一动会发生什么,为什么会「越调越乱」? - 报错到底在哪里看?
Results Summary / Run Status与PER_ERROR是什么关系,从报错到原因的正确排查顺序是什么?(以及最后一个必须钉死的问题:收敛了就等于算对了吗?)
这五个问题对应三类真实故障:判据类(第 1 问,看不懂 Err/Tol 就没法判断到底进展如何)、结构类(第 2、3 问,回路与收敛方案本身选错了,怎么调参数都没用)、定位类(第 4、5 问,方法选错或报错看错地方,把时间浪费在错误的层)。它们的共同特征是:程序不崩、界面不红、流程能给出「结果」,但结论不可信。
一、机制解析
1.1 顺序模块法为什么必然产生撕裂流
Aspen Plus 的稳态求解默认走顺序模块法(Sequential Modular):它把流程切成若干单元操作块,按计算顺序依次求解,前一个块的出口物流直接当后一个块的入口。这个策略对开链流程好得惊人——一次从前向后扫过去就解完了。但只要流程图里出现回路(recycle),问题就来了:要算块 B,得先知道块 A 的出口;可 A 的入口又来自 B 的出口,鸡生蛋、蛋生鸡,顺序扫描没法自洽。
顺序模块法的标准解法是撕裂(tearing):在回路上「剪一刀」,假设某一股物流的组成、流量、压力、焓已经知道,把它当作一个临时进料(tear stream)代进去,顺序扫描直到剪口处的下游端,再把算出来的这股物流和当初假设的值比对;不一致就修正假设、重新扫,如此迭代直到剪口两端数值自洽——这就叫收敛。
进料 F │ v ┌────────┐ 出口物流 (未撕裂侧) │ 块 A │──────────────────────┐ └────────┘ │ ▲ v │ ✂ 撕裂点:假设此股物流的值 ┌────────┐ (撕裂流 tear stream) │ 块 B │<──────────────────────┘ └────────┘ │ v 产品 P 顺序扫描:F → A → B →(回到撕裂点比对)→ 不一致则修正假设 → 重扫术语必须精确:撕裂流(tear stream)是被「假设」的那股内部物流,不是回收流的名字;收敛块(Convergence block)是负责反复修正撕裂流假设、直到自洽的那个迭代器。系统会根据流程拓扑自动找出「极大环状子系统」(Maximal Cyclical Subsystem,MCS,即可以放在一起收敛的一组块),再对每个 MCS 用Motard–Westerberg 方法自动生成一组撕裂流。这就是官方培训(Process Flowsheet Convergence in Aspen Plus)里讲的「自动撕裂与排序」的底层逻辑。
1.2 撕裂流的收敛变量与判据:N+2 个量与 1e-4
一个撕裂流要收敛的不是「流量」这一个数,而是官方课件明确列出的一组量:
- 每一个组分的摩尔流率(N 个组分就是 N 个量);
- 压力(1 个量);
- 质量焓(1 个量)。
所以一个撕裂流的收敛变量总数是N + 2(N 为组分总数)。判据用的是相对残差:设某变量本轮计算值XcalX_{cal}Xcal、上一轮假设值XassumedX_{assumed}Xassumed,当所有 N+2 个变量都满足
∣Xcal−XassumedXassumed∣≤Tol \left|\frac{X_{cal}-X_{assumed}}{X_{assumed}}\right| \le \text{Tol}XassumedXcal−Xassumed≤Tol
时,撕裂流才算收敛。官方课件给出的默认Tol = 1e-4;另外还有一个迹分量阈值(Trace),用于把摩尔分数低于该值的组分排除在物料平衡收敛之外,其默认值 =Tol / 100 = 1e-6。
这里有一处极易混淆、必须讲清的区分:撕裂流的 Tol(1e-4)与每个单元块的内部收敛容差不是一回事。官方课件同时说明:块容差的默认值也是 1e-4,把它收紧到1e-6「往往能改善撕裂流收敛」;但块容差只能局部(在具体块的设定里)或全局针对闪蒸类简单模型(Setup / Simulation Options)修改,全局那一项不会改变 RadFrac 这类复杂块的容差。所以「把全局容差改小就能让塔更收敛」是错的——塔有塔自己的容差。
1.3 控制面板消息的正确读法
控制面板(Control Panel)里的每一行,都是一次收敛块执行的「体检记录」。官方课件给出两种标准格式,理解它们是全篇的核心技能:
> Loop $OLVER01 Method: WEGSTEIN Iteration 9 Converging tear streams: 3 4 5 vars not converged, Max Err/Tol 0.18603E+1 >> Loop C-2 Method: SECANT Iteration 2 Converging specs: H2RATE 1 vars not converged, Max Err/Tol 0.36525E+03这一行里有六个信息位,逐个拆开:
| 信息位 | 含义 | 读它做什么 |
|---|---|---|
>/>>/>>> | 回路嵌套层级:>是最外层回路,>>表示嵌在某个回路里一层,>>>表示嵌两层 | 判断「先收敛哪个、后收敛哪个」,嵌套错了会死循环 |
$OLVER01/C-2 | 收敛块名。$OLVER开头是系统自动生成的,其余是用户自己建的 | 决定「改方法」该去哪个块 |
Method: WEGSTEIN/SECANT | 该块用的收敛方法 | 方法选错是「越调越乱」的常见根因 |
Iteration 9 | 该块自身的迭代计数 | 看是「迭代用满仍不降」还是「在收敛但慢」 |
Converging tear streams: 3 4/Converging specs: H2RATE | 这个块在收敛哪几股撕裂流或哪条设计规定 | 精确定位到具体对象 |
Max Err/Tol 0.18603E+1 | 本轮迭代里,所有未收敛变量中最大的那个 Err/Tol 值 | 这是判断「还差多远」的唯一首要指标 |
关于最后一项,官方原话钉得很死:「Convergence is achieved when the value of Max Err/Tol becomes less than 1.0」——即Max Err/Tol < 1.0 就是收敛达成。上例里0.18603E+1就是1.86031.86031.8603,大于 1,说明还差得远(大约还差一半);而0.36525E+03 = 365.25说明那条设计规定偏离极大。请注意:Max Err/Tol 是「本轮最大相对残差 ÷ 容差」,它会随迭代上下跳动,不能看单点,要看趋势。官方课件推荐的判读方法是「Plots of error/tolerance vs. iteration-#」——把 Err/Tol 对迭代数画成图,单调下降说明思路对、只是需要更多迭代或更好初值;下不去甚至上翘说明结构或方法有问题,加迭代次数没用。
但「Max Err/Tol < 1.0」这个判据有一个前提,极易被忽略:Err/Tol 是「相对残差 ÷ 容差」,分母上的容差是可改的。如果把撕裂流的 Tol 从默认 1e-4 放宽到 1e-2,Max Err/Tol 会「人工」跌到 1.0 以下、界面显示收敛,可物料平衡的实际精度同步变差——这是**「改判据、不改解」的假收敛**,属于【铁律】级别的红线:收敛质量必须连同所用容差一起记录,只看是否小于 1.0 而不问容差取值,等于自欺。官方给出的方向恰好相反:把块容差从 1e-4收紧到 1e-6,反而能改善撕裂流收敛。因此判断一个块的收敛是否可信,至少要同时看三样东西——所用的 Tol 是多少、Max Err/Tol 的趋势是否单调下降、以及收敛后质量平衡的残差量级(与 1.9 节的结果校验清单配套使用)。
1.4 收敛方案的四个层级:自动到什么程度该收手
官方把「收敛指定」分成四级,逐级更灵活也更复杂。记住这张表,就记住了「什么时候该自己动手」:
| 层级 | 做什么 | 撕裂流 | 设计规定 | 方法 | 何时用 |
|---|---|---|---|---|---|
| Level 1 | 全自动撕裂与排序(默认) | 系统按 MCS + Motard–Westerberg 自动选 | 自动识别 | 撕裂用 Wegstein,设计规定用 Secant | 大多数常规流程的起点 |
| Level 2 | 指定首选撕裂流(并给初值) | 用户点名,系统补齐其余 | 同 Level 1 | 同 Level 1 | 自动撕裂选得不合理,或想给初值 |
| Level 3 | 自建收敛块,指定方法与对象 | 用户指定 | 用户指定 | 可换 Broyden / Newton 等 | 撕裂与设计规定强耦合、嵌套不合理 |
| Level 4 | 自定**(部分或完整)计算顺序** | 用户指定 | 用户指定 | 用户指定 | 极少用,处理特殊的嵌套顺序 |
Level 1 有一个关键的默认行为必须记住:设计规定(Design Spec)的收敛回路被嵌套在撕裂流回路的内层(官方表述: design-spec convergence loops are nested inside the tear stream convergence loop)。这个默认在多数情况没问题,但当设计规定的操纵变量「主要靠外层回路决定」时,内层在外层里反复调整就是白费功夫——官方课件给了一个真实例子:两塔之间的中间回流(inter-reflux)流量被用来满足塔底产品的纯度规定,而该纯度主要由两塔之间的中间回流决定,不是由单塔塔顶采出决定;默认把设计规定嵌在塔回路内层时,规定块和撕裂块双双不收敛。解法是改设计规定嵌套位置(Convergence / Conv Options / Defaults / Sequencing设为 Outside),或用Conv Order把规定块提到外层。这就是「结构错了,调参数没用」的典型。
这条结构性错误的现场特征值得单独记住:它的表现是「两个块互相拖累、都收敛不了」——以>>开头的内层规定块,其 Max Err/Tol 降不下去,外层撕裂块也随之不降;而你换初值、调q、加迭代次数全都无效。这与「方法选错」的现场特征是可区分的:方法选错通常只表现为「某一个块慢、换上对的方法就好」。由此得到一条排查判据——如果一个高优先级的数值修复(换方法、加迭代)做过之后问题纹丝不动,就该把怀疑从「数值」转向「嵌套结构」,遵循先动结构、再动数值的顺序。这与官方收敛策略里「先查结构、后调数值」的思路是同一个道理。
1.5 收敛方法矩阵:五种方法各自的适用边界
官方课件把方法的适用性列得很清楚,下面整理成对照表(撕裂流侧与设计规定侧分开看):
| 方法 | 类型 | 适用于 | 关键特性 |
|---|---|---|---|
| Direct(逐次代入) | 撕裂流 | 撕裂流 | 最朴素:直接把算出来的值当作下一轮假设;收敛慢但极稳 |
| Wegstein | 撕裂流(默认) | 撕裂流 | 用割线加速外推;可用参数:加速因子q的上下界、首次加速前的直代次数Wait、两次加速间的直代步数、连续加速步数 |
| Secant | 设计规定(默认) | 单条设计规定 | 割线法(线性近似)+ 高阶增强;函数不连续/平坦/非单调时可自动切换到区间收缩或区间对分 |
| Broyden | 撕裂流 + 设计规定 | 一个或多个撕裂、多条设计规定、撕裂与规定同时收敛 | 拟牛顿法,用近似的雅可比矩阵;当撕裂与规定强耦合、嵌套不现实时首选 |
| Newton | 撕裂流 + 设计规定 | 同上 | 改进牛顿法(联立非线性方程组),支持变量边界与线搜索;当 Broyden 不奏效时用 |
对应的「适用性」官方速查:撕裂流用Wegstein(默认)/ Direct / Broyden / Newton;设计规定用Secant(默认)/ Broyden / Newton;撕裂流与设计规定一起收敛只用Broyden / Newton。
Wegstein 的参数值得单列一条经验法则:q是加速外推因子,官方给出的控制参数包括上下界与直代步数;q越靠近 1 外推越弱(退化为直代,稳但慢),越靠近 0 外推越强(快但可能震荡)。所以在「收敛慢但残差稳降」时,适度收紧q上下界让它更稳,往往比盲目加迭代有效;而「残差来回振」时,必须先把结构问题的嫌疑排除,再谈参数。这些参数都挂在Convergence / Conv Options / Methods页。
还有一条经验法则必须补上:方法的更换只在「同一套撕裂流集合与同一套嵌套结构」内部有效。如果换了方法仍然不收敛,说明问题多半不在方法,而在撕裂流的选法或初值——应先把「每个回路恰好一股撕裂流」与「选相对稳定的物流」两条落实,再谈方法。反过来,若某个撕裂流本身的相对残差就在容差附近反复徘徊,换个方法往往立竿见影。把这条顺序记住,就能避免「病急乱投医、把方法来回换几十遍」的时间浪费。
1.6 收敛块该自己建还是放任自动
Level 1 会自动生成$OLVER01、$OLVER02……它们本质上是系统替你建的收敛块:$OLVER01收敛撕裂流、$OLVER02收敛设计规定,名字里带$就是「系统生成」的标记。你自己在Convergence / Convergence下建的块(如C-1、C-2)才是 Level 3。两者的结果页完全一致——Summary(每个被收敛变量的最终状态、数值与 Err/Tol)、Tear History(每轮最大 Err/Tol 与误差最大变量的历史表,可画图)、Spec History(设计规定的操纵变量值与规定误差历史)。看系统块的结果:在Convergence / Object Manager里选中它、点Edit;看用户块的结果:在Data Browser左侧选Results。
什么时候该自己建块?官方课件的判据可以归纳为三条最佳实践:其一,想换数值方法(例如撕裂用 Broyden 换掉 Wegstein);其二,想让撕裂与设计规定同时收敛(一个块挂两个页签);其三,想手动控制嵌套顺序(Conv Order,先建者嵌套更深)。反之,能自动就别手动——官方明确说 Level 1 的自动排序「Often … satisfactory」。
还有一条容易踩的坑:撕裂流集合偏多或偏少都不好。官方原文说,如果你只指定了残缺的撕裂集合,Aspen Plus 会自动补全;如果你指定了冗余的集合(撕裂流给多了),它可能忽略其中一些,或找出一个低效的顺序。判别准则是一句极简口诀:「尽量让每一个可能的计算回路里恰好含一股撕裂流。」
1.7 报错在哪里看:Run Status 与 PER_ERROR
很多人找报错找错了地方。官方 KB 000056985 的原文把结构讲得很清楚:Aspen Plus 的错误消息存在一个叫PER_ERROR的文件夹里,挂在它所指向的对象下方。两条主要路径:
- 整体仿真的消息:存在
Results Summary / Run Status下的PER_ERROR集合里。 - 收敛块自己的消息:存在该收敛块自己的
Output段下,路径形如Tree.Data.Convergence.Convergence.Elements("C-1").Output.PER_ERROR.Elements。
配套的 KB 000077076 则给出Run-Status的文本形态,它按「对象类别」把消息分组播报,例如:
The following Unit Operation blocks were completed with warnings: B4 B2 The following Unit Operation blocks were completed with errors: B6 The following Convergence blocks were completed with warnings: C-1 C-2 The following messages were issued during Input Translation: ...这四类信息的工程含义完全不同,绝不能混为一谈:单元告警=该块结果可用但要标注;单元错误=该块结果不可用;收敛块告警=循环类单元(如 RadFrac)的收敛质量存疑;输入翻译消息=你的输入被输入校验挡下了(往往伴随弹窗)。只读一句「整体状态」是拿不到这些区分的。
另外,控制面板的诊断消息级别(Diagnostic Message Level)是 0~8 级,默认Level 4。级别越高,写出的信息越多:Level 0 只列收敛块的终端错误,Level 3 起加上收敛块告警,Level 4 起加上简要诊断信息,Level 5 起列出每轮未收敛变量,Level 6 起列出每轮每一个变量,Level 7~8 是各算法专用的深挖诊断。排查疑难收敛时把级别临时提到 5 或 6,是标准动作;改回去也别忘——级别越高,控制面板与历史文件越啰嗦,大规模流程会明显变慢。诊断级别可全局设(Setup / Specifications / Diagnostics),也可局部设在具体块上;其中Simulation 管单元块的级别,Convergence 管收敛块的级别。
1.8 撕裂流初值策略
给撕裂流填初值,填的就是 1.2 节那 N+2 个量:进料的组成、总流量、温度/焓、压力。官方原文的指导是「Enter initial compositions and flow rates for the tear streams on Stream / Input / Specification sheets」——即在把撕裂流当作一股真正的进料去填写它的 Specification。合理解法有两条:
- 靠过程知识:据物料衡算先估一个循环量级(例如按单程转化率倒推循环流量),比初值全填零靠谱得多。
- 靠简化模型热启动:先用简单模型(如把 RadFrac 先换成 DSTWU)让流程转起来,把转出来的解回填给撕裂流,再切回严格模型。官方课件的收敛策略里明确写了这条:「Start with simple unit operation models. For example, converge the flowsheet with a DSTWU before switching to RadFrac.」
一条经验法则:优先选那股「相对稳定、变化不大」的物流当撕裂流(官方原文: select a tear stream that remains relatively constant)。原因是残差判据是相对值,撕裂一股本就平稳的物流,初值误差小、迭代残差也小;撕裂一股成分波动剧烈的物流,往往要更多迭代。
1.9 收敛 ≠ 算对(铁律落点)
到这一步必须把系列级铁律 4 钉死:收敛 ≠ 算对。Aspen Plus 的收敛判据只保证「撕裂点两端自洽、块内方程残差低于容差」,它不保证你输入的自由度、物性方法与装置设定在工程上正确。一个物性方法选错、单位混用、或者给塔规定了两条互相冲突的操作规格的模型,完全可以「收敛」到一个物理上荒谬的解。因此本篇的收尾动作不是「看到Converged就导出数据」,而是一套结果校验清单:
| 校验项 | 方法 | 通过标准 |
|---|---|---|
| 质量平衡闭合 | 进料总质量/总摩尔流率 vs 所有产品之和 | 残差在数值精度内(相对误差远小于 Tol) |
| 能量平衡闭合 | 各单元 Heat Duty 代数和 + 进出料焓差 | 残差与容差同量级或更小 |
| 组分平衡闭合 | 逐组分(尤其关键组分)进料 vs 产品之和 | 关键组分不凭空出现/消失 |
| 工程常识 | 温度/压力/组成/流量是否落在物理区间 | 无负流量、无超临界意外、无「一级塔分馏原油」式谬误 |
二、完整操作与逐项剖析
2.1 首次诊断:把控制面板与结果页看穿
界面操作步骤:
- 运行流程后,点击工具栏的
Run Control Panel按钮(或菜单Run / Control Panel),打开控制面板窗口。 - 从头向尾滚动,找出最后一条
Loop开头的消息——那是阻塞收敛的那个收敛块。记下它的:嵌套符号、块名、方法、在收敛谁、以及Max Err/Tol。 - 若流程卡住,用
Run / Load Results载入暂停时的结果;再进Data / Convergence / Convergence打开Convergence / Object Manager。 - 选中出问题的收敛块:系统块(
$OLVERxx)点Edit直接看结果页;用户块则在Data Browser左侧选Results。 - 分别打开
Summary、Tear History、Spec History三张结果页。
关键设定表(结果页读什么):
| 结果页 | 内容 | 用途 |
|---|---|---|
Summary | 每个被收敛变量的最终收敛状态、数值、Err/Tol | 一眼看出「卡在哪一个变量」 |
Tear History | 每轮的最大 Err/Tol 与误差最大变量;可画 Err/Tol–迭代数曲线 | 判断趋势:单调下降还是上翘 |
Spec History | 操纵变量值 + 设计规定误差随迭代的历史 | 诊断设计规定的收敛行为 |
期望输出:Tear History画出来的Err/Tol 对迭代数曲线单调下降并穿过 1.0;Summary里每个变量的 Err/Tol 都< 1.0;控制面板末行不再刷出新的Loop消息,且状态栏给出「Results Available」。若Tear History曲线上翘或锯齿,直接跳到第三节按「根因」排查。
2.2 三种修复动作的界面路径
动作 A:换收敛方法(Level 3)。走Data / Convergence / Convergence,新建收敛块C-1,在Type处选方法(如Broyden);再到Tear Streams页签填要收敛的撕裂流 ID;若还想同时收敛设计规定,在Design Specs页签填 Design Spec 的 ID。想比较不同方法,就多建几个块分别试——这正是官方课件的 Workshop 内容。
动作 B:改首选撕裂流并给初值(Level 2)。在Convergence / Tear页指定希望被收敛的撕裂流;然后到那股物流的Stream / Input / Specification页,像填进料一样填组成、流量、温度、压力(即 N+2 个量)。注意别把它填成真正的进料——它只是初值。
动作 C:改嵌套顺序(Sequencing / Conv Order)。在Convergence / Conv Options / Defaults / Sequencing里把Design spec nesting设为Outside(让设计规定嵌到撕裂回路外层),或在Convergence / Conv Order / Specifications页手动排出顺序(先列者嵌套更深)。官方提示:用户嵌套设置优先于设计规定嵌套设置;而系统可能为了稳定性「不严格照排」。
2.3 诊断消息级别的临时调高
操作:Setup / Specifications / Diagnostics,把Convergence的消息级别从默认4调到5 或 6。级别 5 会列出每轮未收敛变量,级别 6 会列出每轮每一个变量的数值——排查「某个组分流量一直不降」这类问题时,这是决定性证据。期望输出:控制面板出现逐轮、逐变量的明细行,能直接看到一个或多个变量的相对残差始终不达标。排查完务必改回 4,否则大规模流程的运行时间和日志体积会显著上升。
三、常见报错与排查
下面五条覆盖「不收敛」的高频现场,每条按「现象 → 根因 → 解法」给。
1. 残差下不去、Max Err/Tol在某一水平线上下振荡,加迭代次数无效。
- 现象:
Tear History曲线是锯齿而非单调下降;把最大迭代数加大到几百次仍在同一量级跳动。 - 根因:这是结构性问题,不是「迭代不够」。常见三种:撕裂流选得不合理(回路里含了多于一或零股撕裂流);设计规定嵌错了层(规定在内、其操纵变量却由外层回路决定);或流程本身有一条互相耦合的约束没有被同一策略收敛。
- 解法:先查撕裂流的「每回路恰好一股」口诀;再用
Sequencing把强耦合的规定与撕裂放到同一层或同时收敛(Level 3 建一个块同时挂Tear Streams与Design Specs两页,方法选Broyden);只有确认结构无误后才考虑收紧q让它更稳。
2. 报错信息里出现「单元错误」或「收敛块告警」,但整体状态仍显示可出结果。
- 现象:
Run Status播报...completed with errors: B6或...Convergence blocks were completed with warnings: C-1,界面却不红。 - 根因:
Run Status是按对象分类播报的,单元错误只说明那一个块的结果不可用,不等于整流程作废;收敛块告警说明循环类单元的收敛质量存疑。整体状态是粗粒度信号,掩盖了细粒度问题。 - 解法:以
Run Status的逐块文本为准。B6报错就去看B6的Output / PER_ERROR;C-1告警就去看C-1的收敛结果页与Output / PER_ERROR。凡是单元错误,该块结果一律不得进入结论。这条直接连着铁律 4:把「状态可出结果」当「结果可信」是典型的第二类错误。
3. 报错在控制面板一闪而过,找不到源头。
- 现象:日志里出现
*** SEVERE ERROR之类的字样(例如FORTRAN DIVIDE BY ZERO ENCOUNTERED.),但没给到具体的块。 - 根因:控制面板是流式输出,早期消息被后期刷走;且默认诊断级别 4 只给简要信息,深挖细节没写出来。
- 解法:打开
Run Status与PER_ERROR集合(整体仿真在Results Summary / Run Status下),它按类别把消息归拢好了;再把Setup / Specifications / Diagnostics的级别临时抬到 6,重跑一次拿到逐轮明细。SEVERE ERROR属于高严重级,通常会中断相关块的计算,必须在解决后才继续。
4.Max Err/Tol单调下降但极慢,几十轮才降一个量级。
- 现象:趋势对、方向对,就是慢;加大迭代次数最终能收敛,但代价高。
- 根因:多为方法选择不当(强非理想体系用 Wegstein 直代加速不足)、初值离解太远、或块容差没设好。
- 解法:按最佳实践逐条排查——先给撕裂流一个靠物料衡算估的初值(经验法则: 选相对稳定的物流当撕裂流);把撕裂方法从
Wegstein换成Broyden;官方课件还给出了「块容差默认 1e-4,收紧到 1e-6 常能改善撕裂流收敛」这一招(注意它不改变 RadFrac 这类复杂块的容差);最后才是适度加大迭代上限。
5. 同一个模型,换台电脑或换台泵的规格后再跑,突然不收敛了。
- 现象:完全相同的流程文件,参数微调后收敛行为判若两样。
- 根因:不是数值方法问题,而是输入本身变得不可行或物性越界。官方收敛策略明确要求先做两件事:「确认各单元块行为符合预期」与「确认物性在整个操作区间内都算得对」。参数微调可能把某个块推到了物性无效区或超临界区。
- 解法:先做可行性检查(温度/压力/组成是否落在物理区间),再查物性(关键体系的二元参数、是否外推出数据区间——连铁律 5与铁律 10);参考官方收敛策略的四连:从简单模型起(DSTWU → RadFrac)、给合理解初值、检查物性、检查输入拼写与单位。单位错配是「不报错但必错」的隐形杀手(铁律 2),每处数值都应显式标单位。
四、动手练习
练习 1:为一个含单回路 + 一条设计规定的流程,产出一张「三层判据对照表」。
做法:搭一个「反应器 → 闪蒸 → 一部分液相回流」的简单回路流程,再叠加一条设计规定(例如用回流比操纵塔顶纯度)。运行后采集三层信息:控制面板最后一条Loop消息(含嵌套符号与 Max Err/Tol)、该收敛块的Summary页(每个变量的 Err/Tol)、以及Results Summary / Run Status的逐块文本。
判定标准:产出一张表,含「收敛块、方法、嵌套层、Max Err/Tol、Summary 里各变量 Err/Tol、Run Status 逐块状态」六列;当流程收敛时,表内所有Err/Tol 必须< 1.0,且Run Status不得出现任何completed with errors。若出现「Max Err/Tol < 1.0 但 Run Status 有单元错误」,必须写下该块的 ID 并去它的Output / PER_ERROR里找原因——这正是练习的核心:收敛判据与报错判据是两套独立信号,必须同时看。
练习 2:用 Sequencing 修复一个「设计规定嵌错层」的失败案例。
做法:构造 1.4 节提到的双塔场景(塔间中间回流操纵某产品纯度),先保持默认嵌套(规定在内层),确认它不收敛;再把Convergence / Conv Options / Defaults / Sequencing的Design spec nesting设为Outside,或用Conv Order把规定块排到外层,重跑。
判定标准:产出一张对照表,含「嵌套位置、规定块最大迭代数、撕裂块最大迭代数、是否收敛、最终 Max Err/Tol」;Outside那一栏必须收敛且 Max Err/Tol < 1.0,而默认栏必须不收敛。若两栏结果相同,说明构造的耦合不够强,需让操纵变量更依赖外层回路后重做。另需补记一项:修复前后控制面板消息的嵌套符号变化(默认应为>>处于内层,修复后规定块应升到与撕裂块同级或其外层)。若符号没变而结果却变了,说明所谓「修复」其实是数值偶然,必须重做实验以确保结论稳定,否则这张对照表不能作为工程证据。
练习 3:按铁律 4 完成一次收敛后的平衡校验。
做法:对练习 1 的收敛结果,手工核对:进料总摩尔流率与所有产品之和的差(质量平衡);各单元 Heat Duty 代数和与进出料焓差的差(能量平衡);关键组分的进出料差(组分平衡)。
判定标准:产出一张三行的平衡校验表,每行给出「残差绝对值、残差相对值、是否在数值精度内」。任何一行相对残差显著大于撕裂流 Tol(1e-4),就必须判定该模型「收敛但不可用」,并指出最可能的输入错误(物性、单位或自由度)。若三行都通过,写出结论:「该模型的收敛是可信收敛」。
五、小结与下一篇预告
这一篇把「没收敛」从一句抱怨拆成了可定位的诊断。核心结论有四条:
第一,收敛的第一判据是 Max Err/Tol < 1.0,它是「本轮最大相对残差 ÷ 容差」,必须看趋势而不是单点;撕裂流的收敛变量是N+2 个(每个组分摩尔流率 + 压力 + 质量焓),默认容差1e-4,迹阈值1e-6。
第二,控制面板那六个信息位(嵌套符号、块名、方法、迭代数、收敛对象、Max Err/Tol)合起来才能定位问题;>/>>/>>>告诉你回路嵌套在哪一层,嵌套错了是最难靠调参数补救的结构性错误。
第三,收敛方案分四级,能自动(Level 1)就别手动;一旦手动,就要遵循「每个回路恰好一股撕裂流」的口诀,并在强耦合时用 Broyden/Newton 把撕裂与规定同时收敛。
第四,报错要看对地方:整体消息在Results Summary / Run Status下的PER_ERROR,收敛块消息在该块自己的Output / PER_ERROR;Run Status的逐块文本能区分「单元告警/单元错误/收敛块告警/输入翻译消息」,比一个整体状态码信息量大得多。
留下的问题是这块「被收敛的东西」本身:本篇所有诊断都围绕「撕裂流与设计规定」,而真实工程里最常不收敛、也最值得较真的,是那台精馏塔——它的每一级有自己的一组自由度,冷凝器与再沸器各占一个,剩下的「两个操作规定」到底怎么选、为什么某些组合根本不可解、收敛算法又该怎么配,这些不解决,塔的收敛问题会在本篇的方法层面反复出现却抓不到根。
下一篇:《第 06 篇|Aspen Plus 进阶与工程案例:精馏塔严格建模与 RadFrac 配置》——平衡级自由度计数、冷凝器/再沸器组合矩阵、两个操作规定的选择与禁配、压力剖面与进料 convention、side draw / pumparound / 三相等附加自由度,以及 Standard / Strongly Non-ideal Liquid / Petroleum-Wide-Boiling / Azeotropic / Cryogenic / Custom 六种收敛方案的适用边界。
本篇认知问题回显(FAQ)
Q1:Aspen Plus 控制面板里的 Err/Tol 是什么意思,降到多少才算收敛?
A:Err/Tol 是收敛变量「本轮相对残差 ÷ 指定容差」,控制面板显示的是本轮所有未收敛变量中最大的那个 Max Err/Tol;官方判据是它降到 1.0 以下即收敛,应画 Err/Tol–迭代数曲线看趋势而非单点。
Q2:Aspen Plus 的撕裂流为什么会产生,收敛时要同时满足哪些变量?
A:顺序模块法遇到循环回路时无法一次扫完,必须在回路上剪一刀假设某股物流值,该股即撕裂流;它要同时满足 N+2 个变量(每个组分摩尔流率、压力、质量焓)的相对残差 ≤ 默认容差 1e-4。
Q3:Aspen Plus 的收敛块什么时候该自己建,自动生成的 $OLVER 和用户建的 C-1 有何区别?
A:$OLVER 开头是系统自动生成的收敛块(撕裂用 Wegstein、设计规定用 Secant),用户建的 C-1 属 Level 3;当需要换数值方法、让撕裂与设计规定同时收敛、或手动控制嵌套顺序时才自建,否则能自动就别手动。
Q4:Aspen Plus 的 Wegstein、Broyden、Newton、Secant 各自该用在哪里?
A:撕裂流用 Wegstein(默认)/ Direct / Broyden / Newton,单条设计规定用 Secant(默认),多条规定或撕裂与规定一起收敛只用 Broyden / Newton;Wegstein 可用 q 上下界与 Wait 等参数调节加速强度。
Q5:Aspen Plus 报错信息存在哪里,从报错到原因该怎么排查?
A:整体消息存在 Results Summary / Run Status 下的 PER_ERROR 集合,收敛块消息存在该块自己的 Output / PER_ERROR 下;排查顺序是先看 Run Status 逐块文本区分告警与错误,再看撕裂流选择与嵌套结构,然后查物性与输入可行性和单位,最后才加减迭代或调方法——且收敛不等于算对,必须补做质量与能量平衡校验。