4. 物理建模的数学表达

在计算物理中,我们面对的第一个“真实问题”往往不是写出方程,而是把方程整理成计算机能够逐步推进的形式。牛顿第二定律 F = ma 看起来简单,但它是一个二阶微分方程:加速度是位置对时间的二阶导数。数值方法(尤其是本章后面要讲的有限差分)通常只擅长处理一阶导数,因此建模的第一步,就是把高阶方程“降阶”为一阶方程组。这一步不是数学游戏,而是所有后续离散化、初值设定和程序循环结构的直接依据。

一、为什么必须改写成一阶方程组

考虑一维情形,设位置为 x(t),速度为 v(t),则牛顿第二定律写作:

m · d²x/dt² = F(x, v, t)

这是一个二阶常微分方程。若直接对它做有限差分,需要同时处理 xi+1、xi、xi−1 三个时刻,边界处理和初始条件都更繁琐。而如果我们引入速度作为独立变量,令 v = dx/dt,就得到两个耦合的一阶方程:

dx/dt = v
dv/dt = F(x, v, t) / m

这样,系统的“状态”就被压缩成一个向量 y = [x, v]T,其演化由 dy/dt = f(y, t) 描述。计算机只需知道当前时刻的 y,就能算出下一时刻的 y,这正是显式时间推进(如欧拉法、龙格–库塔法)的标准输入形式。换句话说,降阶把“需要历史信息”的二阶问题,变成了“只需当前状态”的一阶初值问题。

二、改写的一般套路与符号约定

对于任意 n 阶常微分方程,降阶方法是一致的:为每个低阶导数引入一个新变量。以二阶为例,定义 y1 = x,y2 = dx/dt,则原方程化为:

dy1/dt = y2
dy2/dt = F(y1, y2, t) / m

这里必须先把参照约定说清楚,否则正负号会出错。本文统一采用:位置 x 向右为正,速度 v 向右为正,力 F 向右为正。例如竖直上抛问题中,若取向上为正,则重力 F = −mg,于是 dv/dt = −g;若取向下为正,则 dv/dt = +g。两种约定都对,但全文和程序必须一致。这个约定会直接写进 F(x, v, t) 函数的返回值里,是建模时最容易埋下隐患的地方。

三、一个可运行的示例:阻尼弹簧振子

设质量 m = 1.0 kg,弹簧刚度 k = 4.0 N/m,阻尼系数 c = 0.3 N·s/m,初始位置 x0 = 1.0 m,初始速度 v0 = 0。受力为 F = −kx − cv(弹簧力与位移反向,阻尼力与速度反向)。改写后:

def rhs(t, y):
    x, v = y
    F = -4.0 * x - 0.3 * v
    return [v, F / 1.0]

# 初值向量
y0 = [1.0, 0.0]

这段代码就是整个物理模型的“数学表达”落地形态:rhs 返回的列表第一个分量是 dx/dt,第二个是 dv/dt。后续无论用欧拉法还是四阶龙格–库塔法,都只需把这个函数交给时间推进器。注意 y 是长度为 2 的列表,而不是两个散落的变量,这种“状态向量”写法让程序结构可以直接推广到多自由度系统。

四、从单自由度到多体系统

降阶思想真正的价值在多体问题中才充分显现。设两个质量块由弹簧连接,位置分别为 x1、x2,速度 v1、v2,则状态向量扩展为四维 [x1, v1, x2, v2],方程变为四个一阶方程。规律很清晰:每个二阶自由度贡献两个一阶方程,N 个自由度就是 2N 维一阶方程组。这也解释了为什么有限元、分子动力学等程序内部几乎都以“状态向量 + 导数函数”的接口组织代码。

二阶方程 → 一阶方程组 → 状态向量推进 牛顿第二定律 m·d²x/dt² = F 二阶常微分方程 需要历史时刻信息 引入 v 一阶方程组 dx/dt = v dv/dt = F/m 只依赖当前状态 打包 状态向量 y y = [x, v]ᵀ dy/dt = f(y, t) 时间推进器输入 数值推进循环(以显式欧拉法为例) 已知 yₙ t = tₙ 计算 f(yₙ, tₙ) 得到 [vₙ, F/m] yₙ₊₁ = yₙ + h·f 步长 h 推进,重复直到目标时刻

五、初值、边值与离散化的衔接

改写成一阶方程组后,问题的类型也随之明确。若已知 t = 0 时刻的全部状态(x0 和 v0),就是初值问题,可以从头逐步推进;若已知的是两端位置(如弦的两端固定),则属于边值问题,不能简单向前推进,需要打靶法或矩阵求解。牛顿第二定律的多数动力学问题天然是初值问题,这也是为什么降阶后特别适合时间步进。

离散化思想在此处体现得很直接:把连续时间 t 切成间隔 h 的网格 tn = n·h,用差分代替导数。以显式欧拉法为例,xn+1 = xn + h·vn,vn+1 = vn + h·Fn/m。这里 h 的选择不是随意的:对阻尼弹簧振子,h 过大时数值解会发散或出现虚假振荡,这就是稳定性问题;h 减小时误差按一阶下降,这是收敛性问题。降阶本身不改变物理,但它把“稳定性与收敛性”的分析对象统一成了一个标准形式 dy/dt = f(y, t),后续章节的误差分析都建立在这个形式上。

建模检查清单:① 是否明确了正方向约定并写进受力函数;② 每个二阶自由度是否都配了一个速度变量;③ 初值是否给全了位置和速度;④ 状态向量顺序在 rhs 与推进器中是否一致。这四点出错,程序往往能跑但结果物理上错误。

把牛顿第二定律改写为一阶方程组,是计算物理建模中“把物理翻译成算法”的关键一步。它统一了问题形式,明确了初值需求,也为离散化、稳定性和收敛性分析提供了共同的语言。掌握这个套路后,无论面对弹簧振子、抛体运动还是多体耦合,都能迅速写出可被数值方法直接消费的模型。