
1. 项目背景与核心价值最近在整理供应链管理领域的经典论文时发现一篇关于竞争零售商渠道策略的研究非常具有实操价值。但论文中的数学模型推导和仿真部分仅给出了结论性描述这对想深入理解模型细节的研究者来说是个遗憾。于是我决定用Mathematica这款强大的符号计算工具完整复现论文中的数学模型和仿真过程。选择Mathematica而非Python或MATLAB主要基于三个考量首先论文中涉及大量符号运算和矩阵推导这正是Mathematica的强项其次Mathematica的交互式笔记本环境非常适合展示数学推导的中间步骤最后其内置的精密绘图功能可以直观呈现不同参数下的策略对比。这个复现项目对供应链管理研究者有三重价值一是可以验证原论文结论的可靠性二是通过调整参数探索模型在不同场景下的表现三是为后续相关研究提供可修改的代码模板。下面我就详细拆解整个复现过程的关键环节。2. 论文模型解析与数学准备2.1 渠道竞争模型框架原论文研究的是两个竞争零售商在双渠道线上线下环境下的定价策略博弈。核心模型包含以下要素需求函数采用线性需求模型其中线上渠道需求受线下价格交叉影响d1[p1_, p2_] : a - b*p1 θ*(p2 - p1) (* 零售商1的需求函数 *) d2[p1_, p2_] : a - b*p2 θ*(p1 - p2) (* 零售商2的需求函数 *)这里a代表市场基数b为价格弹性系数θ是渠道替代参数0θb成本结构假设单位产品成本为c线上渠道额外运营成本为δ利润函数每个零售商的利润是其两个渠道利润之和π1[p1_, p2_] : (p1 - c)*d1[p1, p2] (p1 - c - δ)*d1e[p1, p2]2.2 博弈均衡求解步骤论文采用Stackelberg博弈模型求解过程分为三个阶段建立利润函数方程组求一阶条件FOC方程组解方程组得到均衡价格表达式在Mathematica中实现时特别需要注意(* 求一阶导数时指明变量依赖关系 *) foc1 D[π1[p1, p2], p1] 0 foc2 D[π2[p1, p2], p2] 0 (* 解方程组要指定变量范围 *) equilibrium Solve[{foc1, foc2}, {p1, p2}, Reals]重要提示实际运算中可能会遇到多解情况需要通过经济意义如价格必须大于成本筛选合理解。3. Mathematica实现详解3.1 环境配置与基础设置首先在Mathematica笔记本中做好基础配置(* 初始化清除所有变量 *) ClearAll[Global*] (* 设置计算精度和绘图风格 *) SetOptions[Plot, PlotTheme - Business, ImageSize - Medium]; SetOptions[ContourPlot, ContourShading - None, ContourStyle - Thick];建议创建专门的变量上下文来管理模型参数Begin[ModelParameters]; a 100; (* 市场基数 *) b 0.8; (* 价格弹性 *) θ 0.3; (* 渠道替代率 *) c 20; (* 单位成本 *) δ 5; (* 线上渠道附加成本 *) End[];3.2 核心算法实现博弈均衡求解的完整实现流程定义反应函数react1[p2_] : p1 /. Solve[D[π1[p1, p2], p1] 0, p1][[1]] react2[p1_] : p2 /. Solve[D[π2[p1, p2], p2] 0, p2][[1]]可视化反应曲线观察交点Plot[{react1[p2], react2[p1] /. p1 - p2}, {p2, 30, 70}, PlotLegends - {零售商1, 零售商2}]迭代求解纳什均衡FixedPoint[{(react1[#[[2]]]), react2[#[[1]]]} , {40, 40}, 10]灵敏度分析示例θ参数变化的影响θRange Range[0.1, 0.5, 0.05]; equilibria Table[ θ val; {val, Sequence FixedPoint[...]}, {val, θRange}]; ListPlot[equilibria[[All, {1, 2}]], PlotLabel - 均衡价格随θ变化]3.3 可视化分析技巧Mathematica的强大可视化功能可以帮助深入理解模型利润曲面分析Plot3D[π1[p1, p2], {p1, 30, 70}, {p2, 30, 70}, AxesLabel - {p1, p2, 利润}]参数敏感度热力图Manipulate[ θ currentθ; ContourPlot[π1[p1, p2], {p1, 30, 70}, {p2, 30, 70}, Contours - 20, PlotLabel - 利润等高线 (θ ToString[currentθ] )], {currentθ, 0.1, 0.5}]动态比较静态分析DynamicModule[{a 100, b 0.8, θ 0.3}, Column[{ Slider[Dynamic[a], {50, 150}], Dynamic[Plot[react1[p2] /. {a - a, b - b, θ - θ}, {p2, 30, 70}]] }]]4. 复现过程中的关键挑战4.1 符号计算的精度控制在推导复杂表达式时发现直接使用Simplify可能导致信息丢失。解决方案(* 不好的做法 *) simpleExpr Simplify[complexExpr] (* 推荐做法 *) controlledSimplify[expr_] : FullSimplify[expr, Assumptions - {a 0, b θ 0, p1 c, p2 c}]4.2 多均衡解的筛选当模型参数在临界值附近时可能出现多个数学解。建立筛选逻辑validEquilibrium[sol_] : Select[sol, (p1 c p2 c d1[p1, p2] 0 d2[p1, p2] 0) /. # ]4.3 性能优化技巧当进行大规模参数扫描时采用记忆化技术加速react1[p2_] : react1[p2] (... 原始计算 ...) react2[p1_] : react2[p1] (... 原始计算 ...)对于数值计算部分可以编译为C代码compiledProfit Compile[{{p1, _Real}, {p2, _Real}}, π1[p1, p2], CompilationTarget - C];5. 完整复现案例演示5.1 基准情景分析设置基准参数并计算均衡params {a - 100, b - 0.8, θ - 0.3, c - 20, δ - 5}; eq equilibrium /. params; Print[均衡价格p1, eq[[1,1]], , p2, eq[[1,2]]];输出利润矩阵MatrixForm[{ {π1[eq[[1,1]], eq[[1,2]]], π1[eq[[1,2]], eq[[1,1]]]}, {π2[eq[[1,1]], eq[[1,2]]], π2[eq[[1,2]], eq[[1,1]]]} }]5.2 渠道成本变化分析考察线上渠道成本δ对均衡的影响δValues Range[0, 10, 1]; results Table[ eq equilibrium /. Join[params, {δ - d}]; {d, p1/.eq, p2/.eq, π1[p1,p2]/.eq, π2[p1,p2]/.eq}, {d, δValues}]; ListLinePlot[{ results[[All, {1, 2}]], results[[All, {1, 3}]]}, PlotLegends - {p1, p2}]5.3 策略空间可视化绘制策略组合的利润分布StrategyPlot[retailer_] : ContourPlot[ If[retailer 1, π1[p1, p2], π2[p1, p2]], {p1, 30, 70}, {p2, 30, 70}, ContourLabels - True, PlotLabel - If[retailer 1, 零售商1利润, 零售商2利润]] GraphicsRow[{StrategyPlot[1], StrategyPlot[2]}]6. 实用技巧与经验总结6.1 Mathematica高效使用技巧调试辅助工具(* 显示计算步骤 *) Trace[Solve[foc1, p1]] (* 检查表达式树 *) TreeForm[π1[p1, p2]]版本控制集成(* 配合Git进行版本管理 *) NotebookSave[]; Run[git commit -a -m 更新参数分析部分]文档自动生成(* 为函数添加使用说明 *) react1::usage react1[p2] 计算零售商1对零售商2价格p2的最优反应;6.2 模型扩展方向不对称参数扩展(* 零售商1和2采用不同参数 *) π1asym[p1_, p2_] : (p1 - c1)*d1[p1, p2] (p1 - c1 - δ1)*d1e[p1, p2]多阶段动态博弈(* 引入时间贴现因子 *) profitStream Sum[ρ^t * π1[p1[t], p2[t]], {t, 0, T}]随机需求扩展d1Stochastic[p1_, p2_] : a - b*p1 θ*(p2 - p1) RandomVariate[NormalDistribution[0, σ]]6.3 常见问题解决方案方程无解情况处理Check[Solve[eqns, vars], Print[无可行解尝试数值方法]; FindRoot[eqns, {{p1, c10}, {p2, c10}}], {Solve::nsmet}]提高计算精度SetPrecision[equilibrium, 30]复杂表达式的简化策略step1 Collect[expr, {p1, p2}, Factor] step2 Together / step1通过这个复现项目我深刻体会到Mathematica在经济学模型研究中的独特优势。其符号计算能力可以保持推导过程的数学严谨性而交互式可视化则大大提升了研究效率。建议研究者可以建立自己的模型代码库将常用函数模块化这样后续研究可以直接调用基础组件专注于新问题的探索。