1. 这道题到底在考什么:先别急着写代码,把问题读懂
1.1 从一个参赛队的真实痛点说起
2026年美赛A题把目光投向了智能手机电池消耗。很多队伍拿到题的第一反应是去网上找电池数据集,或者直接套一个时间序列预测模型,结果做到第三天发现方向跑偏了。我经历过好几届美赛,也带队写过A题,最深的感受是:A题考的不是你会多少花哨的算法,而是你能不能把一个连续系统的物理规律用数学语言讲清楚,并且让评委在十页纸里看到你的思路是自洽的。
这道题的核心关键词有两个:一个是“建模”,一个是“代码”。建模解决的是“电池电量怎么随时间衰减”的问题,代码解决的是“这个模型能不能跑起来、能不能复现”的问题。美赛评委最讨厌的就是那种“我提出一个模型,但不知道怎么算”的论文。如果你能把一个即使简单但完整跑通的模型放在附录里,得分一定比堆砌三个半成品模型高得多。
1.2 电池消耗问题本质上是连续系统建模题
为什么美赛要把手机电池作为A题?往深了看,A题历年都偏向“物理过程建模”加“优化决策”,比如2019年的“龙卷风数据”、2021年的“真菌分解”。电池消耗恰好是一个典型的连续时间过程:电量是时间的函数,而且这个函数的形式取决于很多因素——屏幕亮度、后台应用数量、无线通信状态、信号强度、温度、电池老化程度。
如果你把它看作一个纯粹的“回归问题”,拿一堆特征去拟合剩余电量,那就偏离了美赛的出题意图。出题人真正想让你做的是:
- 建立电池荷电状态(SOC)随时间变化的微分方程或差分方程;
- 识别哪些因素对耗电速率有显著影响,给出量化关系;
- 用数据或实验设计来验证模型;
- 基于模型回答一个实际问题,比如“怎样的使用习惯能延长续航”或者“哪种充电策略最优”。
所以读完题的第一件事,不是打开Python,而是拿出一张白纸,写下:系统的状态变量是什么?输入是什么?参数是什么?边界条件是什么?这一套流程走完,你的建模骨架就清晰了。
1.3 你能从这篇博文里得到什么
我会尽量用一次完整的美赛A题解题流程来写这篇分享,而不是只讲理论。内容包括:数据怎么获取和构造(因为美赛往往不直接给你一份现成的电池数据)、如何从物理常识出发建立核心耗电模型、怎么用Python做参数估计、灵敏度分析怎么做、论文图表怎么画、以及最容易踩的坑和对应的排查办法。
不管你是第一次参加美赛的新手,还是常年混迹国赛、数模竞赛的老手,只要按照这套流程走,至少不会在A题上出现方向性错误。后续的所有代码片段,我都会以Python为主,用到的库尽量集中在numpy、scipy、pandas、matplotlib这几个最常见的库里,避免因为环境装不上影响你的进度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 整体建模思路设计:先把“物理骨架”搭起来
2.1 为什么建议采用“机理+数据”的混合思路
很多队伍面对一道题,容易走两个极端:要么完全从物理机理出发,列一堆偏微分方程,最后自己都解不动;要么完全靠数据驱动,遇到什么训练什么,最后得到一个没有任何解释性的黑箱。
我个人的建议是:以机理模型为主体框架,用数据去校准参数。这样做的优势很明显:第一,机理模型在有数据之前就能给出合理的定性行为;第二,数据只用来拟合少数几个关键参数,降低了过拟合风险;第三,论文里可以清楚地解释每个参数对应的物理含义,这种“可解释性”在美赛评委那里非常加分。
具体到手机电池问题,最经典的做法是建立一个基于时间的SOC衰减方程:
[
\frac{dS(t)}{dt} = -r(t)
]
其中 (S(t)) 是时刻 (t) 的剩余电量(以百分比表示,范围0~100),(r(t)) 是瞬时耗电速率(单位:%/小时)。这个方程的物理含义很简单:电量的下降速度等于当前的耗电速率。但 (r(t)) 本身是复杂的,它取决于手机当前在做什么。
2.2 把耗电速率拆成“基础耗电+场景耗电”
一个合理的假设是:手机耗电速率由基础空闲耗电和任务相关耗电两部分组成。
[
r(t) = r_{base} + r_{screen}(B(t)) + r_{app}(A(t)) + r_{comm}(C(t)) + \varepsilon(t)
]
- (r_{base}):待机时的基础耗电,包括系统进程、信号搜索等。这个量一般来说比较稳定,可能每小时0.5%~1.5%;
- (r_{screen}(B(t))):屏幕耗电,和屏幕亮度 (B(t)) 强相关,通常近似线性;
- (r_{app}(A(t))):应用负载耗电,比如游戏、视频、导航等,不同的应用类型对应不同的功率等级;
- (r_{comm}(C(t))):通信耗电,取决于是否使用4G/5G/Wi-Fi、信号强弱等;
- (\varepsilon(t)):随机噪声,用来描述不可预测的波动。
为什么拆成这几项?因为每一项都有明确的物理背景,而且每项都可以通过实验设计单独标定。比如你把手机屏幕关闭、所有应用退出、连接固定Wi-Fi,测出来的耗电就近似等于 (r_{base});再打开屏幕固定亮度,测出来的增量就是 (r_{screen})。
2.3 电量作为积分结果:用离散化简化计算
因为真实使用场景中 (r(t)) 不是一个简单的连续函数,而是一段一段的(比如你刷了20分钟视频,然后切到微信聊天,再锁屏走路),所以实际计算时都会把时间离散化。设时间步长为 (\Delta t)(比如1分钟或5分钟),那么从 (t_i) 到 (t_{i+1}) 的电量变化可以写成:
[
S_{i+1} = S_i - r_i \cdot \Delta t
]
其中 (r_i) 代表时间段 ([t_i, t_{i+1}]) 内的平均耗电速率。这就是一个理想的差分方程递推模型。当你把用户一天的行为拆成一连串的“状态段”,每一段赋予一个耗电速率,累加起来就能预测一整天的电量曲线。
这种离散化处理的另一个好处是,它天然适合程序实现。用Python写一个for循环就能完成递推,不需要解复杂的微分方程。后面我会给出具体代码。
2.4 模型选型的横向对比
在实际比赛中,很多队伍也会考虑其他方案,我简单做个对比:
| 模型方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 常微分方程(ODE) | 物理含义清晰,理论严谨 | 参数多,解析解困难 | 理论推导占主要篇幅的论文 |
| 离散差分递推 | 实现简单,灵活 | 依赖于时间步长选择 | 有用户行为数据的场景建模 |
| 线性回归/随机森林 | 拟合精度高,不需物理机理 | 可解释性差,参数含义不明 | 大量实测数据的纯数据方案 |
| 马尔可夫链 | 适合状态切换频繁的场景 | 状态划分依赖主观判断 | 用户使用行为模拟 |
我的建议是:论文主模型用离散差分递推,配合一个从物理角度推导的耗电速率公式;可以适当用回归方法去标定参数,但不要让机器学习模型变成主角。原因很简单:美赛评委会更欣赏“你能解释每个变量为什么出现在公式里”
