物理建模与仿真:Python、Typst 与 CeTZ 协同
建模仿真 · 14 / 18 | 阅读约 13 分钟
痛点引子 「这道题没有公式可套,但计算机可以一秒试完」
空气阻尼下的投篮轨迹、非线性摆的混沌运动、多体引力下的星轨——它们没有解析解,却能用计算机一步一步算出来。这就是数值仿真:把物理定律交给循环语句,让机器替你「做十万次一小步」。
仿真与第 13 篇的数学建模是一对搭档:建模给出方程,仿真给出数值结果,Typst 与 CeTZ 负责把结果变成可发表的文档与图。这一篇打通这条现代科研的生产线。
知识地图 仿真生产线的四站
已学基础:微元法(第 15 篇)、微积分语言(第 12 篇)、建模流程(第 13 篇)。本篇把它们编码化:物理模型 → 微分方程 → 离散化(把 换成小步长 )→ 循环计算 → 可视化。断层在哪?中学只做「解得出来」的题,仿真解锁「解不出来但算得出来」的题——能力边界从公式库扩展到想象力。
流水线的关键一站是离散化:把 改写为更新规则 ——每过一个时间步,速度增加一点。计算机每秒执行百万次这样的小步,连续的物理世界在机器里变成离散的幻灯片。步长 是仿真的核心参数:太大则失真,太小则费时。
核心讲解 两个核心:收敛性意识与可视化
核心概念一:数值解永远带着「步长税」。
检验仿真是否可信的标准做法:先解一个有解析解的简单版本(比如无阻尼抛体),把数值解与精确解画在一起。本例的欧拉法折线系统性偏低——这是它的固有误差,步长减半误差大体减半(收敛性合格)。凡是仿真论文,都要有这一张「与解析解对比」的图,证明你的代码可信,然后才有资格谈新现象。先校准再测量,与实验的科学素养完全同构。
核心概念二:可视化是仿真的第二生命。
数据表格没有人读得懂,图与动画才有说服力。CeTZ 恰好是「由数据画图」的利器:把仿真输出的每帧位置喂给 CeTZ,自动生成轨迹分帧图——图中水平速度矢量不变、竖直速度逐帧等量变化,重力加速的本质一图看穿。这也是本系列配图的方法论:数据 → 代码 → 图,可复现、可修改、可动画。强基与科创比赛的报告里,「用代码仿真 + 用 CeTZ 绘图」的组合是区分度的最短路径。
例题拆解 二十行代码仿真一个阻尼抛体
✎ 示范:带空气阻力的投篮
物理模型:重力 竖直向下;阻力 (与速度成正比、方向相反)。
微分方程:。
离散化(欧拉法,步长 0.01 s):每一步先算加速度 ,再更新 、位置 。
代码骨架(Python):
v = [vx0, vy0]; s = [0, h]
for i in range(N):
a = (0, -g) - (k/m) * v
v = v + a * dt
s = s + v * dt
track.append(s)
可视化:轨迹图显示无阻力抛物线如何被「压弯」,射程比理想值缩短多少;用 CeTZ 画分帧图,直观呈现阻力对速度矢量逐帧的影响。
没有解析解也没关系——用「关闭阻力」的版本校准代码(应精确复现抛物线),再打开阻力看差异。校准—仿真—可视化三段,就是一道开放题的完整答卷。
仿真还有一个「混沌」的彩蛋值得预演:数值方法对某些系统(非线性摆、三体引力、天气)会出现「蝴蝶效应」——初值的十亿分之一误差,几十步后被放大到面目全非。这不是代码 bug,而是系统本身的属性(对初值敏感依赖)。洛伦兹用计算机研究大气环流时发现了它,混沌理论由此诞生。仿真的极限告诉我们:可计算不等于可预测——这是计算思维教给物理学家最谦逊也最深刻的一课。
思维方法 计算思维:把物理直觉交给循环
⭐ 仿真的三问
步长取多少?(收敛性:减半步长结果应稳定)模型可信吗?(先复现已知解再谈未知)输出怎么讲给读者?(一张好图胜过一页数字)。
计算思维不是「会编程」,而是知道什么时候该让计算机上场:解析解失效的地方,就是仿真的起点。这扇门在大学实验室与工业界天天敞开。
行动清单 今天就能做
可视化还有一个「色彩语义」的进阶建议:为你的仿真输出建立一套固定的颜色语言——蓝=速度、橙=能量、红=异常、灰=参考,全项目统一。跨图对比时,读者(包括未来的你自己)不需要重新学习图例。这一条与全系列的配色规范(蓝数学、橙物理)同源:色彩语义的一致性,是专业度最便宜的可见标志。工程界的图表规范手册(如各航天的可视化指南)都在重复同一条建议。
快问快答:三个高频疑问
- 步长取多小才算够? 答:做「步长减半」测试:结果变化小于你需要的精度即可——收敛性试验是标准动作。
- 仿真结果与实验不符先查什么? 答:先查代码(守恒量是否漂移),再查模型(阻力形式、参数),最后才怀疑理论。
- 不会编程能做仿真吗? 答:电子表格的迭代列就是最朴素的仿真器——先在表格里体会「逐步更新」,再迁移到代码。
延伸阅读
- [S3-13 · 数学建模]:假设与验证的流程同款。
- [S1-17 · 工具箱]:Typst + CeTZ 的绘图底座。
- [S3-16 · 高级绘图]:分帧可视化的进阶版本。
✅ 行动清单:今天就能做的 3 件事
- ① 安装 Python,抄写并运行上面的阻尼抛体骨架代码(20 行以内),画出轨迹图。
- ② 做「校准实验」:令 运行,检验输出是否落在理想抛物线上;再逐步增大 ,观察轨迹压弯。
- ③ 把仿真输出的轨迹数据(CSV)导入 CeTZ 画成图,插入一份 Typst 文档——完成「仿真 → 论文」全链路。