数学建模竞赛实战:从自由泳策略优化看模型构建与求解

发布时间:2026/8/27 10:39:57
数学建模竞赛实战:从自由泳策略优化看模型构建与求解 1. 项目概述一次完整的数学建模竞赛实战复盘最近整理硬盘翻到了2020年参加第九届数学建模国际赛也就是大家常说的“小美赛”时的全套文档和程序。看到“A题自由泳”这个标题当时和队友们一起熬夜推导、编程、争论的场景又历历在目。数学建模比赛尤其是像小美赛这种全英文的国际赛对很多同学来说既是挑战也是绝佳的锻炼机会。它不像纯理论考试更像一个微缩的科研项目从读懂晦涩的题目背景到建立合理的数学模型再到编程求解和撰写一篇逻辑清晰的英文论文每一步都考验着综合能力。今天我就以这道“自由泳”赛题为例抛开那些冠冕堂皇的获奖心得从一个亲历者的角度完整复盘我们当时的解题全过程。我会详细拆解我们是如何理解题目、构建模型、设计算法并最终形成解决方案的。更重要的是我会分享很多在官方优秀论文里看不到的“踩坑”经历和临场决策技巧比如面对模糊的题目描述如何做出合理假设在模型复杂度和求解可行性之间如何权衡以及如何用有限的编程技能实现看起来复杂的算法。无论你是正在备战数模竞赛的新手还是对“数学建模”如何解决实际问题感到好奇的朋友相信这篇来自一线的实战记录都能给你带来一些实实在在的启发和可操作的思路。2. 赛题核心需求与背景解析2.1 题目回顾与问题本质提炼2020年小美赛A题“Freestyle Swimming”自由泳的题目描述大致是关于研究自由泳运动员在比赛中的策略优化问题。题目通常会提供一些背景比如自由泳比赛的成绩取决于运动员的划水频率、划水效果、转身技术以及体力分配等因素。问题可能要求参赛者建立一个数学模型来分析这些因素如何影响最终成绩并据此为运动员提供最优的比赛策略例如在50米、100米、200米等不同赛程中如何分配体力是前程冲刺还是匀速前进如何选择划频以及在转身阶段应采取什么技术动作来最小化总时间。这听起来像是一个典型的优化问题但其核心难点在于如何将抽象的“策略”和“体力”转化为数学模型中可以量化的参数。题目不会给你现成的公式它只会描述现象。我们的首要任务就是进行“问题翻译”。例如“体力分配”不是一个感觉它必须被定义比如用“运动员输出功率随时间的变化函数P(t)”来表示而功率与游泳速度v(t)之间需要通过流体阻力等物理定律建立联系。“划水效果”可能被建模为每次划水提供的推进力与能量消耗之比。因此解题的第一步不是急于列方程而是深度解读题目每一个词背后的物理意义和数学可能性将模糊的自然语言转化为精确的数学语言定义。2.2 核心矛盾与解题突破口识别在明确了问题本质后我们需要识别题目中的核心矛盾这往往是建模的突破口。对于自由泳策略问题至少存在以下几个关键矛盾点速度与能耗的矛盾游得越快单位时间消耗的能量功率越大但可以缩短比赛时间。然而人的体力总能量是有限的。这是一个典型的在总能量约束下最小化总时间的优化问题类似于经典的“最速降线”问题但约束条件更复杂。匀速与变速的策略矛盾是全程保持一个速度匀速策略更优还是先快后慢或先慢后快变速策略更优匀速策略控制简单但可能不是能量利用效率最高的。变速策略需要考虑加速度带来的额外能量消耗克服惯性以及体力衰减的非线性特性。划频与划幅的矛盾在游泳中速度 划频 × 划幅。高划频可能导致动作变形、划幅减小且更易疲劳追求大划幅则可能降低频率。两者如何搭配才能实现给定速度下的能耗最小这需要建立一个关于划频、划幅与推进效率、代谢成本之间关系的子模型。转身环节的损失与收益转身会损失时间减速、触壁、蹬壁但优秀的转身技术可以利用蹬壁获得一个初始高速阶段。如何量化转身的时间损失和蹬壁获得的收益并将其整合到全程模型中是区别于陆地赛跑模型的关键。我们的突破口选择了矛盾1和2作为主模型框架即建立“能量约束下的时间最小化”变分问题。将矛盾3划频划幅优化作为模型中的一个效率系数来处理而矛盾4转身作为分段函数的一个特殊边界条件。这样做的考量是主模型框架经典、牢固易于构建和解释将细节参数化可以避免模型过于复杂而无法求解。在数模竞赛中一个能够求解的近似模型远胜于一个完美但无法处理的复杂模型。3. 数学模型构建与关键假设3.1 模型总体框架设计我们决定采用基于能量动力学的分段优化模型。将泳池长度L例如50米的比赛划分为若干个阶段出发阶段、多个划水周期阶段、转身阶段、最后冲刺阶段。但为了简化我们最终采用了连续模型将转身视为一个瞬时事件该事件前后速度发生跃变并消耗固定能量。模型的核心是两个微分方程运动方程m * dv/dt F_propulsion(v, f, A) - F_drag(v)。其中m是运动员质量v是速度F_propulsion是推进力它是速度v、划频f和划幅A的函数F_drag是水阻力通常与v的平方成正比F_drag 1/2 * ρ * Cd * S * v^2。能量消耗方程dE/dt -P(v, f, A)。总能量E随时间减少减少的速率即代谢功率P它也是v, f, A的复杂函数通常随输出功率增加而超线性增加。我们的优化目标是在总能量E_total的约束下∫ P dt ≤ E_total以及初始和终端位置约束下∫ v dt L寻找最优的速度曲线v*(t)、划频曲线f*(t)和划幅曲线A*(t)使得总时间T最小。这是一个带有状态约束的最优控制问题。3.2 关键假设的设立与理由面对一个开放性问题合理的假设是模型的基石。以下是我们做出的一些关键假设及其理由假设1水阻力系数为常数。实际上Cd阻力系数可能随姿势流线型程度和速度略有变化。但考虑到主要影响因素是速度的平方项且变化范围不大假设为常数是合理的简化能极大降低模型复杂度。假设2推进力与划频、划幅的关系为线性简化。我们假设F_propulsion k * f * A其中k是比例系数代表技术效率。这是一个很强的简化。实际上推进力与f和A的关系可能是非线性的例如存在一个最优划频。我们采用线性模型是基于以下考虑在比赛策略层面我们更关心宏观的体力分配且我们可以通过后续的数值实验让k成为一个与速度相关的“等效效率系数”来隐含地反映非线性。假设3代谢功率P与机械输出功率P_mech的关系为二次函数P α * P_mech β * (P_mech)^2。其中P_mech F_propulsion * v。这是基于生理学的研究肌肉的输出效率随负荷增加而下降能量消耗呈超线性增长。α和β是需要根据文献或数据标定的参数。这个假设比简单的线性关系更符合实际又比复杂的生理模型更易于处理。假设4转身建模为瞬时过程。假设转身时速度从v-瞬间降为0然后通过蹬壁获得一个初始速度v同时消耗固定能量E_turn。v与蹬壁力量有关E_turn包含了减速、转身动作和蹬壁的能量成本。这个假设忽略了转身的具体时间细节但抓住了其对能量和速度状态的关键影响。假设5运动员质量、最大功率等生理参数为常数。忽略比赛中由于脱水导致的微小质量变化以及心理因素对最大输出功率的瞬时影响。注意在论文中必须清晰、单独地列出所有主要假设并简要说明其合理性和对模型可能产生的影响简化了计算但可能忽略了XXX细节。这是评委评估你模型洞察力和严谨性的重要部分。4. 模型求解与算法实现细节4.1 从连续模型到离散优化上述最优控制问题解析求解非常困难涉及变分法或庞特里亚金极大值原理。我们果断选择了数值离散化优化算法的路径。这是竞赛中非常实用的策略。我们将总时间T离散为N个等间隔的时间步长∆t∆t T/N。这样连续的速度曲线v(t)就变成了一个N维向量V [v1, v2, ..., vN]。同理划频f和划幅A也离散为向量F和A。优化变量从函数变成了有限维向量问题转化为一个非线性规划问题。目标函数总时间T实际上T也是变量但我们可以固定N则T N * ∆t优化V、F、A来满足距离约束。约束条件距离约束∑ (vi * ∆t) L。能量约束∑ P(vi, fi, Ai) * ∆t ≤ E_total。动力学约束离散化后的运动方程(vi1 - vi) / ∆t [F_propulsion(vi, fi, Ai) - F_drag(vi)] / m。这个约束实际上定义了vi, fi, Ai之间的关系我们可以选择将其作为等式约束或者更简单地将其融入目标函数——通过调整F和A来产生满足该关系的v。我们采用了后者即将运动方程视为由决策变量F和A确定v的模拟过程。变量的上下界约束速度v有最小值不能为负和最大值生理极限划频和划幅也有合理范围。4.2 编程实现与算法选择我们使用MATLAB作为主要工具因其强大的数值计算和优化工具箱。算法核心流程如下参数初始化设定运动员质量m、阻力系数Cd、泳池长度L、总能量E_total、时间步数N、划频划幅范围等所有物理和生理参数。这些参数值需要从文献或合理估计中获取我们在论文中专门用了一小节进行参数估计和敏感性分析。模拟函数构建编写一个函数[T, E_used, V] simulate(F, A, params)。该函数根据输入的划频向量F和划幅向量A利用离散化的运动方程从前到后递推计算出每一个时间步的速度vi进而计算出总时间T和总能耗E_used。这个函数是连接优化算法和物理模型的桥梁。优化问题定义优化变量是F和A合并为一个2N维的向量X。目标函数是simulate函数返回的T。约束条件包括E_used ≤ E_total以及X本身的上下界约束。优化求解器调用我们使用了MATLAB的fmincon函数求解有约束非线性优化问题。由于变量维度较高2N可能达到几百且问题非凸直接求解容易陷入局部最优。我们采取了以下策略多初始点随机生成多组不同的初始划频划幅策略如匀速策略、先快后慢策略等分别用fmincon求解最后取结果最好的一个。序列优化先优化一个较粗糙的离散化N较小得到粗略的最优策略然后以此作为初始点细化时间步长增大N再次优化。全局搜索辅助在时间允许的情况下尝试结合GlobalSearch或MultiStart算法增加找到全局最优解的概率。转身的处理在simulate函数中当累计游进距离达到泳池长度如50米的整数倍时我们手动重置速度v(i1) v_kick蹬壁后速度并在累计能耗中加上E_turn。这相当于在模拟过程中插入了一个“事件”。4.3 关键代码片段与注释这里分享几个核心的代码思路非完整代码% 1. 模拟函数的核心递推部分 function [total_time, total_energy, velocity_profile] simulate_swimming(stroke_rate, stroke_length, params) % params 结构体包含所有常数m, Cd, rho, S, alpha, beta, E_total, L, v_kick, E_turn, dt N length(stroke_rate); v zeros(N1, 1); % 速度 v(1) params.v_start; % 出发速度 x 0; % 累计距离 E_used 0; lap_count 0; for i 1:N % 计算当前推进力和阻力 F_prop params.k * stroke_rate(i) * stroke_length(i); F_drag 0.5 * params.rho * params.Cd * params.S * v(i)^2; % 计算加速度和下一时刻速度 (欧拉法) a (F_prop - F_drag) / params.m; v(i1) v(i) a * params.dt; % 计算机械功率和代谢功率 P_mech F_prop * v(i); P_meta params.alpha * P_mech params.beta * P_mech^2; E_used E_used P_meta * params.dt; % 更新距离 x x v(i) * params.dt; % 检查是否到达池端考虑转身 if x (lap_count 1) * params.L_pool % 简单处理速度重置为蹬壁速度增加转身能耗 v(i1) params.v_kick; E_used E_used params.E_turn; lap_count lap_count 1; % 注意这里对距离x的处理需要仔细通常设置为刚好到达池端 x lap_count * params.L_pool; end end % 计算总时间可能略超过需要根据最后位置插值 total_time N * params.dt; % 简单估计更精确需处理 total_energy E_used; velocity_profile v; end % 2. 使用fmincon进行优化的主要设置 X0 [ones(N,1)*f_avg; ones(N,1)*A_avg]; % 初始猜测匀速策略 lb [f_min * ones(N,1); A_min * ones(N,1)]; % 下界 ub [f_max * ones(N,1); A_max * ones(N,1)]; % 上界 % 定义非线性约束函数能量约束 function [c, ceq] energy_constraint(X) stroke_rate X(1:N); stroke_length X(N1:end); [~, E_used, ~] simulate_swimming(stroke_rate, stroke_length, params); c E_used - params.E_total; % 非线性不等式约束E_used E_total ceq []; % 无非线性等式约束 end options optimoptions(fmincon, Display, iter, Algorithm, sqp, MaxFunctionEvaluations, 1e5); [X_opt, fval] fmincon((X) objective_func(X, params), X0, [], [], [], [], lb, ub, energy_constraint, options);5. 结果分析与策略解读5.1 数值结果与可视化经过优化求解我们得到了不同赛程50米、100米、200米下的最优速度曲线v*(t)、划频曲线f*(t)和划幅曲线A*(t)。我们将结果进行了可视化速度-时间曲线这是最直观的策略体现。我们发现50米最优策略接近全力冲刺速度曲线在高位略有波动但基本保持高位。因为距离短能量约束不起主导作用最大化平均速度是关键。100米曲线呈现出“快速启动-中段略微调整-末端冲刺”的特征。启动阶段速度迅速提升至接近最高中段因体力消耗速度有轻微下降最后15-20米依靠剩余体力进行冲刺速度有小幅回升。200米策略差异明显。最优策略是“相对平稳的抛物线型”。启动后速度升至一个低于最高速的“巡航速度”并保持相当长一段时间在最后50米才开始明显加速冲刺。这符合能量约束下“保存体力后程发力”的直观认知。划频与划幅曲线有趣的是最优解中的划频和划幅并不是恒定的。在启动和冲刺阶段倾向于稍高的划频配合稳定的划幅以快速产生加速度。在途中游阶段划频略有下降但划幅有所增加或保持这可能是为了维持推进效率降低因高频率带来的额外代谢成本。这为“技术节奏”提供了量化参考。能量消耗速率图我们绘制了代谢功率P(t)的曲线。它清晰地显示在启动和冲刺阶段出现峰值而在途中游阶段维持在一个相对高效平稳的水平。总能耗E_used非常接近但不超过我们设定的E_total这说明优化算法有效地利用了所有可用能量。5.2 模型验证与敏感性分析一个模型如果无法验证就是空中楼阁。我们做了以下几件事与常识和定性数据对比我们将得到的最优速度曲线与公开的顶级运动员比赛分段数据如果能找到进行定性对比。例如我们模型预测的200米自由泳速度曲线形态与菲尔普斯等名将比赛中“前150米稳最后50米冲”的观察是吻合的。这增加了模型的可信度。敏感性分析这是论文的加分项。我们系统性地改变了关键参数如总能量E_total、阻力系数Cd、转身能耗E_turn等观察最优策略和总时间的变化。结果发现总时间T对总能量E_total最敏感呈负相关且边际效益递减能量越多成绩提升越困难。对阻力系数Cd也非常敏感减小Cd改善流线型能显著提升成绩这印证了技术训练的重要性。对转身能耗E_turn的敏感性中等但对于50米短池多次转身其影响权重会增大。这些分析不仅验证了模型的合理性还能衍生出对训练的建议例如在体能训练提升E_total和技术改进降低Cd、E_turn之间后者可能在某些阶段收益更高。6. 参赛全过程的经验、教训与实用技巧6.1 团队分工与时间管理实战我们队采用经典的三角色分工建模手我、编程手、写作手。但实战下来有几点深刻体会切忌流水线作业建模的不懂编程实现难度编程的不理解模型细节写作的最后只能拼凑。我们第二天就陷入了这种僵局。解决方案每天至少三次短会早、中、晚。建模手在提出模型框架后必须立即与编程手沟通可行性估算编程和计算时间。写作手从第一天就开始搭建论文框架并撰写背景、问题重述等部分同时理解模型核心思想。“最小可行模型”先行不要一开始就追求完美的大而全模型。我们花了第一天下午构建了一个复杂的“六阶段模型”结果编程手根本无法在短时间内实现。血的教训在第一天结束前必须建立一个最简单的、能跑通的模型原型比如忽略转身假设匀速。这能快速验证数据流、优化算法是否有效给团队带来信心也为后续迭代打下基础。写作与建模编程同步写作手不是最后两天的“打字员”。他/她需要实时记录建模的假设、决策过程、遇到的困难和解决方案。这些内容是论文“模型建立”部分最鲜活、最有说服力的材料。我们让写作手使用共享文档建模和编程的关键节点、公式、代码截图都随时粘贴进去。6.2 文献检索与参数估计技巧数学建模比赛中的参数不能乱设。我们的经验是优先找综述文献和体育科学教材在知网、Web of Science、Google Scholar上搜索“freestyle swimming energetics”、“drag coefficient swimmer”、“metabolic cost swimming”等关键词。优先选择近十年的综述文章里面常有总结好的参数范围。利用单位与量纲进行合理推测如果实在找不到某个具体参数如运动员的等效横截面积S可以根据公式和已知参数反推。例如已知阻力公式F_drag 1/2 * ρ * Cd * S * v^2可以查找优秀运动员在特定速度下的拖曳力测试数据结合水的密度ρ和估算的Cd反算出S的大致范围。参数设定要有依据并在论文中注明来源例如“运动员质量m取70kg参考成年男性运动员平均体重来源某文献”。“阻力系数Cd取0.6处于业余选手与精英选手之间来源某流体力学研究”。即使有些参数是假设的也要说明其合理性例如“假设转身固定能耗E_turn为全程总能量的5%基于对比赛视频中转身时间占比的估算”。6.3 论文写作与图表呈现心法论文是唯一的输出再好的模型也需要精彩的表达。摘要就是微型论文采用“问题-方法-结果-结论”的结构。第一句点题接着用两三句话概括你们的模型思路创新点然后列出最重要的几个结果用数字例如“模型表明对于200米自由泳采用抛物线型速度策略可比匀速策略节省约0.8秒”最后一句总结模型价值。模型部分要讲“故事”不要直接堆砌公式。按照“总体框架 - 子模块1动力学- 子模块2能量消耗- 子模块3转身处理- 整合与优化问题表述”的逻辑来写。每个公式下面用一两句话解释其物理意义和为什么这样假设。图表务必精美且自明速度曲线图横轴时间/距离纵轴速度。不同赛程的曲线用不同颜色和线型放在同一图中对比。标注出转身点。敏感性分析图可以用雷达图或柱状图展示总时间对不同参数的敏感度。所有图表必须有编号、标题并且标题要体现图表结论如“图3200米自由泳最优速度策略呈现明显的巡航与冲刺两阶段特征”。坐标轴标签、单位、图例必须清晰。优缺点与推广部分要真诚不要只写“模型优点很多缺点很少”。优点具体写1-2个最核心的如将体力分配、技术动作与流体动力学结合。缺点要诚恳地写1-2个关键的如假设代谢功率为二次函数可能过于简化未考虑心理因素和战术干扰并可以简要提出改进方向。推广部分可以延伸到其他周期性耐力运动如自行车、赛跑。6.4 常见“坑点”与应急方案坑点一算法不收敛或结果离谱。可能原因初始值太差约束条件矛盾或太紧离散化步长∆t太大导致数值不稳定目标函数或约束函数有bug除零、NaN。应急方案1) 简化模型先去掉复杂约束如转身验证核心优化是否工作。2) 绘制目标函数随迭代次数的变化图看是否在下降。3) 检查simulate函数的输出手动输入几组简单的F和A看计算出的速度、能量是否在物理常识范围内。4) 尝试不同的优化算法如fmincon内部的interior-point,sqp等。坑点二计算时间过长。可能原因离散化维度N太大目标函数/约束函数计算复杂优化算法设置不当。应急方案1) 降低N先用粗糙网格得到大致策略。2) 对代码进行性能分析MATLAB的Profiler优化循环向量化计算。3) 提供更好的初始值如匀速策略减少迭代步数。坑点三论文来不及写。应急方案提前准备好论文模板LaTeX或Word包括所有预设的章节标题、图表模板、参考文献格式。写作手随时填充内容。最后留出至少6小时进行全文统稿、检查公式编号、图表引用、语法和拼写。摘要和结论一定要留到最后写因为它们需要概括全文。那次小美赛我们最终拿到了不错的奖项但比奖项更珍贵的是这套从混沌问题到清晰解决方案的完整历练。回头看这道“自由泳”题目的价值不在于它模拟得有多精确而在于它逼着我们走完了一个完整的应用数学流程从现实世界抽象出关键矛盾用数学语言进行描述和简化通过计算工具寻找量化解最后再将结果翻译回现实世界的建议。这个过程里技术细节固然重要但团队如何高效协作、如何在压力下做出关键决策、如何清晰地表达复杂思想这些“软技能”往往决定了最终成果的上限。如果你也在准备数模比赛我的建议是找一道往年的赛题不计时间地彻底做一遍把每一步的思考和挣扎都记录下来这比看十篇优秀论文都有用。