用Python和SymPy手把手求解古诺模型:从反应函数到纳什均衡的完整代码实现
用Python和SymPy手把手求解古诺模型从反应函数到纳什均衡的完整代码实现博弈论作为分析决策者互动行为的强大工具在经济学、商业策略甚至计算机科学领域都有广泛应用。而古诺模型作为博弈论中最经典的案例之一完美展示了寡头市场中企业如何通过产量决策相互影响。本文将带你用Python的SymPy库从零开始完整实现古诺模型的推导过程通过代码让抽象的博弈论概念变得触手可及。1. 环境准备与问题建模在开始编码前我们需要明确古诺模型的基本设定。假设市场上有两家企业生产同质产品它们需要同时决定各自的产量q₁和q₂。市场价格由总产量决定采用线性逆需求函数from sympy import symbols, Eq, solve, diff # 定义符号变量 q1, q2, c symbols(q1 q2 c) # q1和q2分别代表两家企业的产量c为常数边际成本 P 8 - (q1 q2) # 市场价格函数企业的利润函数可以表示为收入减去成本。假设两家企业有相同的成本结构边际成本为c# 定义利润函数 profit1 P * q1 - c * q1 # 企业1的利润 profit2 P * q2 - c * q2 # 企业2的利润注意这里我们假设两家企业对称具有相同的成本函数。在更复杂的模型中可以分别设置不同的成本参数。2. 推导反应函数反应函数是古诺模型的核心概念表示一家企业对另一家企业产量的最佳回应。我们需要通过求利润最大化来得到这些函数。2.1 企业1的反应函数对企业1的利润函数关于q₁求导并令其等于零# 求企业1利润对q1的导数 dprofit1_dq1 diff(profit1, q1) # 解一阶条件得到反应函数 reaction1 solve(dprofit1_dq1, q1)[0] print(f企业1的反应函数: q1 {reaction1})输出结果将是企业1的反应函数: q1 (8 - c - q2)/22.2 企业2的反应函数同理我们可以得到企业2的反应函数# 求企业2利润对q2的导数 dprofit2_dq2 diff(profit2, q2) # 解一阶条件得到反应函数 reaction2 solve(dprofit2_dq2, q2)[0] print(f企业2的反应函数: q2 {reaction2})输出企业2的反应函数: q2 (8 - c - q1)/2这两个反应函数表明每家企业的理想产量都随着竞争对手产量的增加而递减这正是古诺模型中策略互动的直观体现。3. 求解纳什均衡纳什均衡是两家企业反应函数的交点即双方同时做出最佳回应的产量组合。我们可以通过解联立方程来找到这个均衡点。# 定义反应函数的方程 eq1 Eq(q1, reaction1) eq2 Eq(q2, reaction2) # 解联立方程 nash_equilibrium solve((eq1, eq2), (q1, q2)) print(f纳什均衡产量: {nash_equilibrium})输出结果将是纳什均衡产量: {q1: (8 - c)/3, q2: (8 - c)/3}这个结果表明在均衡状态下两家企业将生产相同的产量(8-c)/3。当边际成本c2时均衡产量为2单位。4. 可视化反应函数与均衡为了更直观地理解古诺模型我们可以用Matplotlib绘制反应函数和均衡点。假设c2import numpy as np import matplotlib.pyplot as plt # 设定c值 c_value 2 # 定义反应函数的具体形式 def R1(q2, cc_value): return (8 - c - q2)/2 def R2(q1, cc_value): return (8 - c - q1)/2 # 生成数据点 q_range np.linspace(0, 8, 100) q1_vals R1(q_range) q2_vals R2(q_range) # 绘制图形 plt.figure(figsize(8, 6)) plt.plot(q_range, q1_vals, label企业1的反应函数 R1(q2)) plt.plot(q2_vals, q_range, label企业2的反应函数 R2(q1)) # 标记纳什均衡点 eq_q (8 - c_value)/3 plt.scatter([eq_q], [eq_q], colorred, labelf纳什均衡 ({eq_q:.1f}, {eq_q:.1f})) # 添加图形元素 plt.xlabel(q2 (企业2的产量)) plt.ylabel(q1 (企业1的产量)) plt.title(古诺模型反应函数与纳什均衡) plt.legend() plt.grid(True) plt.axis([0, 6, 0, 6]) plt.show()这张图将清晰地展示两条反应函数的直线它们的交点纳什均衡点当一家企业产量为零时另一家企业的最优产量垄断产量5. 模型扩展与敏感性分析基础的古诺模型可以进一步扩展增加更多现实因素。例如我们可以分析边际成本变化对均衡的影响# 分析不同c值对均衡产量的影响 c_values np.linspace(0, 8, 50) equilibrium_q (8 - c_values)/3 plt.figure(figsize(8, 5)) plt.plot(c_values, equilibrium_q) plt.xlabel(边际成本 c) plt.ylabel(均衡产量 q*) plt.title(边际成本对均衡产量的影响) plt.grid(True) plt.show()我们还可以考虑不对称成本的情况即两家企业的边际成本不同c1, c2 symbols(c1 c2) # 重新定义利润函数 profit1_asym (8 - (q1 q2)) * q1 - c1 * q1 profit2_asym (8 - (q1 q2)) * q2 - c2 * q2 # 求反应函数 reaction1_asym solve(diff(profit1_asym, q1), q1)[0] reaction2_asym solve(diff(profit2_asym, q2), q2)[0] # 解纳什均衡 nash_asym solve((Eq(q1, reaction1_asym), Eq(q2, reaction2_asym)), (q1, q2)) print(f不对称成本下的纳什均衡: {nash_asym})这将输出不对称成本下的纳什均衡: {q1: (8 c2 - 2*c1)/3, q2: (8 c1 - 2*c2)/3}这个结果表明成本较低的企业在均衡中会获得更大的市场份额这与商业直觉一致。在实际应用中古诺模型可以帮助我们理解行业中的价格竞争动态新进入者对市场均衡的影响成本变化如何影响市场结构和企业策略政府管制政策可能产生的效果通过这个完整的Python实现我们不仅验证了古诺模型的理论结果还建立了一个可以进一步扩展的分析框架。这种将理论模型转化为可执行代码的方法能够帮助研究者更深入地理解模型假设和预测也为更复杂的博弈分析奠定了基础。