
2025 数学建模国赛 A 题复现最忌讳的做法是赛题公布后从网上下载一份完整代码跑一遍出图然后把代码和图表粘贴进论文觉得这就是复现。不是的。真正的复现是把问题分析、模型建立、代码实现、结果验证、论文成稿这一整条链路重新走通。这篇内容给备战 2026 国赛的同学也适合第一次做 A 题复现的团队。核心就一句话复现的目标不是拿到一份代码而是拿到一套能够稳定解题的流程。先说判断标准。一篇合格的 A 题复现至少要做到三件事每一问都有明确的问题拆解每一问都有对应代码模块并且代码结果能直接支撑论文里的数值结论。如果你只做到了“有代码”那离完整复现还差一半。下面我按实际备赛顺序展开不会替你念某一年的完整题目因为那样没有迁移价值更重要的是赛题数据每年都在变能复用的是方法。整篇文章我会用一个偏物理机制建模的通用例子来说明遇到哪一年的 A 题你都可以套这个框架。1. 复现 A 题之前先把“复现”这两个字想清楚1.1 多数人理解的复现只是跑通别人代码拿到别人的源码装好依赖运行一遍看到结果这是“运行成功”不是“复现成功”。比赛时你面对的是空白文档、空白脚本和一堆数据没有任何人可以问。这时候能不能从零开始写出模型代码才是真实水平。我个人的习惯是拿到一篇优秀论文先不急着看代码只看题目、模型假设和公式。自己先写一个版本再回头对照论文里每一个公式和参数。这个流程很慢但非常补能力。跑十遍别人的代码都不如自己从头推导一遍。1.2 真正要复现的是一条完整链路A 题复现不是只复现“建模”或“代码”而是复现这道题从无到有的完整链路读题 → 问题拆解 → 模型选择 → 假设设定 → 数学表达 → 算法设计 → 代码实现 → 调参验证 → 结果可视化 → 论文成稿。代码只是这条链路里的一环但也是最容易暴露问题的一环。很多人模型写得很漂亮一到代码阶段就发现函数调用不通、数据无法对齐、结果差好几个数量级。原因往往不是算法难而是前面的拆解和假设没有变成清晰的模块。1.3 从赛题原文里读出四样东西拿到原题后不要急着打开数据。先把赛题原文读透提取四样东西目标每个问题到底要求什么是求参数、做判断、给方案还是预测结果。数据给了哪些表格每个字段代表什么单位是什么表与表之间怎么关联。条件题干里有哪些物理约束、业务限制、环境条件。输出每个问题要求输出什么形式的结果是数据表、曲线图还是一段方案说明。很多团队说第二问不会实际是第一问数据没读干净。少了一列、单位没换算、表格字段名弄错后面全乱。建议拿到赛题后先写一张“读题卡片”每个问题一行写清输入、模型、输出。写不出来说明题还没读透。2. 逐问拆解把“完整解答”变成能执行的清单2.1 每个问题都先回答四个问题A 题通常有多问每一问都不能笼统地说“用某某方法”。我一般会把每个问题拆成四列问题输入数据建模目标候选模型输出结果第一问时间、测量值、环境参数还原物理过程的变化规律微分方程 / 状态方程参数值或变化曲线第二问第一问得到的模型辨识特定参数最小二乘 / 参数优化最优参数和拟合效果第三问环境约束与目标函数给出最优控制方案规划 / 遗传算法决策变量和目标值第四问前几问结果综合评价或敏感性分析对比分析 / 扰动测试结论和建议这张表不限于某一年的 A 题。它是把“题目语言”翻译成“建模语言”和“代码语言”的中转站。2.2 问题之间的依赖关系决定建模顺序A 题的几问通常不是并列的而是递进的。第一问算出的函数第二问要拿来用第三问的优化目标又依赖第二问的结论。这种情况下代码结构很关键。第一问的求解结果不要只输出几个数字要封装成函数或类。这样第二问可以直接调用。如果所有代码都堆在一个长脚本里第二问想复用第一问的模型就只能复制粘贴不仅乱还容易改出矛盾。依赖顺序上我建议严格按题目顺序建模不要跳。第一问没跑通别急着写第三问。很多时候第三问的失败是因为第二问的参数精度不够或者第一问的模型形式本身就有问题。2.3 一个可以套用的考点识别模板A 题每年风格会变但常见考点基本集中在这几类机理建模根据物理、化学、环境过程建立模型常用微分方程、状态方程、守恒关系。参数辨识给一组观测数据反推模型里的未知参数常用最小二乘、曲线拟合、优化算法。优化决策在约束下求最优方案涉及规划、启发式算法、多目标优化。预测与评价用历史数据预测未来或对多个方案做综合评价涉及回归、时间序列、层次分析等。识别考点不是为了给题目贴标签而是为了快速决定算法路线。比如你判断第一问是机理建模那么代码重点就要放在微分方程求解和参数拟合上不用过早考虑机器学习模型。先管准再管炫。3. 代码骨架让模型为每个问题服务3.1 先搭目录再写代码很多队伍的代码就是三个文件main.py、最终版.py、真的最终版.py。这种命名方式在比赛最后一天会让人崩溃。更稳妥的做法是提前搭好目录A_reproduction/ ├── data/ │ └── raw_data.xlsx ├── code/ │ ├── 01_data_preprocess.py │ ├── 02_model.py │ ├── 03_optimize.py │ └── 04_visualize.py ├── output/ └── figures/按问题顺序编号能保证任何时候都知道某一问的代码在哪里。中间结果统一放 output图片统一放 figures不要散落在桌面和下载目录里。目录搭好后第一件事不是写算法而是写一个空的constants.py把单位换算、常量、路径放进去。后面所有脚本都从同一个地方读配置避免每个文件里各写一份。3.2 数据读取与预处理A 题给的数据经常是 Excel 或 CSV字段可能包含缺失值、异常值、单位混用。读取之后一定要先检查数据质量。import pandas as pd # 通用示例不是某一年真题数据 df pd.read_excel(data/raw_data.xlsx, header0) print(df.head()) print(df.info()) print(df.isnull().sum()) print(df.describe())重点关注三样东西缺失值是删除、插值还是用均值填充要写清楚理由。单位字段名里如果出现 mm、cm、m先统一换算。表间关联多个表之间靠哪个字段连接字段名是否一致。数据预处理不是得过且过。很多复现跑不出结果最后定位到的问题是 Excel 里某列是文本格式Python 读进来变成字符串一算就报错。3.3 把模型封装成函数建模代码不要写成几百行的过程式脚本。每一类模型都应该封装成函数输入参数输出结果。以物理机制建模的通用结构为例import numpy as np from scipy.integrate import solve_ivp from scipy.optimize import least_squares def forward_model(t, state, theta): # 通用状态方程模板theta 是待辨识参数 dydt theta[0] * state - theta[1] * t return [dydt] def simulate(theta, time_span): sol solve_ivp( forward_model, [time_span[0], time_span[-1]], [0.0], t_evaltime_span, args(theta,), ) return sol.y[0] def loss(theta, t_data, y_data): y_pred simulate(theta, t_data) return np.sqrt(np.mean((y_pred - y_data) ** 2))这只是示例框架不是真题答案。但结构可以直接复用模型函数负责“如何算”损失函数负责“算得多准”优化器负责“找参数”。三层拆开以后后面想换损失函数或者加约束都很方便。3.4 中间结果落盘每跑完一步把结果保存下来。CSV 和图片都要有。import pandas as pd result pd.DataFrame({ t: t_data, y_obs: y_data, y_pred: y_pred, }) result.to_csv(output/01_fit_result.csv, indexFalse)为什么一定要保存中间结果因为 A 题后面几问很可能要用前几问的输出。如果每次都要重新跑一次完整流程耗时长不说还容易因为临时改动把前面结果弄没。落盘之后论文写作阶段也方便直接回填数据。4. 求解细节与踩坑记录4.1 求解器不是越高级越好代码跑到求解阶段最容易犯的错是盲目换工具。看到“这个模型不收敛”第一反应不是换遗传算法而是先确认当前方法有没有用对。我一般优先按这个顺序选求解器问题类型常用工具使用注意常微分方程初值问题scipy.integrate.solve_ivp先确认初始状态和时间跨度参数拟合scipy.optimize.least_squares初值和参数上下界很重要非线性约束优化scipy.optimize.minimize(methodSLSQP)约束条件要写清楚组合优化、强非线性问题遗传算法、模拟退火耗时长适合复杂目标函数千万注意A 题物理机制类问题优先考虑能解释机理的模型不要一上来就上机器学习。机器学习在数据量不足时很容易过拟合而且解释性差论文阶段很难写清楚。4.2 不收敛先查初值、步长和约束迭代不收敛是 A 题复现里最常见的问题。碰到这种情况我建议按顺序排查先看 loss 是否在下降。如果 loss 完全不变化多半是代码逻辑问题。看参数是否一直顶到边界。如果连续几次都撞在bounds上说明初值方向不对。换几组初值再试。最优解应该对不同初值保持稳定。再增大迭代次数比如把max_nfev调大。最后才考虑换算法。有一次我调了一个下午最后发现是角度初值用了度数而模型内部用的是弧度。一换算全部跑飞。所以排查顺序里单位应该排在“换算法”之前。4.3 符号、单位、坐标系统一物理建模类题目最容易乱的是符号和坐标系。同一个变量第一问叫theta第二问叫angle第三问又写成alpha后面论文都很难写。我的做法是在constants.py里统一维护# constants.py G 9.8 # 重力加速度 DEG2RAD np.pi / 180.0 R 1.0 # 某一半径示例值所有脚本都从这里导入。不要在每个脚本里自己写一遍g9.8否则某个脚本改成 9.81另一个没改结果就对不上。4.4 随机数种子和依赖版本如果你的代码里用到了随机初始化、遗传算法、模拟退火一定要固定随机数种子。import numpy as np rng np.random.default_rng(42)这样每次运行结果才能一致复现才有意义。另外建议在 output 目录里记录 numpy、scipy、pandas 的版本号。A 题代码不像软件开发那样需要极强可复现性但版本不一致很容易导致结果对不上尤其是在团队多人协作时。5. 从“能跑”到“能拿分”结果验证怎么做5.1 第一层验证常识性检查模型跑通以后先不要急着写论文。第一件事是看结果是否符合常识。检查方向有三个量级结果是否和题干数据在同一数量级。边界参数取极端值结果是否也对应极端变化。趋势输入变大输出应该变大还是变小和物理规律是否一致。如果算出来一个物理量是负的但实际场景里不可能为负那一定是建模或代码有问题。不要拿着一张明显违背常识的图去参加比赛。5.2 第二层验证误差与残差拟合类问题必须做误差分析。最基础的是看拟合曲线和真实数据点的残差分布。import numpy as np residual y_data - y_pred mae np.mean(np.abs(residual)) rmse np.sqrt(np.mean(residual ** 2)) print(fMAE: {mae:.6f}, RMSE: {rmse:.6f})只看曲线贴不贴近是不够的。残差如果呈现明显的弯曲或周期说明模型形式可能漏了某项。A 题评阅比较看重误差分析和模型修正过程这部分写好了很加分。5.3 第三层验证稳定性和敏感性A 题复现到后半段建议加一组稳定性测试。做法很简单把参数初值换 2 到 3 组看是否收敛到同一个结果。把观测数据随机抽掉 10%重新拟合看参数变化是否明显。把模型参数整体扰动 5%看最终结果的变化幅度。这一步不是锦上添花。它直接回答一个问题你的结论是数据内在规律还是模型恰好凑出来。敏感性分析的结果还可以做成图比如“参数变化对目标结果的影响曲线”。这类图在论文里很实用评阅人一眼就能看出你对模型的把握程度。5.4 把验证结果变成论文素材验证不只是为了自己放心它最终要变成论文里的表和图。常见的素材包括拟合结果表真实值、预测值、绝对误差、相对误差。残差图横坐标是时间或样本序号纵坐标是残差。敏感性曲线横坐标是参数变化率纵坐标是输出结果。收敛曲线优化过程中目标函数下降趋势。我一般会在 output 目录下建一个verification/文件夹把这些验证素材统一保存。论文写作阶段直接从里面选图不用临时重新跑代码。6. 从复现到论文把代码结果变成得分点6.1 论述顺序先因果再公式很多论文写出来的顺序是先贴公式再解释公式最后说结果。这个顺序反了。更好的顺序是先写明白“为什么需要这个模型”再交代模型假设再给出数学表达。比如写第二问先说明“由于第一问已经得到了系统变化规律这里需要辨识参数 k 使得模型曲线与观测数据最接近”然后再贴出目标函数和优化方法。公式不是越复杂越好。如果某个公式只是为了让论文看起来高级而代码里根本没有实现对应计算评阅人一对照就会发现前后不一致这是很大的丢分点。6.2 图表的信息密度A 题论文里的图不要“为了出图而出图”。每一张图都应该回答一个问题。至少从这几个维度检查坐标轴名称是否带单位。图例是否明确线型是否区分。图标题是否解释清楚“这是什么结果”。多图并排时坐标范围是否一致否则视觉上会误导。图片分辨率要够建议直接保存为高分辨率 PNG 或 PDF。不要把命令行里的文本截图当结果图。6.3 结果要回答“所以呢”代码算出了参数论文写“k 0.35”这不算完成。要补一句判断性结论“当 k 超过 0.35 后系统响应速度提升已不明显因此最优控制范围可以控制在 0.30 到 0.35 之间。”每问结果后面都应该是“这说明什么”和“对决策有什么影响”而不是停留在数值本身。A 题的最后一问往往就是让综合判断前面没有积累判断性语言最后很难写出紧密的结论。6.4 时间分配和常见丢分点如果复现时间只有三天我建议这样分配第一个阶段读题、拆问、建模完成所有问题的方法设计和公式推导。第二个阶段代码实现把每一问跑通记录中间结果。第三个阶段验证、补图、写论文重点打磨摘要和结论。常见丢分点包括模型假设前后不一致第一问认为某个量恒定第三问又让它变化。变量符号混乱同一个符号在不同章节代表不同意义。代码结果和论文数值对不上评阅人检查时发现矛盾。没有误差分析拟合类题目结果看起来挺好但没有任何可靠性说明。摘要写得像目录没有把关键结论和数值写出来。如果你是团队作战三个人最好分别盯模型、代码、论文但要每天对齐一次。最怕的是模型的人改了假设代码的人不知道论文的人还在写旧结论。最后留几句实在话2025 国赛 A 题的完整复现最后真正留下来的不是一个能跑的脚本而是一张清晰的解题地图每一问解决什么问题用什么模型代码在哪个模块结果如何验证。把这张地图整理成自己的模板2026 备赛时你会明显感觉到拿到新题不会慌。我更建议先从最近一年的真题开始按上面这套流程完整走一遍不要跳步。第一次很慢没关系慢的时候记住的才是自己的。复现不是做给别人看的是让你在赛场上少踩一次坑。