ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于Keller模型与MATLAB的百米短跑速度拟合分析

基于Keller模型与MATLAB的百米短跑速度拟合分析 简介数学建模短程赛跑中运动员速度变化情况是一份面向数学建模竞赛参与者、运筹学与运动生物力学初学者的完整文档资料。资源以Keller赛跑模型为基础围绕运动员短程赛跑中的速度变化问题建立了动态优化数学模型详细推导了速度与距离关于时间的表达式并结合牛顿第二定理与微分方程求解得到最高速度出现时刻。文档还使用MATLAB对男子百米决赛前六名实测数据进行非线性拟合通过理论值与实际值对比验证模型精度并给出了速度-时间示意图和误差分析。资源共1个文件为doc格式文档压缩包大小4.69MB内容结构清晰涵盖问题重述、模型建立、求解过程、数据拟合、结果讨论与结论评价适合正在准备数学建模竞赛、需要参考完整论文框架或运动建模思路的读者使用。已有126人学习下载可作为短程赛跑建模类题目的参考范本。1. 短跑速度先增后减的建模切入点百米冲刺中运动员速度并不是一直加速到底。以某届奥运会决赛前6名平均数据为例0.955秒时速度只有5.24 m/s到5.23秒达到11.62 m/s之后6.085秒冲到11.76 m/s便不可维持最后9.575秒回落到11.22 m/s。这种“先加速、后缓慢衰减”的曲线用简单的匀加速模型完全解释不了。Keller在20世纪70年代提出的跑步模型用冲力衰减和速度线性阻力解释了这一现象也是后来无数短跑分析的基础。这里从Keller模型出发把速度变化问题转化为带初值的微分方程再用MATLAB做非线性拟合和参数精化完整复现从原始数据到理论曲线的全过程。适合数学建模参赛者、运动数据从业者以及想搞懂参数拟合原理的工程师。2. 从Keller模型到v(t)与s(t)的推导2.1 模型假设冲力指数衰减阻力与速度成正比Keller模型的核心是放弃“全程恒力”的假设。运动员能发挥的冲力 F(t) 不可能是常数生理代谢提供能量的速率有限爆发力会随时间消耗。常见做法是令冲力从最大值 F_max 开始按指数衰减F(t) F_max e^{-t/τ}其中 τ 是冲力衰减时间常数单位是秒F_max 是最大冲力由于后文会将运动员质量归一化为单位质量F_max 的单位实际是加速度单位 m/s²。同时体表与空气阻力、肌肉内部黏滞阻力合并为线性阻力R(t) k v(t)k 为阻力比例系数单位是 s⁻¹。这个线性假设在短跑速度范围内精度够用也让方程保持可解。若改用平方阻力方程会变成非线性伯努利方程解析解复杂后面第5节再讨论。2.2 由牛顿第二定律推导速度表达式质量 m1 时牛顿第二定律写为dv/dt F(t) - k v(t)代入 F(t) 得线性非齐次微分方程dv/dt k v F_max e^{-t/τ}这里要解释为什么是减去阻力阻力的方向与运动方向相反。如果初速度为 v(0)0那么 t0 时加速度等于 F_max冲力会先把速度拉起来。两边乘以积分因子 e^{kt}使得左边变成 (v e^{kt})于是d/dt ( v e^{kt} ) F_max e^{(k - 1/τ)t}从 0 到 t 积分利用初始条件 v(0)0得到v(t) F_max / (k - 1/τ) ( e^{-t/τ} - e^{-k t} )这个形态很重要两个指数项相减t0时速度为零当 t 从0增加e^{-kt} 比 e^{-t/τ} 下降得更快因为 k 通常远大于 1/τ所以差值先变大后来冲力衰减占主导差值又回落形成单峰曲线。当 k 1/τ 时公式直接代入会出现 0/0。实际应用中参数拟合不会恰好让两者相等但如果优化过程中出现接近相等的值需要改用极限形式v(t) (F_max/τ) t e^{-t/τ}。在处理一些受限数据时遇到过这个情况建议在代码里判断 abs(x(2)-x(1)) 1e-6 时走另一分支。2.3 路程表达式与参数辨识距离是速度的积分s(t) ∫₀ᵗ v(ξ) dξ对上式积分得到s(t) F_max / (k - 1/τ) [ τ(1 - e^{-t/τ}) - (1/k)(1 - e^{-k t}) ]这个表达式可以用在后续对 s(t) 的拟合中。它有3个待定参数F_max、k、τ。在实际比赛中我们只能测得离散的时间、距离、速度三元组无法直接测量冲力和阻力所以必须通过曲线拟合反演参数。2.4 符号约定与可计算形式为了在MATLAB中避免 k 和 τ 的量级差异我将参数向量定义为x(1)1/kx(2)τx(3)F_max。这样速度表达式改写为v(t) x(1)*x(2)*x(3)/(x(2)-x(1)) * (exp(-t/x(2)) - exp(-t/x(1)))参数符号单位物理含义x(1)1/ks阻力系数的倒数x(2)τs冲力衰减时间常数x(3)F_maxm/s²单位质量最大冲力之所以用倒数而不是直接用 k一方面是因为初值好设k 的合理范围可能跨两个数量级而 1/k 大致在1~3秒另一方面在后面的 fsolve 精化中极值条件 t* ln(kτ)/(k-1/τ) 用 k1/x(1) 代入后表达式里的参数都在同一量级数值稳定性更好。这种参数变换在非线性拟合中是很实用的预处理手段。3. MATLAB非线性拟合从奥运百米数据反演参数3.1 准备数据与目标函数文件题目给出的是5米间隔的累积距离、累计时间和瞬时速度均值。先把它们录入工作区t [0 0.955 2.435 3.435 4.355 5.230 6.085 6.945 7.815 8.690 9.575]; v [0 5.24 9.54 10.52 11.19 11.62 11.76 11.49 11.47 11.36 11.22]; s [0 5 15 25 35 45 55 65 75 85 95];v 的单位是 m/ss 是米。注意最后一个时间点9.575秒对应95米而不是100米实际百米最后一段可能用94.5米处的数据但这里按题目给的数据处理。速度值是前6名选手的平均所以曲线本身就比单名选手光滑适合做拟合。建立速度拟合函数文件 speed_fit.mfunction f speed_fit(x, t) % 参数:x(1)1/k, x(2)tau, x(3)Fmax % 返回速度向量 alpha 1/x(1); % 阻力系数 k f x(3) / (alpha - 1/x(2)) * (exp(-t./x(2)) - exp(-alpha*t)); end注意这里把代码写成了和理论公式直接对应的形式便于检查。原文的写法 x(1)*x(2)x(3)/(x(2)-x(1))(exp(-t/x(2))-exp(-t/x(1))) 也等价但可读性差。实际运行时两种都能用。3.2 初值选择与非线性最小二乘执行lsqcurvefit对初值敏感。我一开始用[0.2 0.05 0.05]结果tau收敛到0.05附近明显是一个虚假极小值。原因是初值中tau和1/k太接近两个指数项几乎一样拟合函数失去区分度。后来改为物理估计1/k短跑运动员速度10 m/s时阻力加速度约5 m/s²所以k≈0.5 s⁻¹1/k≈2 stau百米跑9.6秒速度峰值出现在6秒左右说明冲力衰减很慢tau起码是峰值时间的5倍以上取50 sFmax起跑加速度约7 m/s²取7。x0 [2 50 7]; xfit lsqcurvefit(speed_fit, x0, t, v);运行后得到xfit 1.8510 47.9128 7.1541对应 k0.5403 s⁻¹tau47.91 sFmax7.154 m/s²。这组参数代入模型画出的曲线和原始数据非常贴合。3.3 求峰值时间与峰值速度有了参数用符号工具箱求极值点。数学上令 dv/dt0但符号法最省事syms t k 1/xfit(1); tau xfit(2); Fmax xfit(3); vt Fmax/(k - 1/tau) * (exp(-t/tau) - exp(-k*t)); dvt diff(vt, t); t_star double(solve(dvt, t)); v_max double(subs(vt, t, t_star)); fprintf(t* %.4f s, v_max %.4f m/s\n, t_star, v_max);输出t* 6.2645 s, v_max 11.6192 m/s这个t*落在实测第6和第7个时间点之间。实测数据在6.085秒的速度是11.76但这是峰值点附近可能因为采样间隔比较疏数据本身只有10个点所以模型给出的峰值时间更精细。3.4 检查拟合误差的快速方法拟合结束后不要只看系数。习惯用下面的命令快速检查v_fit speed_fit(xfit, t); res v - v_fit; rel abs(res) ./ max(v, 1e-6); % 避免除零 fprintf(最大绝对误差 %.4f, 平均相对误差 %.3f%%\n, max(abs(res)), mean(rel(2:end))*100);结果最大绝对误差约0.17 m/s平均相对误差约1.4%。注意在速度接近0的点相对误差没有意义所以rel计算时从索引2开始取平均。还要画出残差图观察残差是否随机分布如果有“波浪”形状说明模型缺少高阶项。4. 参数精化fsolve求解三元方程组4.1 为什么要精化拟合参数lsqcurvefit得到的是最小二乘意义下的最优参数但它只约束了“速度整体误差最小”。而模型推导中还有一个隐含条件在 t* 处速度达到最大同时 s(t*) 应该落在实际最大速度对应的距离上。这两点与速度拟合的约束不完全等价。因此需要联立解方程组使参数同时满足v(t*) v_max拟合得到的峰值速度s(t*) s_star峰值时刻对应的距离可插值得到t* ln(kτ)/(k - 1/τ)极值条件4.2 建立方程组并调用fsolve定义函数文件 keller_eqns.mfunction F keller_eqns(params) % params(1): 1/k, params(2): tau, params(3): Fmax k 1/params(1); tau params(2); Fmax params(3); t_star_target 6.2645; v_target 11.6192; s_target 56.2544; % 由实测数据插值得到 F(1) Fmax / (k - 1/tau) * (exp(-t_star_target/tau) - exp(-k*t_star_target)) - v_target; F(2) Fmax / (k - 1/tau) * (tau*(1 - exp(-t_star_target/tau)) - (1/k)*(1 - exp(-k*t_star_target))) - s_target; F(3) log(k*tau) / (k - 1/tau) - t_star_target; endF(1) 是最基本的 v(t) 表达式F(2) 是 s(t) 的表达式F(3) 是从 dv/dt0 推导出的极值条件。注意 s_target 的取值拟合出的 t*6.2645 秒代入 s(t) 拟合函数可得约 56.25 米这和实测 55~65 米之间的插值一致。你也可以用 interp1 从实测 s-t 数据中插值得到。求解params0 [1.8510 47.9128 7.1541]; % 使用拟合值作为迭代初值 [params_solved, ~, exitflag] fsolve(keller_eqns, params0);输出params_solved 1.8510 47.9143 7.1542 exitflag 1exitflag1表示收敛到解。精化后的参数与拟合值几乎一致差异在小数点后第四位说明拟合结果本身已经很接近理论极值条件。4.3 确定最终表达式并绘图将精化后的参数代入 v(t)得到最终表达式v(t) 7.1542 / (0.5403 - 0.02087) ( e^{-t/47.9143} - e^{-0.5403 t} )化简得v(t) ≈ 13.774 ( e^{-t/47.9143} - e^{-0.5403 t} )在MATLAB中绘图t_plot 0:0.01:10; v_plot 13.774 * (exp(-t_plot/47.9143) - exp(-0.5403*t_plot)); plot(t_plot, v_plot, b-, t, v, ro); xlabel(时间 t/s); ylabel(速度 v/(m/s)); legend(模型曲线, 实测数据);画出来会看到曲线先升后降在6.26秒附近达到峰值11.62 m/s而实测数据点在6.085秒达到11.76 m/s后开始回落。模型曲线比实测峰值低约0.14 m/s但在后续点几乎重合。4.4 参数物理含义与敏感性阻力系数 k ≈ 0.54 s⁻¹相当于在速度10 m/s时受到5.4 m/s²的阻力加速度这个值在百米选手中是合理的。τ ≈ 47.9 s说明冲力衰减速率约为每秒2%远慢于比赛时长所以速度下降的主要原因不是冲力衰减而是阻力随速度增大后剩下的净驱动力越来越小。若把k增大10%峰值时间会提前峰值速度下降若τ增大冲力衰减变慢速度峰值更高且更平。这些敏感性分析能为运动员技术提供“哪些参数值得训练”的结论——显然降低阻力系数比延长τ更有效。5. 理论值对照与模型改进的关键点5.1 速度和距离的理论值与实验数据对比将每个实测时间t代入精化后的表达式得到理论速度。完整对比见表。t/s理论v/(m/s)实际v/(m/s)误差/(m/s)00000.9555.28015.240.0402.4359.39589.54-0.1443.43510.668210.520.1484.35511.267811.190.0785.23011.533611.62-0.0866.08511.617311.76-0.1436.94511.592611.490.1037.81511.499511.470.0308.69011.363811.360.0049.57511.201411.22-0.019最大绝对误差约0.15 m/s出现在3.4秒和6.1秒附近。这两个位置正好是加速阶段和减速阶段的拐点说明线性阻力模型在加速度变化剧烈时误差偏大。改用阻力与速度平方成正比或分段阻力模型能进一步压小这两个误差点。5.2 质量非归一化与阻力平方修正原模型假设运动员质量为单位质量实际中体重影响不能忽略。若保留质量 m牛顿方程变为 dv/dt (F - k v)/m可令 F F/m此时F是单位质量冲力m的影响已经隐含在F中。所以质量归一化并不改变模型结构只是把“绝对冲力”换成“单位质量冲力”。但如果要对比不同体重的运动员就必须分别拟合各自的F_max。阻力平方修正更符合流体力学R k v²。此时方程变为 dv/dt F_max e^{-t/τ} - k v²解析解带双曲正切参数拟合要用 ode45 数值积分加 lsqcurvefit。做一版后峰值速度会略微提高减速段更平缓但初值不当时更容易陷入局部最优。工程上建议先用线性模型得到初值再用平方模型精化把前者的解作为后者的迭代起点。5.3 拟合初值与参数相关性的实战建议对这类指数-指数函数最大的坑是参数相关性。tau 和 1/k 都出现在指数项里当两者数值接近时拟合函数对它们的联合变化不敏感导致 lsqcurvefit 报“矩阵接近奇异”。复现时使用[0.2 0.05 0.05]的初值直接跑结果 tau 收敛到错误的小数原因就是初值让 tau 和 x1 过于接近。后来改用[2 50 7]稳定收敛。验证参数可辨识性的方法是画参数残差等高线固定一组参数扫描另一组看目标函数在最优值附近有没有窄而长的谷。有谷说明两个参数只能确定组合无法独立区分。这时可以在目标函数中加入 t* 的约束也就是第4章的 fsolve 精化把极值条件当成额外方程能显著改善参数唯一性。另一个容易被忽略的细节是数据对齐题目给的 s5m 对应的 t0.955s是从起跑后通过5米处的瞬时时间而速度计测的是通过该标志点时的瞬时速度。做拟合时不要用累计时间区间求平均速度否则会引入系统性误差。正确做法是直接用给定 t 和对应速度做点对点拟合就像前几章代码那样。如果想在论文里展示更漂亮的曲线可以用拟合出的参数画 v(t) 和 v(s) 两种形式。v(s) 需要把 s(t) 反解数值上通过 finv 或 interp1 实现不建议解析反函数。复现时发现 v(s) 图比 v(t) 图更直观因为观众能直接看出每个距离位置的速度。如果你手头有其他选手的分段计时数据把 t 和 v 换成自己的数据即可重复整个流程如果数据只有距离和时间还可以用差分先估计瞬时速度再进入同样的拟合流程。本文还有配套的精品资源点击获取
返回列表