J7-08 一维系统模型的数值内核与「跑飞」排查:DAE/代数环、步长与容差、一致初值与守恒自检
| 项 | 内容 |
|---|---|
| 课程代码 | J7-08 |
| 所属板块 | J 仿真分析 CAE / J7 数字化仿真方法 |
| 难度 | L3 专家 |
| 建议学时 | 4.0 小时(6 讲 + 1 次「跑飞模型」排查实操) |
| 适合对象 | 做 1D 系统建模的 CAE 工程师(J1 模块七门的共同机制层);跨板块借用刚性与一致初值两项的燃料电池/电池系统仿真工程师;需要判读「这份 1D 结果是物理还是数值伪迹」的系统工程师与仿真报告评审人 |
| 前置课程 | J1-01 1D 热管理仿真导论(KULI/AMESim/GT/Flowmaster)《1D 热管理仿真导论(KULI/AMESim/GT/Flowmaster)》;J1-03 冷却液回路水力与热仿真建模《冷却液回路水力与热仿真建模》;体系外前置(需自备):常微分方程数值解的概念层认识(显式/隐式、局部截断误差、稳定性)、线性代数的概念层认识(矩阵奇异性、条件数、牛顿迭代)、至少一次独立搭通并跑过一个 1D 热管理回路模型的操作经验 |
| 本讲义定位 | 只讲求解层的机制与判据——方程解不解得出来、解出来的是不是数值伪迹。⛔ 不讲建模对象怎么建(归 J1 各门)、⛔ 不讲软件菜单路径、⛔ 不讲模型准不准(那是 validation,归 J7-01 仿真—试验相关性验证(Correlation))。 |
按任务导航
| 你手上的事 | 直接看 | 还要配 |
|---|---|---|
| 工具报「非线性方程组无法求解/初始化失败」,我按「代数环」怎么查都查不到 | 第 1 讲 1.3:非因果工具的检索词是 tearing / index reduction / nonlinear solver failure | 1.2(指标奇异的三种拓扑)· 1.4 |
| 模型明明是不可压液体,工具却非要我填一个体积参数 | 第 1 讲 1.2:那是正则化容积,把代数约束换成快速微分方程 | 图2 · 第 5 讲 5.5 第 ③ 层 |
| 仿真慢到不能用,想知道该换积分器还是该改模型 | 第 2 讲 2.1、2.2:先按时间常数比估刚性比,再读求解器统计 | 图4 · 6.2 |
| 有人问我 rtol 和 atol 该填多少 | 第 2 讲 2.3、2.4:atol 必须分量给;2.5 的收紧一档复算是唯一可交付的判据 | 图5 · 图6 · 引言那张典型值表 |
| 模型在 t=0 就报初始化失败 | 第 3 讲 3.1、3.2:只给了微分变量初值不算给了初值 | 图7 · 3.5(初猜给物理量级) |
| 稳态求解器怎么都不收敛,是不是模型建错了 | 第 3 讲 3.3:先判模型有没有定常解,无定常解时该换起步路线而不是加迭代上限 | 3.4(三条起步路线) |
| 切换时刻步长塌到最小、仿真跑不动 | 第 4 讲 4.1~4.3:事件函数、事件重启、步长回缩的代价 | 图8 · 第 5 讲 5.5 |
| 切换处一直抖,我不知道该改控制器还是改模型 | 第 4 讲 4.5:把控制器换成开环固定指令重跑,还抖就是数值层的 | 图9 · K3-01 整车热管理控制策略总览与模式管理 |
| 闭环充注量在跑,模型里没有任何泄漏路径 | 第 5 讲 5.2:这是质量守恒残差自检要抓的典型形态 | 图10 · 5.3 |
| 有人说「网格已经加密过了」,我不知道怎么核 | 第 5 讲 5.4:交付的是一条「关心量—份数」曲线,不是一句「已加密」 | 图11 · J2-01 CFD 基础、湍流模型与网格划分(Fluent/STAR-CCM+) · A1-01 一维/多维、稳态与瞬态导热的工程建模 |
| 结果算出来了但和试验对不上,该进哪份清单 | 第 5 讲 5.1:先判属 verification 还是 validation,再进对应清单 | 图12 · J7-01 仿真—试验相关性验证(Correlation) |
| 别人交给我一个跑飞的模型,我从哪儿下手 | 第 6 讲 6.1:先做最小化复现,再按六层清单逐层过 | 图12 · 「动手做」 |
| 要把求解设置写进仿真计划/交付清单 | 第 6 讲 6.4:本课交付「凭什么这么取」,登记粒度归 J7-07 仿真任务的输入、交付与模型资产管理 | 2.5 · 3.4 |
⛔ 本课不覆盖——两栏,每样带去向。
栏一 · 不讲哪些题目:validation 本体(相关性验证计划、误差带与 RMSE/NRMSE、标定与验证之分、可信域与报告 sign-off)→ J7-01 仿真—试验相关性验证(Correlation);无关性验证的通用方法论(加密序列、Richardson 外推与网格收敛指数、假收敛识别)→ A1-01 一维/多维、稳态与瞬态导热的工程建模 与 J2-01 CFD 基础、湍流模型与网格划分(Fluent/STAR-CCM+),本课只讲 1D 对象化的三件;两相与制冷剂物性域的专属处置(跨饱和线插值、两相传热与压降关联式、两相段胞数的域内取法、充注量守恒的建模落地)→ J1-02 制冷循环一维建模与制冷剂物性;水力域专属项(并联支路压降相等约束漏设、泵曲线外推、阀全关支路的域内处置)→ J1-03 冷却液回路水力与热仿真建模;换向与迁移域专属项(拓扑重构时刻一致初值的域内落地、模式切换的具体触发条件)→ J1-05 热泵系统一维建模与模式切换仿真;代数环的打断办法(插单位延迟、改接口因果性、把一侧改成非直通)与联合仿真机制本体(接口规范、主从求解器、宏步调度、耦合迭代次数与松弛因子的取值判据)→ J1-04 整车热管理系统级联合仿真,本课只给机理、识别与打断的代价;建模范式与工具选型(因果与非因果之分、四工具对比、边界条件从哪来)→ J1-01 1D 热管理仿真导论(KULI/AMESim/GT/Flowmaster);三维有限体积侧的数值(离散格式、数值扩散、湍流模型与壁面处理、残差与假收敛)→ J2-01 CFD 基础、湍流模型与网格划分(Fluent/STAR-CCM+),结构侧的模型内部可信度(单元、约束、本构、应力奇异)→ J5-06 结构 FEA 建模方法基础:单元、约束、本构与结果可信度;输入散差的量化与传播、全局敏感度、分位数裕度 → J7-06 仿真不确定度量化(UQ)与稳健/可靠性设计:从确定性单点到带分布的裕度;求解设置的入库粒度、模型快照与最小可复现集、报告评审出口 → J7-07 仿真任务的输入、交付与模型资产管理;模型降阶与实时化 → J7-02 模型降阶(ROM)与控制导向建模;热浸的物理侧初始条件(初温怎么给)→ B1-01 整车热平衡与全工况热负荷谱分析;控制策略层的执行器抖动与控制侧迟滞设计 → K3-01 整车热管理控制策略总览与模式管理;三维共轭传热里化学源项与传热的时间尺度分离所称的「刚性」→ D5-07 热失控与热扩散传播仿真建模:化学源项、喷发边界与可信边界(那门课已写死与本课的划界,两门结论不可互相搬用);燃料电池 −30 ℃ 冷启动策略本体 → O1-04 低温冷启动(-30℃)与自加热策略,本课只被它借走刚性与一致初值两项;数值方法本体(数值解法的推导、稳定域分析、微分代数方程的理论证明)不进本课程体系,列为体系外前置。
栏二 · ⛔ 真正不给的数:① rtol/atol 的可取用值——它随状态量量纲、模型规模与你要报的结果量而变,⛔ 给一个「行业通用值」等于给一个会被照抄的错误锚点 ⇒ 本课给的是取法与自检动作(2.5),值由你在本项目上定;② 迟滞带宽与最小驻留时间——它必须盖住本模型在事件附近的数值噪声,而噪声幅度是模型特征 ⇒ 本课给的是双向判据(4.4);③ 管段份数、换热器胞数、两相段胞数的推荐值——它随管长、流速、你关心的时间尺度而变 ⇒ 本课给的是无关性曲线的做法(5.4);④ 守恒残差的合格线——判据是相对你自己关心量的判读分辨力,不是一个绝对数(5.2);⑤ 标准条款的内容与限值——本课引用的验证与确认类标准、模型接口规范、以及所用求解器自身的理论手册,一律只写去向、不复述条款文字,版次与年份以现行目录为准,⛔ 本讲义不把任何一个年份写死当作依据。
引言
三个人看着同一条曲线,说出三种诊断
一个纯电平台的「电池—电驱双回路 + 多通阀切换」1D 模型。稳态点跑得非常干净,一加模式切换瞬态,仿真时钟在切换时刻附近几乎停住:一小时墙钟只推进了几秒物理时间,最后报求解失败。
三个人给了三种诊断。
第一个人说,容差取紧了,放松一档就好。第二个人说,是稳态初始化没收敛就切了瞬态,把稳态求解器的迭代上限加大重跑。第三个人说,是控制器在切换点附近抖,得给控制器加迟滞。
三个人都有经验,三个人说的都是真实存在的成因,而这一次三个人全都不对——真因是切换瞬间某支路阀全关、该节点没有任何蓄能元件、退化成了一个孤立节点,方程的指标从 1 跳到了 ≥2,工具的求解器再也推不动了。
这个故事的要害不是「他们经验不够」,而是:「步长塌到最小」这一个现象下面,至少压着四种互不相干的根因——指标奇异、事件抖振、容差取小、物性表外插——而它们在曲线上、在墙钟时间上、在工具的进度条上,长得一模一样。靠现象猜根因,猜中的概率就是四分之一,猜不中的代价是一整轮返工。
本课就是为了让你不再猜。它给的不是「遇到 X 就调 Y」的经验条,而是一套能把同形现象分开的判据,以及一份按代价从低到高排序的排查顺序。
一句话说清本课在整条链上的位置
一个仿真结果要能被人用,得连着过两道关:
第一道,方程解得对不对——离散方案、积分器、容差、初值、事件处理,有没有让「算出来的东西」偏离「你写下的那组方程本来的解」。这一关叫 verification,就是本课。
第二道,方程写得对不对——这组方程、这套参数、这套边界,是不是那台真实设备的合格代表。这一关叫 validation,归 J7-01 仿真—试验相关性验证(Correlation)。
⚠ 两道关的次序不能倒:第一关没过的模型拿去做第二关,你测到的只是数值噪声。这也是为什么 J7-06 仿真不确定度量化(UQ)与稳健/可靠性设计:从确定性单点到带分布的裕度 那门课在开篇就写死了它的前提是「模型已能稳定求解」——拿一个会跑飞的模型去做不确定度量化,得到的分布是求解器的分布,不是物理的分布。
★ 一条本课自己作出的划界(不是任何标准的原话):异常结果先判属哪一半,再进对应的清单。算不出来/振荡/不守恒 ⇒ 进本课的六层清单;算得出来但与试验差 ⇒ 进 J7-01 仿真—试验相关性验证(Correlation) 的诊断清单。这两份清单入口不同、顺序不同,走错一份会一路查到越来越远的地方去。
⚠ 措辞纪律:验证与确认领域的通行标准(本课涉及的那一份)正文重心在 validation 与不确定度量化,求解验证主要作为前置条件出现。因此本课的六层清单是工程可操作化产物,⛔ 不声称是该标准的对等半边,也 ⛔ 不复述其条款文字。
学完这门课,你要能当场答出六件事
第一件,判一个 1D 回路模型的方程属微分代数方程组还是纯常微分方程组,并说得出判据。判据只有一条——模型里有没有「无蓄能元件的节点」。有就是微分代数方程组,与你用哪家工具无关。
第二件,估出模型的刚性比,据此判该不该上隐式变步长积分器,并给出分量化的容差取值与一次「收紧一档复算」的自检结论。交付物是一句能被人复核的话,不是「我一直都这么设」。
第三件,构造一致初值,并在三条起步路线之间按判据选一条。三条路线是稳态求解器起步、瞬态热浸起步、上一工况末状态热启动,各有明确的适用前提与代价。
第四件,定位离散事件、判断何时必须事件重启与步长回缩,并把求解器层的事件抖振与控制策略层的执行器抖动分开处置。判别办法只有一句话,而且当场可做。
第五件,对模型做质量与能量守恒残差自检、做 1D 离散份数无关性检查,并按六层清单逐层定位跑飞源。
第六件,判一个异常结果该进哪份清单,并据此签一句话:这个模型有没有资格进 J7-01 仿真—试验相关性验证(Correlation) 的相关性验证与 J7-06 仿真不确定度量化(UQ)与稳健/可靠性设计:从确定性单点到带分布的裕度 的不确定度量化。
本课的量具:求解器统计,不是墙钟时间
本课几乎所有判据,读的都是求解器自己吐出来的那几个数,而不是「跑得快不快」的感觉:
| 统计量 | 它涨了说明什么 | 本课哪里用它 |
|---|---|---|
| 总步数 | 步长被压小了(不区分原因) | 2.2 · 4.3 |
| 拒步数(rejected steps) | 误差估计反复不达标 ⇒ 容差、病态、事件未声明 | 2.2 · 3.3 · 4.3 |
| 最小步长出现的时刻 | 跑飞发生在哪一刻——这是定位的第一条线索 | 第 6 讲 6.1 |
| 雅可比重算次数 | 非线性块反复失效 ⇒ 模型病态的早期信号 | 1.6 · 2.2 |
| 牛顿迭代不收敛次数 | 同上,且更靠前 | 1.6 · 3.5 |
| 事件计数 | 事件是不是密集到把积分器钉死 | 4.3 · 4.5 |
⚠ 这些量在不同工具里叫法不同、有的要显式打开求解器日志才输出。名称与开关方式按你所用版本的手册确认,⛔ 不得跨工具照搬。
本课出现的典型参考值一览(⚠ 全部是量级估计或教学假设值)
⚠ 下表四项都是平台相关量——它们随回路规模、工质、部件选型与你关心的时间尺度而变。典型值,⛔ 非验收依据,须在你自己的模型上实测确认。
| 量 | 典型区间(两端都给) | 常见值锚点 | 怎么在你自己的项目上拿到它 |
|---|---|---|---|
| 慢模态时间常数 τ_max(冷却液与金属大热容) | 10² ~ 10³ s 量级 | 10² s 量级最常见(单回路乘用车冷却液侧) | 给回路一个阶跃热负荷,读关心节点温度到达终值 63% 的时刻;或用总热容除以有效换热能力估 |
| 快模态时间常数 τ_min(小体积节点、两相段胞、快执行器) | 10⁻² ~ 10⁻¹ s 量级 | 10⁻² s 量级最常见(带小容积节点的制冷剂侧) | 取工作点线性化后雅可比特征值实部量级的倒数;工程近似是「最小控制体的容积除以体积流量」 |
| 刚性比 S = τ_max/τ_min | 10³ ~ 10⁴ 量级 | 10³ 量级最常见(水路 + 制冷剂侧共存的整车模型) | 上两行相除;⚠ 每个关心工况各估一次,模式切换后会变 |
| 相对容差 rtol 的起点 | 10⁻⁴ ~ 10⁻³ | 10⁻³ 作为起点(⛔ 不是终点,必须过 2.5 的复算自检) | 从起点跑一次,再按 2.5 收紧一个数量级复算,看你要报的结果量变不变 |
★ ⛔ 区间端点不得当成可承诺值,也 ⛔ 不得拿它们反算任何具体的步长、宏步或部件参数。⚠ 前三行是各自独立的量级估计,第三行不是前两行的严格商——写成 10³~10⁴ 是因为两者的组合在整车模型上通常落在这一带,⛔ 不要拿区间端点去做除法。
⚠ 本课出现的其余数(案例里的百分数、迭代次数、事件计数)一律是教学演算假设值,不对应任何平台,⛔ 禁止照抄取用。它们存在的唯一理由,是让判据的因果关系能被讲清楚。
第 1 讲 1D 系统方程的数学结构:DAE、指标,与「代数环」的两套表述
1.1 你写的从来不是一组纯常微分方程
搭一个 1D 冷却回路,你在界面上拖的是泵、散热器、管路、三通阀、膨胀壶。工具在后台把它们变成方程,而这组方程天然分成两半:
一半带时间导数。凡是有蓄能能力的东西——部件金属热容、冷却液节点的热容、带体积的节点里的质量——它们的状态随时间演化,写出来是微分方程
ẋ = f(x, z, t)
另一半不带时间导数。不可压液体回路里,节点上的流量代数和必须为零、每条支路的压降与流量必须满足各自的阻力关系。这些关系里没有任何时间导数——它们在每一个时刻都必须当场成立,写出来是代数约束
0 = g(x, z, t)
两半合起来,就是微分代数方程组(DAE)。其中 x 叫微分变量(各节点温度、带体积节点的质量),z 叫代数变量(节点压力、支路流量)。
⚠ 一个常见的心理障碍要在这里破掉:「代数」两个字听起来比「微分」简单,实际恰恰相反。微分方程只要给一个初值就能往前推;代数约束要求在每一步的末尾都被严格满足,积分器每推一步都得回头解一次非线性方程组把它压回去。1D 系统仿真的绝大部分算力,花在这一半上。
1.2 指标:工具能不能直接往前推,取决于一个矩阵奇不奇异
不是所有 DAE 都一样难。分水岭叫指标(index)。
对上面那种「半显式」写法,判据可以写得非常干脆:
∂g/∂z 非奇异 ⟺ 指标 1
∂g/∂z 是代数约束对代数变量的雅可比,是个方阵。它非奇异,意味着「给定当前的 x 和 t,代数变量 z 被唯一确定」——积分器每推一步,都能把 z 当场解出来。这类问题主流积分器可以直接积分。
它奇异(掉秩),指标就跳到 ≥2。此时 z 不再被 g=0 唯一确定,必须先做指标约简(对 g 求导,生成隐含约束,把问题降回指标 1)或者加正则化,否则求解器推不动。
什么时候会奇异?三种拓扑,闭着眼睛都要能报出来:
① 阀全关后的孤立节点。某支路的阀全关,该支路流量恒为零、对节点压力再无依赖,那一行退化了;如果这个节点又没有任何蓄能元件(没有容积),它的压力就变成了一个没有任何方程能定的量。矩阵掉秩。
② 两个理想压力源直接对接。两个都规定压力的边界元件接在同一个无容积节点上,这个节点的压力被两个方程同时规定——要么矛盾(无解),要么冗余(掉秩)。
③ 一串无体积节点成环。一圈节点全都没有容积,压力之间只有差值关系而没有一个绝对参考,整个环的压力水平浮动。矩阵掉秩。
⇒ 这就回答了那个几乎每个新手都问过的问题:「我建的明明是不可压液体,工具为什么非要我填一个体积参数?」那个参数就是正则化容积(有的工具叫人工可压缩性)。填上它,那个节点的压力就有了自己的微分方程 —— 一条很快的微分方程 —— 于是代数约束少了一行,矩阵回到满秩,指标回到 1。
⚠ 但它不是免费的:容积取得越小,那条新增的微分方程越快,刚性比越大,隐式积分器的负担越重。取得越大,那个节点的压力动态就越假,可能把真实的压力波动抹平。这是一个双向的取舍,⛔ 不是「填个很小的数就完事」。取值属平台相关量,做法见第 5 讲 5.5 的第 ③ 层。
★ 还要钉一句本课自己归纳的边界:指标是「工具能不能直接积分」的判据,⛔ 不是「模型物理对不对」的判据。一个指标 1 的模型照样可以把散热器建反、把泵曲线填错——那属于 validation,本课一句话都不管。
1.3 非因果工具里,你永远看不到「代数环」三个字
这一节是本课最实用的一节,因为它直接决定你能不能搜到答案。
非因果物理网络工具(Amesim / GT / Dymola 与 Modelica 系工具链)的做法是:你搭好拓扑,它在编译期把全部方程收集起来,做指标约简,再做方程撕裂(tearing)——把一个大的非线性方程组拆成若干个小块,找出最少的一组「撕裂变量」,让其余变量能被顺序算出来。这是一个纯编译期的符号操作。
它失败的时候,报的措辞是什么?典型形如「非线性方程组无法求解」「初始化失败」「指标约简失败」「系统结构奇异」。⚠ 各家工具的具体措辞不同,且随版本变化,⛔ 请以你所用版本的实际输出为准。
它绝不会说「代数环」。
⇒ 所以,如果你拿着「代数环」三个字去检索这类工具的文档与论坛,会一无所获——不是因为文档差,是因为这个词不属于这套范式的词汇表。正确的检索词是 tearing、index reduction、nonlinear solver failure、structural singularity。
★ 这一条听起来像个小技巧,实际它每年浪费掉的时间可能比本课其它所有内容加起来都多:一个搜不到答案的工程师,会转而去怀疑他能想到的东西——泵曲线、阻力系数、边界条件——而真正的问题在他从未听说过的那一层。
1.4 因果式建模里,「代数环」才是原生术语
另一套范式是因果式信号流建模(控制侧的框图工具是典型)。这里每个模块有明确的输入与输出,信号沿箭头流动。
直通(direct feedthrough)指的是:一个模块的输出在同一时刻直接依赖它的输入,中间没有任何状态。比例环节是直通的,积分环节不是。
两个都带直通的模块首尾相接,就成了代数环——A 的输出要用 B 的输出,B 的输出又要用 A 的输出,两者互为条件,只能靠迭代当场解开。工具会给出环诊断报告,把环上的模块逐个列出来。
最典型的现场是控制器与被控对象的联合仿真:控制器的输出(阀开度、转速指令)在同一时刻影响对象的输出(温度、压力),对象的输出又在同一时刻被控制器读走。如果两侧都写成了直通,环就出现了。
怎么断?三条常见路子——插一个单位延迟、改接口的因果性、把一侧改成非直通。这三条的具体做法归 J1-04 整车热管理系统级联合仿真,本课只补两件它没讲的:
第一,识别靠工具的环诊断报告,⛔ 不靠肉眼看框图。大模型里环可能跨好几层子系统,看不出来。
第二,打断是有代价的,而这个代价常被忽略:插一个单位延迟,等于给这条回路引入了一个采样周期的相位滞后。在弱耦合回路上,这个滞后小到看不见;在强耦合回路上,它会把稳定性判断带偏——模型上看着稳的,实车上可能不稳;或者反过来,模型上振荡的,实车上其实没事。⛔ 所以「插个延迟把环断掉就行了」不是一个可以不加判断就用的做法。
1.5 两套表述必须并给的理由
有人会问:我只用一种工具,为什么要学另一套的说法?
因为整车热管理的模型几乎必然跨两套。物理侧用非因果工具搭回路,控制侧用因果式工具搭策略,两边通过接口耦合起来跑——这是这个行业最常见的形态。跑飞发生的时候,报错可能来自任何一侧,而两侧的报错措辞、诊断入口与修法完全不同。
⇒ 判断自己此刻在哪一栏,其实只要问一句:我的未知量是「一组带代数约束的状态量」,还是「一串模块的输入输出信号」?前者进 1.3,后者进 1.4。
⚠ 范式本身的对比(因果与非因果之分、四款工具的选型判据、建模流程与边界条件从哪来)归 J1-01 1D 热管理仿真导论(KULI/AMESim/GT/Flowmaster),本课不重讲,只接着它讲范式在求解层的后果。
1.6 雅可比与牛顿:两套表述共同的底,也是最早的体检指标
不管哪一套范式,只要有非线性代数块,每一步的末尾都得解一次牛顿迭代;解牛顿就得有雅可比矩阵。求解器不会每步都重算雅可比(太贵),它会尽量复用,直到迭代收敛变慢才重算。
⇒ 于是就有了两个非常灵敏的早期体检指标:
雅可比重算次数异常升高,说明复用失效得很快——工作点在快速漂移,或者矩阵条件数很差。
牛顿迭代不收敛次数异常升高,说明非线性块本身在反复失效。
这两个数比「报错」早得多。模型病态的常见根因有三条:状态量量级相差过大(同一个矩阵里既有 10⁵ 量级的 Pa 又有 10⁻³ 量级的 kg·s⁻¹)、除零(零流量处的某些关联式)、物性表外插(调用点跑出了物性表的定义域,返回的导数完全没有物理意义)。
★ 把这两个数当日常体检项读:模型没报错但这两个数在涨,就该去看了,而不是等它某天报错。
后面还有 5 讲正文 · 关键公式 · 案例拆解 · 常见误区 · 动手做