2026 年美赛和国赛接连逼近,很多大一、大二零基础的同学来问我:数学建模到底怎么准备?要不要先把高数学完?是不是买了《数学模型》就能拿奖?说实话,我在大一时也有同样的困惑,后来真正上手才发现,数学建模国赛更看重的是“三件事”:会不会用常见模型、能不能写出可运行的代码、能不能把结果讲成一篇文章。本文就围绕这三个核心,整理一套零基础也能执行的国赛备赛速成方案,包含环境搭建、Python 代码示例、论文写作逻辑和常见踩坑点,适合刚刚接触数学建模、想在 2026 年国赛中冲奖的同学收藏学习。

1. 数模国赛是什么?零基础为什么也能参加

1.1 国赛的基本形式

全国大学生数学建模竞赛(CUMCM)创办于 1992 年,是全国高校规模最大的基础性学科竞赛之一。比赛一般安排在每年 9 月中旬,从某个周四 18:00 开始,到周日 20:00 结束,共 72 小时。每支队伍由 3 人组成,在三天内完成从审题、建模、求解、验证到撰写论文的全流程。

国赛题目通常分为 A、B、C 三大题:

  • A 题偏物理、工程背景,比如系泊系统设计、高温作业专用服装设计。
  • B 题偏运筹、优化、规划,比如“同心共力”破障、无人机遂行编队飞行。
  • C 题偏数据挖掘、统计建模,比如蔬菜类商品的定价问题、电商平台用户行为分析。

对于零基础同学,第一年最容易上手的是 C 题,因为数据量和建模套路相对固定,对物理直觉要求不高;如果想挑战更高含金量,A、B 题也值得尝试,但需要补充更多背景知识。

1.2 零基础参赛的真相

不少同学被“高数、线代、概率论三件套”吓住,以为学完这些才能比赛。其实国赛更看重的是临场学习能力和建模思维:

  • 常见模型并不需要证明,会用就行。比如层次分析法、灰色预测、线性回归,这些模型有成熟的库和函数,参赛时重点在于“为什么选它”和“参数如何解释”。
  • 论文是最终的评分载体。评委主要通过论文判断你的建模能力,哪怕模型简练,只要逻辑清楚、结果合理、图表规范,依然能拿到不错的奖项。
  • 三天时间非常紧张,不可能从零推导复杂公式。会调用工具、会查资料、会把结果用图呈现出来,反而比死磕证明更重要。

这也是为什么零基础选手只要提前两三个月按踩坑最少的路子准备,完全有机会拿省奖甚至国奖。

1.3 数学建模比赛能带给你什么

比赛本身只是结果,真正有价值的是能力提升:

  • 提出问题并量化的能力,把模糊的现实需求变成可计算的指标。
  • 数据整理和程序实现能力,尤其是 Python 生态下的 pandas、numpy、matplotlib、scikit-learn。
  • 结构化写作能力,国赛论文就是一份小型科研报告。
  • 团队协作能力,三个人需要快速分工、互相核验。

这些能力在后续算法岗实习、科研训练、保研面试中都是加分项。所以即使不冲奖,认真完整地参加一次国赛,收获也很大。

2. 赛前工具与学习环境搭建

2.1 编程语言选什么

数学建模最常用的语言是 MATLAB 和 Python。对于零基础,我更推荐 Python,原因很简单:语法接近自然语言、第三方库丰富、社区资料多、免费安装。MATLAB 在矩阵运算和部分工具箱上很优秀,但正版授权费用高,编程语法对新手也不算友好。

本文后续示例统一使用 Python 3.9+,这也是目前大多数国赛教程和开源代码的常见版本。如果你的电脑安装的是更高版本,比如 Python 3.11 或 3.12,一般也没有问题;个别第三方库如果下载了官方源安装失败,可以使用国内镜像源解决。

2.2 安装 Python 与集成开发环境

Windows 环境建议直接到 Python 官网下载安装包,注意安装时勾选 “Add Python to PATH” 选项。这一步很重要,否则命令行输入 python 会提示找不到命令。

安装完成后,打开命令行验证:

python --version

如果输出类似 Python 3.11.5 的信息,说明安装成功。

代码编辑器推荐使用 VS Code 或 PyCharm。VS Code 轻量、免费,配合 Python 插件后体验很好;PyCharm 对项目管理更顺手,社区版足够使用。另外推荐直接安装 Anaconda,它自带 Python 环境、Jupyter Notebook 和大量科学计算库,对刚入门数据处理非常友好。

2.3 安装常用第三方库

在命令行中执行:

pip install numpy pandas matplotlib scipy scikit-learn sympy

这五个库覆盖了大部分数模场景:

  • numpy:数组和矩阵运算。
  • pandas:表格数据读取、清洗、统计。
  • matplotlib:绘图与可视化。
  • scipy:数值积分、优化、插值、拟合。
  • scikit-learn:回归、分类、聚类等机器学习模型。

如果安装速度慢,可以使用清华镜像源:

pip install numpy pandas matplotlib scipy scikit-learn sympy -i https://pypi.tuna.tsinghua.edu.cn/simple

2.4 论文写作工具

论文建议使用 Word 或 LaTeX。零基础优先选 Word,因为上手快、排版改起来方便;如果队伍里有人会 LaTeX,可以选用 Overleaf 在线编辑,排版效果更专业。国赛论文一般包括摘要、问题重述、模型假设、符号说明、模型建立与求解、模型检验、模型评价与推广、参考文献等部分。

平时练习时建议用 Word 模板固定章节结构,避免比赛时临时摸索。

3. 零基础速成路线:模型、编程、论文三条线并行

零基础备赛最忌讳的是“只看不练”或者“只练编程不写论文”。我建议把时间分成三块:模型体系、编程实现、论文写作,每天三条线都推进一点。

3.1 模型体系:从常用模型库开始

不需要把《数学模型》整本书啃完,优先掌握以下高频模型:

  • 评价类:层次分析法(AHP)、TOPSIS 法、灰色关联分析。
  • 预测类:回归分析、灰色预测 GM(1,1)、时间序列、神经网络。
  • 优化类:线性规划、非线性规划、整数规划、遗传算法。
  • 分类与统计分析:聚类分析、方差分析、主成分分析。

每个模型需要掌握三件事:适合什么问题、输入输出是什么、结果怎么解释。刚开始不需要深究推导,先能套用,再在赛题中体会。

3.2 编程实现:以能跑通为主

编程的核心目标是“把模型变成计算结果”。零基础可以从这几个练习做起:

  • 用 pandas 读 Excel 数据,做缺失值处理和统计描述。
  • 用 matplotlib 画折线图、柱状图、散点图。
  • 用 numpy 实现矩阵运算和简单的线性代数操作。
  • 用 sklearn 调用线性回归、决策树、KMeans 聚类。

每实现一个模型,就输出一个可视化的图和一段结果说明,这和论文写作正好衔接。

3.3 论文写作:从模仿优秀论文开始

写作练习不是最后才做的。建议在备赛第 2 周起,每周选一个精简的小问题,按照“摘要—问题分析—模型建立—模型求解—结果分析”的结构写一篇 3 页左右的短文。重点是训练摘要的写法:把用了什么模型、解决什么问题、得到什么结论浓缩在 500 字以内。

也可以找近几年国赛的获奖论文,看它们的摘要和模型假设怎么组织,先模仿结构,再逐渐形成自己的写作套路。

4. 三个必学入门模型与最小 Python 实现

下面挑选三个适合零基础快速上手的模型,分别对应评价、预测、回归三类问题。每个模型给出最小可运行代码,方便直接复制练习。

4.1 层次分析法(AHP)

层次分析法适合解决评价类问题,比如“三个城市哪个宜居”。它的基本步骤是:

  1. 建立层次结构:目标层、准则层、方案层。
  2. 构造判断矩阵:对各准则两两比较打分。
  3. 计算权重向量和一致性比率,验证打分是否合理。
  4. 按权重归一化得到最终排序。

下面给出简化的 Python 实现,只计算权重和一致性比例:

# 文件路径:example/ahp_demo.py
import numpy as np

# 一致性指标 RI,n 为矩阵阶数
RI = {1: 0, 2: 0, 3: 0.58, 4: 0.9, 5: 1.12,
      6: 1.24, 7: 1.32, 8: 1.41, 9: 1.45}

def ahp_weight(matrix):
    matrix = np.array(matrix, dtype=float)
    n = matrix.shape[0]
    # 特征值分解,取最大特征值
    eig_val, eig_vec = np.linalg.eig(matrix)
    max_eig = max(eig_val.real)
    # 一致性指标 CI
    CI = (max_eig - n) / (n - 1)
    CR = CI / RI[n]
    # 特征向量归一化作为权重
    weight = eig_vec[:, eig_val.real.argmax()].real
    weight = weight / weight.sum()
    return weight, CI, CR

# 示例判断矩阵:3 个准则两两比较
judge_matrix = [
    [1, 3, 5],
    [1/3, 1, 2],
    [1/5, 1/2, 1]
]

w, ci, cr = ahp_weight(judge_matrix)
print("权重:", w)
print("CI =", round(ci, 4), "CR =", round(cr, 4))
if cr < 0.1:
    print("一致性检验通过")
else:
    print("一致性检验不通过,请调整判断矩阵")

运行后可以看到三个准则的权重之和为 1。一致性比率 CR 如果小于 0.1,说明判断矩阵的打分可以接受;否则需要回到原始打分中修改。实际比赛中可以把层次结构、判断矩阵和权重表格全部放进论文,再用这张图直观展示权重。

4.2 灰色预测模型 GM(1,1)

灰色预测适合数据量少、趋势比较平稳的预测问题,比如预测未来三年的用电量。GM(1,1) 的基本思路是对原始数据做累加生成,然后拟合一阶微分方程,最后还原预测值。

# 文件路径:example/gm11_demo.py
import numpy as np

def gm11(x0, predict_len=5):
    x0 = np.array(x0, dtype=float)
    n = len(x0)
    # 累加生成序列
    x1 = x0.cumsum()
    # 构造数据矩阵 B 和向量 Y
    B = np.zeros((n - 1, 2))
    Y = np.zeros((n - 1, 1))
    for i in range(n - 1):
        B[i, 0] = -0.5 * (x1[i] + x1[i + 1])
        B[i, 1] = 1
        Y[i, 0] = x0[i + 1]
    # 最小二乘法求解参数 a, b
    theta = np.linalg.inv(B.T @ B) @ B.T @ Y
    a, b = theta[0, 0], theta[1, 0]
    # 构造预测函数
    x1_pred = np.zeros(n + predict_len)
    x1_pred[0] = x0[0]
    for k in range(1, n + predict_len):
        x1_pred[k] = (x0[0] - b / a) * np.exp(-a * k) + b / a
    # 累减还原
    x0_pred = np.zeros(n + predict_len)
    x0_pred[0] = x0[0]
    for k in range(1, n + predict_len):
        x0_pred[k] = x1_pred[k] - x1_pred[k - 1]
    return x0_pred

# 示例:近 5 年的销售数据
data = [15, 16.2, 17.5, 18.1, 19.3]
pred = gm11(data, predict_len=3)
print("历史与预测值:", pred)

运行后会输出 8 个数值,前 5 个对应历史数据拟合值,后 3 个是预测值。需要注意的是,GM(1,1) 对波动较大的数据预测效果一般,如果原始序列增长太快或呈现明显的周期波动,需要先做数据变换或者换用时间序列模型。

4.3 多元线性回归

回归分析是数据建模中使用频率最高的方法。多元线性回归适合分析多个自变量对一个因变量的影响,并且能给出关系表达式。下面用 scikit-learn 实现:

# 文件路径:example/regression_demo.py
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression

# 构造示例数据:x1 广告投入,x2 促销费用,y 销售额
data = {
    'x1': [1.2, 2.4, 3.1, 4.0, 5.2, 6.1],
    'x2': [2.0, 2.1, 2.8, 3.0, 3.9, 4.2],
    'y':  [3.0, 5.1, 6.2, 7.8, 9.9, 11.5]
}
df = pd.DataFrame(data)

X = df[['x1', 'x2']].values
y = df['y'].values

model = LinearRegression()
model.fit(X, y)

print("截距:", round(model.intercept_, 4))
print("x1 系数:", round(model.coef_[0], 4))
print("x2 系数:", round(model.coef_[1], 4))
# R 方
print("R^2:", round(model.score(X, y), 4))

回归结果中的系数可以直接写成方程:y = 截距 + 系数1 × x1 + 系数2 × x2。R² 越接近 1,说明自变量对因变量的解释能力越强。实际赛题中,需要先用 pandas 读取数据、观察缺失情况和相关性,再决定特征,最后把回归结果画成散点图对比真实值和预测值。

5. 完整实战案例:从数据清洗到结果输出

为了把前面的内容串起来,这里做一个简化版 C 题风格实战:分析商品销量与价格、促销力度的关系,并预测下一阶段销量。本例为教学演示,使用自造数据模拟真实场景。

5.1 问题背景

某电商平台记录了某商品连续 60 天的销量,以及每日价格、促销活动天数、评价数量评分三个因素。我们希望搞清楚哪些因素显著影响销量,并建立预测模型。

5.2 数据准备

创建 sales_data.csv 文件,包含 4 列:

sales,price,promotion,rating
85,12.5,1,4.2
78,13.0,0,4.1
92,11.8,1,4.5
75,13.5,0,4.0
88,12.0,1,4.3

这里只放 5 行作为演示。实际比赛数据量远大于此,但处理流程完全一致。

5.3 数据读取与清洗

# 文件路径:example/case_analysis.py
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

# 读取数据
df = pd.read_csv('sales_data.csv')
print(df.head())

# 查看缺失值
print(df.isnull().sum())

# 简单统计
print(df.describe())

# 绘制销量与价格散点图
plt.scatter(df['price'], df['sales'], alpha=0.7)
plt.xlabel('price')
plt.ylabel('sales')
plt.title('Sales vs Price')
plt.show()

如果数据中存在 NaN,一般有三种处理方式:删除对应行、用均值填充、用前后值插值。国赛数据通常已经比较干净,但仍需要做缺失值检查。

5.4 建立回归模型

# 继续之前的代码
X = df[['price', 'promotion', 'rating']].values
y = df['sales'].values

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

model = LinearRegression()
model.fit(X_train, y_train)

print("系数:", model.coef_)
print("截距:", model.intercept_)

# 预测和评估
y_pred = model.predict(X_test)
print("测试集真实值:", y_test)
print("测试集预测值:", y_pred)

# R^2
print("训练集 R^2:", model.score(X_train, y_train))
print("测试集 R^2:", model.score(X_test, y_test))

5.5 结果输出与可视化

将预测值和真实值画在同一张图上,并保存图片到本地:

plt.figure(figsize=(8, 5))
plt.plot(range(len(y_test)), y_test, 'o-', label='true')
plt.plot(range(len(y_test)), y_pred, 's--', label='pred', color='red')
plt.legend()
plt.title('Test Set Prediction Comparison')
plt.savefig('prediction_result.png', dpi=200)
plt.show()

运行后可以看到真实值和预测值的对比趋势。论文中可以放这张图,并在图下方用一句话说明误差范围,比如“测试集 R² 达到 0.85 以上,模型能够较准确地拟合销量变化趋势”。

5.6 能不能直接套用模板

这个案例虽然简单,但流程非常完整:读数据—清洗—建模—评估—出图。遇到任何 C 题,都可以先按这个流程跑通,再根据具体目标替换模型和可视化方式。模板的价值不是替你思考,而是让你在比赛第一天不慌。

6. 备赛常见问题与排查思路

零基础备赛时遇到的坑主要集中在环境、数据、代码和论文四个方面。下面整理一个排查清单。

问题现象 常见原因 解决思路
pip 安装包失败 网络原因或版本冲突 使用清华镜像源,或升级 pip 后再试
导入 pandas/numpy 报错 未安装对应库或者 Python 版本不匹配 重新 pip install pandas numpy ,检查 Python 位数
中文乱码 文件编码不是 UTF-8 或中文字体缺失 读取时指定 encoding='utf-8' ,绘图时指定中文字体
绘制中文标题显示方框 matplotlib 默认没有配置中文字体 添加 plt.rcParams['font.sans-serif'] = ['SimHei']
数据有缺失值但没报错 pandas 默认很多操作会忽略 NaN 主动调用 isnull() 查看缺失情况
回归 R² 特别低 选择特征不合理或变量关系不是线性的 绘制相关性图,尝试加入多项式特征或换模型
GM(1,1) 预测值偏差大 数据波动大、增长过快 先做平滑或差分处理,选择合适长度
计算结果与队友不一致 环境库版本不同或未设置随机种子 统一 Python 版本,设置 random_state=42
论文生成 PDF 时图表模糊 图片分辨率过低 savefig(dpi=200) ,输出前检查图片清晰度

下面重点解释两个高频问题。

6.1 matplotlib 中文乱码

如果你用代码画图,标题里带中文,很可能显示为方框。解决办法是在代码开头加上:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

axes.unicode_minus 设置为 False,是为了避免负号显示异常。如果系统上没有 SimHei 字体,可以换成系统里实际存在的中文字体。

6.2 数据处理时版本不同导致的差异

同样一段代码,在不同电脑上运行,结果可能不完全一样。主要原因是 pandas、scikit-learn 版本不同,以及随机数种子不同。团队赛前统一约定:

  • 统一 Python 版本和依赖库版本,建议用 requirements.txt 记录。
  • 所有涉及随机性的算法,固定 random_state=42
  • 导出计算结果时,保留小数点位数并统一单位。

这样可以避免三个人计算结果不一致的问题。

7. 国赛实战经验与最佳实践

7.1 赛前 3 个月的每周安排

如果从现在开始准备,可以把时间分为三个阶段:

  • 第 1 个月:完成 Python 基础 + 三个入门模型,每周至少运行一个完整示例代码。
  • 第 2 个月:做 2 道历年赛题真题,重点训练读题、数据分析和模型选型。
  • 第 3 个月:写 3 篇完整的小论文,练习摘要、排版和团队配合。

团队三个人建议各有侧重:一人主要负责建模推导与模型选型,一人主要负责代码实现和数据可视化,一人主要负责论文写作和排版,但每个人都要能看懂代码和结果,避免出现“写论文的人不知道结果怎么来的”问题。

7.2 比赛期间的节奏控制

72 小时看起来很长,实际非常紧张。建议按下面的节奏推进:

  • 第一天晚上 18:00 到 23:00:选题,把每道题都浏览一遍,选择最熟悉或数据最充分的题。
  • 第二天一天:集中建模和代码实现,白天产出第一版结果,晚上开始写论文的前半部分。
  • 第三天上午:补充模型检验和灵敏度分析,下午完善论文后半部分,晚上统一排版,反复检查摘要。
  • 最后 3 小时:只做格式校验、提交材料检查,不再新开模型。

记住一个原则:论文永远比模型重要。三天里最晚第二天下午必须动笔写论文,否则最后容易来不及。

7.3 模型假设和检验不要省

评委会看你的模型是否合理。论文里,模型假设最好写 4 到 6 条,每条都要简洁明确。模型建立后,建议补充灵敏度分析或者误差分析。比如线性回归模型,可以画出残差图,检查残差是否随机分布;优化模型可以调整参数,观察目标函数变化是否稳定。

这些内容不需要多高深,关键是表明你思考过模型的适用范围和局限性。

7.4 数据安全与引用规范

使用外部数据时,要在论文中注明数据来源。如果题目附带数据文件,要保证提交时文件完整。比赛过程不要使用非法获取的数据,也不要抄袭他人论文中的大段文字。国赛对论文查重和代码查重有一定要求,所有内容尽量自己写、自己跑、自己描述。

7.5 代码和文件的工程化管理

建议在比赛开始后立刻建立如下目录结构:

2026_guosai/
|-- data/          # 题目原始数据和清洗后数据
|-- code/          # 所有代码文件,按模块编号
|-- fig/           # 生成的图片
|-- paper/         # 论文相关文档和输出 PDF
|-- README.md      # 团队分工和每天工作记录

每天结束前,由负责代码的同学把代码和数据备份一次。可以用网盘或 Git 仓库,防止电脑崩溃导致资料丢失。

8. 总结与接下来的学习安排

这篇文章主要集中在零基础最需要关注的三个面:常用模型、Python 实现、论文写作。通过层次分析法、灰色预测、线性回归三个示例,你应该能体会到数学建模并不是遥不可及的“高深数学”,而是一套把问题数字化、用工具求解、再讲清楚结果的完整流程。

下一步建议你按顺序做四件事:

  1. 搭建好 Python 环境,跑通文章中的三个代码示例;
  2. 找一道近两年的 C 题真题,用 pandas 完成数据读取和清洗;
  3. 学习一篇获奖论文的摘要写法,自己模仿写一版;
  4. 组织队伍做一次 72 小时模拟赛,完整走一遍流程。

备赛过程中遇到报错或模型选择困难是很正常的,把每一次错误记录下来,对照本文的排查清单逐步解决。等到真正进入 2026 年国赛考场时,你会发现自己已经从“零基础小白”变成了“能完赛、能写论文、能复盘”的成熟参赛选手。如果本文对你有帮助,欢迎收藏备用,也欢迎在评论区交流你的备赛进度和遇到的问题。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐