用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. 扩展分析与实际应用

理解了这个基础模型后,我们可以进行多种扩展:

  1. 不对称成本情况 :两家企业的成本不同时,反应函数会如何变化?

    c1, c2 = 2, 3  # 不同的成本参数
    def r1(q2): return (8 - c1 - q2)/2
    def r2(q1): return (8 - c2 - q1)/2
    
  2. 非线性反应函数 :如果利润函数不是二次型,反应函数可能不再是直线

  3. 多企业扩展 :虽然分析更复杂,但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)}")

通过这种从理论到实践的可视化方法,古诺模型不再是纸上谈兵的概念,而成为可以亲手探索和验证的活工具。尝试修改参数或函数形式,你会发现博弈论的世界远比教科书描述的更加丰富多彩。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐