1. 从一道赛题说起薄利多销背后的数学建模逻辑“薄利多销”这四个字做过生意的人一听就懂——单价压低一点销量冲上去总利润反而更高。但真要把它量化成一套可计算、可验证、可优化的模型很多人就卡住了。2019年E题正是围绕这个经典商业命题展开的数学建模赛题它要求参赛者在给定条件下分析商品定价、销量与利润之间的动态关系并给出最优定价策略。我第一次接触这道题的时候第一反应是“这不就是个二次函数求极值吗”但真正动手才发现里面涉及的需求弹性、成本结构、市场容量上限、价格敏感度等因素远比想象中复杂。这道题的核心价值在于它把一个看似直觉的商业经验转化为一套严谨的数学语言让你能用数据说话而不是拍脑袋定价。这篇文章适合谁看如果你是正在准备数学建模竞赛的学生这道题是一个非常好的练手案例因为它既有明确的数学结构又有丰富的现实背景可以延展。如果你是做电商运营、产品定价或者小本生意的从业者这篇文章里的建模思路同样可以直接迁移到你的日常决策中——哪怕你不写代码理解这套逻辑也能帮你在定价时更有底气。如果你只是对“薄利多销”这个现象背后的数学原理好奇那更好我会尽量用生活化的例子把每个环节讲透。整篇文章我会按照数学建模的完整流程来展开从问题分析、模型假设、变量定义到模型建立、求解、灵敏度分析再到结果验证和常见踩坑点。每个环节我都会说清楚“为什么这么做”以及“不这么做会怎样”让你不仅能看到最终答案更能理解背后的思考过程。2. 问题拆解与模型假设定价问题的核心变量有哪些2.1 薄利多销的数学本质是什么薄利多销的数学本质是利润函数在价格维度上的非单调性。很多人直觉上觉得“降价少赚”但实际上总利润等于单件利润乘以销量而销量本身又是价格的函数。当价格下降带来的销量增长足够大时总利润反而会上升。这就好比一个水池你虽然把出水口关小了一点单件利润降低但进水口开大了很多销量增加最终水池里的水反而更多。用数学语言表达就是设价格为 ( p )销量为 ( Q(p) )单件成本为 ( c )则总利润为[ \Pi(p) (p - c) \cdot Q(p) ]这里的关键在于 ( Q(p) ) 的形式。如果 ( Q(p) ) 是线性的比如 ( Q(p) a - bp )( a, b 0 )那么利润函数就是一个开口向下的二次函数存在唯一的最大值点。这个最大值点对应的价格就是理论上的最优定价。但现实中的需求函数很少是完美线性的。它可能有价格阈值低于某个价格销量暴增、可能有饱和效应价格再低销量也上不去了、还可能受竞争对手定价影响。2019年E题的巧妙之处在于它给出了足够的数据和约束条件让你可以在合理假设下建立一个可求解的模型。2.2 题目给出的条件与隐藏约束根据这道题的典型设定通常会给出以下几类信息商品的成本结构固定成本和可变成本、历史销售数据不同价格下的销量记录、市场容量限制最大可能销量、以及可能的价格区间约束。这些信息看似零散但每一条都对应着模型中的一个参数或约束。我在做题时习惯先把所有已知条件列成一张表然后逐个判断哪些是硬约束必须满足、哪些是软约束尽量满足、哪些是假设条件需要自己合理设定。比如“最大销量不超过市场容量”就是硬约束而“价格不能低于成本”也是硬约束。但“消费者对价格变化的反应是即时的”就是一个需要说明的假设因为现实中可能存在滞后效应。注意很多人在建模时容易忽略约束条件直接对利润函数求导找极值结果算出来的最优价格可能低于成本价或者超过了市场能接受的范围。这种情况在阅卷中会被扣分因为数学上正确不代表商业上合理。2.3 模型假设的合理性与必要性数学建模离不开假设但假设不是随便写的。每一条假设都应该有现实依据并且要说明它对模型结果的影响方向。比如假设需求函数是连续可导的这是为了能用微积分求极值。现实中销量是离散的不可能卖半个商品但当销量基数很大时连续化处理带来的误差可以忽略。假设成本函数是线性的即总成本 固定成本 单位可变成本 × 销量。这个假设在短期生产中比较合理因为厂房、设备等固定投入不随产量变化而原材料、人工等可变成本与产量成正比。假设市场环境不变即不考虑竞争对手调价、季节性波动、政策变化等因素。这是为了把问题聚焦在定价与销量的关系上属于合理的简化。我在实际做题时会在论文中专门用一小节说明“假设的合理性及其局限性”这样既展示了思维的严谨性也为后续的灵敏度分析埋下伏笔。因为如果假设不成立模型结果就会偏而灵敏度分析正是用来回答“假设偏离多少时结论还靠谱”这个问题的。3. 需求函数拟合从数据到曲线的关键一步3.1 为什么需求函数是整个模型的基石整个薄利多销模型的核心就是需求函数 ( Q(p) )。它描述了“价格定在多少时能卖出多少件”。如果这个函数估错了后面算出来的最优价格就是空中楼阁。我见过不少参赛论文直接假设 ( Q(p) a - bp )然后随便给 ( a ) 和 ( b ) 赋个值就开始算这样得出的结论没有任何说服力。正确的做法是利用题目给出的历史销售数据通过回归分析拟合出需求函数的具体形式。如果题目没有直接给数据那就需要根据题目描述中的信息比如“价格每降低1元销量增加约10%”来反推参数。2019年E题通常会提供一组或多组价格-销量数据这就是拟合的依据。3.2 线性需求函数的拟合方法与参数计算假设题目给出了如下一组数据这里用模拟数据说明方法价格元销量件10200121601412016801840观察可以发现价格每增加2元销量减少40件即斜率 ( b 40/2 20 )。用最小二乘法拟合设 ( Q a - bp )代入任意一点当 ( p10 ) 时 ( Q200 )则 ( a 200 20 \times 10 400 )。所以需求函数为[ Q(p) 400 - 20p ]这个函数的含义是当价格为零时理论最大需求为400件即市场容量价格每上涨1元销量减少20件。价格上限为 ( p 20 ) 元超过这个价格就一件也卖不出去了。提示在实际拟合中数据往往不会完美落在一条直线上这时候需要用最小二乘法求回归系数并计算 ( R^2 ) 来判断拟合优度。如果 ( R^2 ) 太低比如低于0.8就要考虑换用非线性函数比如指数函数或幂函数。3.3 非线性需求函数的适用场景线性需求函数虽然简单好用但它有一个明显的缺陷当价格趋近于零时销量会无限增大如果 ( a ) 很大这显然不符合现实。更合理的形式可能是指数衰减型[ Q(p) A e^{-kp} ]这种函数的特点是价格越低销量增长越快但随着价格继续降低销量增长逐渐放缓最终趋近于某个上限。这更符合“薄利多销”的边际递减规律——第一波降价效果最明显后面再降效果就没那么大了。选择哪种函数形式取决于数据的分布特征。如果数据点大致呈直线排列就用线性函数如果数据点呈现明显的弯曲趋势就考虑非线性函数。我在做题时通常会两种都试一下比较拟合优度和预测误差选更合适的那个。3.4 参数估计中的常见陷阱拟合需求函数时有几个坑特别容易踩用错自变量和因变量有人把价格当因变量、销量当自变量来回归这样得到的函数是 ( p(Q) ) 而不是 ( Q(p) )虽然数学上可以转换但直接代入利润函数时容易搞混。忽略数据范围如果历史数据只覆盖了10元到18元的价格区间那你拟合出的函数在这个区间内比较可靠但外推到5元或25元就要非常谨慎。我在论文中会明确标注“模型适用范围”。异常值处理如果某个月份因为促销活动导致销量异常高这个数据点可能会严重扭曲拟合结果。这时候要么剔除异常值要么在模型中引入促销变量。4. 利润最大化求解从公式推导到最优定价4.1 利润函数的构建与求导有了需求函数利润函数就可以直接写出来。假设单位可变成本为 ( c )固定成本为 ( F )则[ \Pi(p) (p - c)(a - bp) - F ]展开后得到[ \Pi(p) -bp^2 (a bc)p - ac - F ]这是一个关于 ( p ) 的二次函数开口向下因为 ( -b 0 )所以存在最大值。对 ( p ) 求导并令导数为零[ \frac{d\Pi}{dp} -2bp (a bc) 0 ]解得最优价格[ p^* \frac{a bc}{2b} ]对应的最优销量为[ Q^* a - b \cdot p^* \frac{a - bc}{2} ]最大利润为[ \Pi^* \frac{(a - bc)^2}{4b} - F ]这套公式非常简洁但每一步都有明确的商业含义。比如 ( a - bc ) 必须大于零否则最优销量为负说明成本太高这个生意根本做不了。4.2 代入具体数值计算最优解继续用前面的例子( a 400 )( b 20 )假设单位成本 ( c 6 ) 元固定成本 ( F 500 ) 元。代入公式[ p^* \frac{400 20 \times 6}{2 \times 20} \frac{400 120}{40} 13 \text{元} ][ Q^* \frac{400 - 20 \times 6}{2} \frac{400 - 120}{2} 140 \text{件} ][ \Pi^* \frac{(400 - 120)^2}{4 \times 20} - 500 \frac{280^2}{80} - 500 980 - 500 480 \text{元} ]也就是说定价13元时卖出140件总利润480元。我们可以验证一下如果定价12元销量为 ( 400 - 240 160 ) 件单件利润6元总利润 ( 160 \times 6 - 500 460 ) 元比480元少。如果定价14元销量为 ( 400 - 280 120 ) 件单件利润8元总利润 ( 120 \times 8 - 500 460 ) 元同样比480元少。所以13元确实是最优的。这个计算过程看起来简单但它揭示了一个重要规律最优价格并不等于成本加上一个固定比例的加成。很多传统商家习惯用“成本加成定价法”比如成本6元就卖12元翻倍但在这个例子中12元并不是最优的13元才能让利润最大化。这就是数学建模的价值所在。4.3 考虑约束条件后的修正现实中的定价往往有约束。比如价格不能低于成本( p \geq c )否则每卖一件都亏钱。价格不能超过市场承受上限( p \leq a/b )否则销量为零。销量不能超过库存或产能( Q(p) \leq Q_{\max} )。如果无约束最优解 ( p^* ) 落在这些约束范围内那它就是可行的。如果落在范围外就需要用拉格朗日乘数法或者直接比较边界值来求条件极值。比如如果 ( p^* 13 ) 但库存最多只能支持100件而13元对应的销量是140件那就卖不了那么多实际能实现的利润就要重新计算。我在做题时习惯画一张图横轴是价格纵轴是利润把无约束的最优点和约束边界都标出来这样一眼就能看出最优解是否可行以及如果不可行应该往哪个方向调整。5. 灵敏度分析模型结果到底有多靠谱5.1 为什么要做灵敏度分析数学建模比赛和实际商业决策中灵敏度分析都是区分“及格”和“优秀”的关键环节。因为模型里的参数都是估计出来的不是精确已知的。如果参数稍微变一点最优价格就大幅偏移那这个模型的实际指导意义就很有限。灵敏度分析就是回答“当某个参数变化±10%时最优价格和最大利润会怎么变”5.2 关键参数的灵敏度计算以单位成本 ( c ) 为例最优价格 ( p^* (a bc)/(2b) )。对 ( c ) 求偏导[ \frac{\partial p^*}{\partial c} \frac{1}{2} ]这意味着单位成本每增加1元最优价格应该上调0.5元。这个结论很有意思成本上涨时不应该把全部成本转嫁给消费者而是自己吸收一半、转嫁一半这样才能保持利润最大化。再来看市场容量 ( a ) 的灵敏度[ \frac{\partial p^*}{\partial a} \frac{1}{2b} ]在这个例子中 ( b 20 )所以 ( a ) 每增加10件最优价格上调0.25元。影响相对较小。最大利润 ( \Pi^* (a - bc)^2/(4b) - F ) 对 ( c ) 的灵敏度更值得关注[ \frac{\partial \Pi^}{\partial c} -\frac{a - bc}{2} -Q^]这个结果非常直观单位成本每增加1元最大利润减少的量正好等于最优销量。因为每卖出一件你就少赚1元而总共卖出 ( Q^* ) 件。5.3 灵敏度分析结果的实际解读把上面的数学结论翻译成商业语言成本上涨时不要全额转嫁给消费者否则销量下降太多反而得不偿失。最优策略是部分转嫁。市场容量扩大时可以适当提价因为需求基础变大了不需要靠低价来冲量。利润对成本的变化非常敏感所以控制成本永远是提升利润最直接的手段。我在论文中通常会用表格展示“参数变化±5%、±10%、±20%时最优价格和最大利润的变化幅度”这样读者可以一目了然地看到哪些参数是“敏感因素”哪些是“不敏感因素”。对于敏感因素在实际决策中就需要重点监控和精确估计。6. 实操复现从零开始跑通整个模型6.1 数据准备与预处理如果你要复现这道题的完整建模过程第一步是整理数据。假设题目给了一张销售记录表包含不同时期的价格和销量。你需要做的是剔除异常数据比如促销期间的极端值。检查数据是否完整缺失值用插值或均值填充。把数据按价格排序方便观察趋势。画散点图直观判断需求函数的形状。这一步看起来简单但实际做题时经常遇到数据格式不统一、单位不一致等问题。我一般会用Python的pandas库做快速清洗几行代码就能搞定。import pandas as pd import numpy as np import matplotlib.pyplot as plt # 假设数据存储为CSV文件 data pd.read_csv(sales_data.csv) data data.sort_values(price) plt.scatter(data[price], data[quantity]) plt.xlabel(Price) plt.ylabel(Quantity) plt.show()6.2 需求函数拟合的代码实现用最小二乘法拟合线性需求函数from scipy.optimize import curve_fit def linear_demand(p, a, b): return a - b * p popt, pcov curve_fit(linear_demand, data[price], data[quantity]) a_fit, b_fit popt print(f拟合结果: a {a_fit:.2f}, b {b_fit:.2f}) # 计算R方 residuals data[quantity] - linear_demand(data[price], *popt) ss_res np.sum(residuals**2) ss_tot np.sum((data[quantity] - np.mean(data[quantity]))**2) r_squared 1 - (ss_res / ss_tot) print(fR方 {r_squared:.4f})如果 ( R^2 ) 低于0.8可以尝试指数拟合def exp_demand(p, A, k): return A * np.exp(-k * p) popt_exp, pcov_exp curve_fit(exp_demand, data[price], data[quantity], p0[400, 0.1])6.3 最优定价的求解与可视化拟合出参数后直接代入公式计算最优价格或者用数值优化方法求解from scipy.optimize import minimize_scalar c 6 # 单位成本 F 500 # 固定成本 def profit(p): Q linear_demand(p, a_fit, b_fit) return -(p - c) * Q F # 取负号因为minimize求最小值 result minimize_scalar(profit, bounds(c, a_fit/b_fit), methodbounded) p_optimal result.x Q_optimal linear_demand(p_optimal, a_fit, b_fit) profit_optimal (p_optimal - c) * Q_optimal - F print(f最优价格: {p_optimal:.2f}元) print(f最优销量: {Q_optimal:.2f}件) print(f最大利润: {profit_optimal:.2f}元)最后画一张利润随价格变化的曲线图标出最优点prices np.linspace(c, a_fit/b_fit, 100) profits [(p - c) * linear_demand(p, a_fit, b_fit) - F for p in prices] plt.plot(prices, profits) plt.axvline(p_optimal, colorr, linestyle--, labelfOptimal Price {p_optimal:.2f}) plt.xlabel(Price) plt.ylabel(Profit) plt.legend() plt.show()这套代码可以直接运行你只需要把数据换成题目给的即可。我在实际比赛中就是用类似的方法快速迭代先跑通基本模型再逐步加入约束和灵敏度分析。7. 常见问题与避坑指南7.1 模型求解中的典型错误问题现象可能原因解决方法最优价格低于成本需求函数拟合错误或约束未加检查 ( a - bc ) 是否大于零加上 ( p \geq c ) 约束利润函数开口向上需求函数斜率符号搞反了确认 ( Q(p) ) 随 ( p ) 增加而减少即 ( b 0 )拟合优度很低函数形式选错了尝试指数函数、幂函数或分段函数灵敏度分析结果异常参数范围设置不合理检查参数变化范围是否超出了模型适用范围7.2 论文写作中的加分技巧图表规范每张图都要有标题、坐标轴标签、单位。不要直接截图放上去要用代码生成高清图。公式编号重要公式要编号方便正文引用。比如“由式(3)可得...”。结果验证除了数学推导最好用数值模拟或实际数据验证一下结论。比如把最优价格代回原数据看看预测销量和实际销量差多少。模型评价专门用一小节讨论模型的优点和缺点。优点比如“计算简单、结论直观”缺点比如“未考虑竞争因素、需求函数形式假设较强”。7.3 我从这道题中学到的经验第一次做这道题时我花了很多时间在拟合需求函数上试了线性、指数、多项式好几种形式最后发现线性模型的 ( R^2 ) 已经达到0.95以上完全够用。这让我意识到不要为了复杂而复杂简单的模型如果能解决问题就是好模型。另外灵敏度分析部分我一开始只做了单参数变化后来发现双参数同时变化比如成本和市场容量同时变动更能说明问题。因为现实中多个因素往往同时变化单独分析一个参数可能会低估风险。还有一个教训是约束条件一定要在建模初期就考虑进去不要等算出结果再检查。我有个同学就是先求无约束最优解结果算出来价格是负数然后回头改模型浪费了很多时间。正确的做法是在建立利润函数时就把 ( p \geq c ) 和 ( Q \leq Q_{\max} ) 写进去用条件极值的方法求解。最后分享一个小技巧如果题目给了多组数据可以分别拟合出不同的需求函数然后比较它们的最优解。如果不同数据得出的最优价格比较接近说明模型稳健性不错如果差异很大就要分析原因可能是数据质量问题也可能是市场环境发生了变化。这种多角度验证的思路在论文中会显得特别有说服力。