NOAI 2024 复赛第4题 | 当AI遇上物理:用梯度下降求解微分方程
AI for Science 微分方程
用NOAI复赛真题,构建孩子的AI知识图谱
每个知识点后续都会单独展开讲解,欢迎先关注收藏
这道题在做什么
一个带空气阻力的单摆,传感器记录了摆角随时间变化的数据。但传感器中途坏了若干秒,断档期间有人施加了一个恒力。你要从残缺的数据中,反推出绳长、空气阻力、外力大小等5个物理参数。
这道题和2024年前三道完全不一样——不是训练一个神经网络做预测,而是用PyTorch的自动求导能力,回归一组微分方程的参数。
知识全景
这道题横跨物理和AI两个领域,是AI for Science(AI驱动的科学研究)的典型范例。
| 阶段 | 知识点 |
| 理解问题 | ① 微分方程 ② 阻尼振荡 |
| 处理数据 | ③ 数值微分(差分法) |
| 求解参数 | ④ 参数回归 ⑤ 自动求导 |
| 做出预测 | ⑥ 数值积分(ODE求解器) |
| 思维方法 | ⑦ AI for Science |
① 微分方程
微分方程是用变化率来描述事物变化规律的方程。
一个简单的例子:银行存款。如果利率是5%,存款的增长速度和当前余额成正比——余额越多,增长越快。用数学写就是:
d(余额)/dt = 0.05 × 余额
这就是一个微分方程。它不直接告诉你"明天余额是多少",而是告诉你"余额怎么变化"。要知道具体数值,需要从一个初始值出发,一步步推算。
这道题的微分方程描述的是单摆运动:
a(t) = -α · ω(t) - β · sin(θ(t))
其中θ是摆角,ω是角速度(θ的变化率),a是角加速度(ω的变化率),α和β是跟绳长、阻力有关的参数。
微分方程是物理学、工程学、生物学、经济学中描述动态系统的基本工具。很多自然现象(流体运动、化学反应、人口增长、疾病传播)都可以用微分方程来描述。
② 阻尼振荡
单摆在没有阻力的理想世界里会永远摆下去。但现实中有空气阻力——每摆一次,能量都会损失一点,振幅逐渐减小,最终停下来。
这种幅度逐渐衰减的振荡叫做阻尼振荡。在数据中的表现是:θ(t)是一个上下波动的曲线,但波峰一次比一次低,波谷一次比一次浅。
这道题更复杂:中间某个时刻施加了一个恒力,改变了运动规律。所以数据的前半段和后半段遵循不同的方程(β值不同)。
理解阻尼振荡的物理图景,是正确分段数据和设计求解策略的前提。
③ 数值微分(差分法)
微分方程里有角速度ω和角加速度a,但传感器只记录了摆角θ。怎么从θ得到ω和a?
用差分法近似计算导数。
导数的定义是"极限意义下的变化率",但数据是离散的(每隔一小段时间记录一个值),所以用相邻两个点的差值除以时间间隔来近似:
ω(t) ≈ (θ(t+Δt) - θ(t)) / Δt
a(t) ≈ (ω(t+Δt) - ω(t)) / Δt
差分法简单直观,但有一个缺点:对噪声敏感。如果原始数据有一点点抖动,求一次差分会放大抖动,求两次差分(从θ到a)会放大得更厉害。
每求一次差分,数组长度还会减1(n个点变n-1个点)。对齐θ、ω、a的数组长度是一个容易出bug的地方。
④ 参数回归
这道题的"训练"和2024年前三道题不一样。
2024年前三道题:给数据 → 训神经网络 → 预测新数据。模型有很多参数(权重和偏置),学到的是一个通用的输入→输出映射。
这道题:给数据 → 建物理方程 → 回归方程的参数。模型只有几个参数(α、β₁、β₂),学到的是物理规律的具体数值。
具体做法:
• 把α和β定义为PyTorch的可学习参数(nn.Parameter)
• 用方程算出"如果α和β是当前值,a应该是多少"
• 和从数据差分算出来的真实a比较,计算误差(MSE Loss)
• 用梯度下降更新α和β,让误差变小
这种方法叫参数回归——已知方程的形式,用数据来确定方程中未知参数的值。它和训练神经网络用的是同一套工具(损失函数+梯度下降+自动求导),只是目标不同:一个是学复杂映射,一个是定物理常数。
⑤ 自动求导
梯度下降需要计算"损失对每个参数的梯度"。在神经网络中,这个计算由框架(PyTorch)自动完成,叫做自动求导(Automatic Differentiation)。
PyTorch记录了所有计算的过程(构建"计算图"),调用.backward()时,沿着计算图从后往前,逐步计算每个参数的梯度。这就是2024年第1题提到的反向传播。
这道题的精妙之处在于:物理方程也是一种"计算"。α乘以ω、β乘以sin(θ)——这些运算都可以被PyTorch追踪。所以虽然这道题没有神经网络,但PyTorch的自动求导能力一样能用。
PyTorch不只是训练神经网络的工具,它是一个通用的自动求导引擎。任何能写成数学公式的计算,只要涉及可学习参数和损失函数,都可以用PyTorch的梯度下降来优化。
⑥ 数值积分(ODE求解器)
回归出α、β₁、β₂之后,你就"知道"了完整的微分方程。下一步是用方程做预测——比如预测施力后下一次摆角过零的时刻。
微分方程的解析解(精确的数学公式)通常很难求。更实用的方法是数值积分:从一个已知的初始状态出发,一小步一小步地往前推算。
最简单的数值积分方法是欧拉法:
θ(t+Δt) = θ(t) + ω(t) × Δt
ω(t+Δt) = ω(t) + a(t) × Δt
每一步只需要知道当前状态和微分方程,就能算出下一步。步长Δt越小,结果越精确,但计算量越大。
实践中通常使用更精确的方法(如4阶龙格-库塔法),Python的scipy.integrate.odeint就封装了这类算法。输入微分方程、初始条件和时间范围,它就能输出完整的状态曲线。
⑦ AI for Science
这道题代表了AI应用的一个重要方向:用AI的工具解决科学问题。
传统的科学研究方法是:建立物理模型(微分方程)→ 设计实验收集数据 → 用数学方法求解方程参数。这道题用梯度下降代替了传统的数学求解方法——本质上是同一件事,但工具更通用、更灵活。
AI for Science不是"用AI替代科学",而是把AI当作一个强大的数学工具箱。科学家提供物理知识(方程的形式),AI提供优化能力(从数据中找到最优参数)。两者结合,能解决传统方法难以处理的复杂问题。
这也是NOAI竞赛区别于传统编程竞赛的重要特征:它不只考编程能力,还考把实际问题翻译成数学问题,再用AI工具求解的能力。
这道题把AI的工具箱从"训练神经网络"扩展到了"求解物理方程"。理解"梯度下降是一种通用优化方法"这件事,比学会任何一种具体的模型架构都重要。