用Python和Matplotlib可视化古诺模型:手把手教你画反应函数与纳什均衡
用Python和Matplotlib可视化古诺模型:手把手教你画反应函数与纳什均衡
在经济学和博弈论中,古诺模型是研究寡头市场竞争行为的经典框架。对于许多初学者来说,理论推导虽然严谨,但缺乏直观感受。本文将带你用Python和Matplotlib,从零开始构建古诺模型的可视化工具,让抽象的经济学概念变得触手可及。
1. 环境准备与基础理论
在开始编码前,我们需要确保环境配置正确并理解基础数学原理。古诺模型描述的是两个寡头企业在产量竞争中的策略互动,每个企业根据对方的产量决策来调整自己的最优产量。
安装必要的Python库:
pip install numpy matplotlib sympy
古诺模型的核心是利润最大化问题。假设两家企业的利润函数分别为:
- 企业1:π₁ = -q₁² - cq₁ - q₁q₂ + 8q₁
- 企业2:π₂ = -q₂² - cq₂ - q₁q₂ + 8q₂
其中c为常数成本参数。通过求导可得反应函数:
- 企业1的反应函数:q₁ = (8 - c - q₂)/2
- 企业2的反应函数:q₂ = (8 - c - q₁)/2
2. 使用SymPy推导反应函数
SymPy是Python的符号计算库,能帮助我们自动完成求导过程:
from sympy import symbols, diff, solve
# 定义符号变量
q1, q2, c = symbols('q1 q2 c')
# 定义企业1的利润函数
profit1 = -q1**2 - c*q1 - q1*q2 + 8*q1
# 对q1求导并求解
reaction1 = solve(diff(profit1, q1), q1)[0]
print(f"企业1的反应函数: q1 = {reaction1}")
# 同理求企业2的反应函数
profit2 = -q2**2 - c*q2 - q1*q2 + 8*q2
reaction2 = solve(diff(profit2, q2), q2)[0]
print(f"企业2的反应函数: q2 = {reaction2}")
运行后会输出与手动推导一致的反应函数表达式。这种方法特别适合更复杂的利润函数形式,避免了人工计算的错误。
3. 可视化反应函数与均衡点
Matplotlib能帮助我们直观展示两条反应函数的交点——纳什均衡。我们先设定c=2,然后绘制图形:
import numpy as np
import matplotlib.pyplot as plt
c = 2 # 成本参数
# 定义反应函数
def r1(q2): return (8 - c - q2)/2
def r2(q1): return (8 - c - q1)/2
# 生成数据点
q_values = np.linspace(0, 8, 100)
r1_values = r1(q_values)
r2_values = r2(q_values)
# 绘制图形
plt.figure(figsize=(8, 6))
plt.plot(q_values, r1_values, label='企业1的反应函数 R1(q2)')
plt.plot(r2_values, q_values, label='企业2的反应函数 R2(q1)')
# 计算并标记纳什均衡点
nash_q = (8 - c)/3
plt.scatter(nash_q, nash_q, color='red', zorder=5)
plt.annotate(f'纳什均衡 ({nash_q:.2f}, {nash_q:.2f})',
(nash_q, nash_q),
xytext=(10, 10),
textcoords='offset points')
plt.title('古诺模型反应函数与纳什均衡')
plt.xlabel('产量 q1')
plt.ylabel('产量 q2')
plt.legend()
plt.grid(True)
plt.show()
这段代码会生成一个清晰的图形,显示两条反应函数直线及其交点。红色圆点标记了纳什均衡位置,此时两家企业的产量均为(8-c)/3。
4. 动态观察成本参数的影响
成本参数c的变化会如何影响均衡?我们可以创建交互式可视化来观察:
from ipywidgets import interact, FloatSlider
def plot_cournot(c=2):
# 计算反应函数
def r1(q2): return (8 - c - q2)/2
def r2(q1): return (8 - c - q1)/2
# 生成数据
q_values = np.linspace(0, 10, 100)
r1_values = r1(q_values)
r2_values = r2(q_values)
# 计算均衡点
nash_q = (8 - c)/3
# 绘图
plt.figure(figsize=(8, 6))
plt.plot(q_values, r1_values, label='R1(q2)')
plt.plot(r2_values, q_values, label='R2(q1)')
plt.scatter(nash_q, nash_q, color='red')
plt.title(f'古诺模型 (c={c})')
plt.xlabel('q1')
plt.ylabel('q2')
plt.legend()
plt.grid(True)
plt.xlim(0, 10)
plt.ylim(0, 10)
plt.show()
interact(plot_cournot, c=FloatSlider(min=0, max=6, step=0.1, value=2))
使用滑块调整c值,可以直观看到:
- 当c增加时,两条反应函数向原点移动
- 纳什均衡点也随之向原点移动
- 均衡产量减少,反映了成本上升对企业生产决策的影响
5. 扩展分析与实际应用
理解了这个基础模型后,我们可以进行多种扩展:
-
不对称成本情况 :两家企业的成本不同时,反应函数会如何变化?
c1, c2 = 2, 3 # 不同的成本参数 def r1(q2): return (8 - c1 - q2)/2 def r2(q1): return (8 - c2 - q1)/2 -
非线性反应函数 :如果利润函数不是二次型,反应函数可能不再是直线
-
多企业扩展 :虽然分析更复杂,但Python可以轻松处理更多企业的模拟
实际应用中,这种可视化方法可以帮助:
- 经济学学生直观理解抽象概念
- 企业战略部门模拟竞争对手行为
- 政策制定者评估市场干预效果
6. 常见问题与调试技巧
在实现过程中可能会遇到以下问题:
问题1 :图形显示不正常
- 检查q_values的范围是否包含均衡点
- 确保反应函数的计算顺序正确
问题2 :SymPy求导结果不符合预期
- 确认利润函数输入正确
- 检查符号变量定义是否完整
问题3 :交互式控件不工作
- 确保在Jupyter Notebook环境中运行
- 检查widgets库是否正确安装
一个实用的调试技巧是分步验证:
# 测试反应函数计算
test_q2 = 2
print(f"当q2={test_q2}时,q1应为{(8-c-test_q2)/2},计算得{r1(test_q2)}")
通过这种从理论到实践的可视化方法,古诺模型不再是纸上谈兵的概念,而成为可以亲手探索和验证的活工具。尝试修改参数或函数形式,你会发现博弈论的世界远比教科书描述的更加丰富多彩。
更多推荐


所有评论(0)