# 经济学小白也能懂:用Python可视化生产函数与等产量曲线(附代码)
很多朋友一听到“生产函数”、“边际产出”这些经济学名词,就觉得头大,仿佛回到了大学里被抽象公式和复杂图表支配的课堂。其实,这些概念背后描绘的,正是我们身边无数商业决策的核心逻辑:投入多少资源,能换来多少产出?如何组合不同的生产要素,才能达到最优效率?今天,我们不谈枯燥的数学推导,而是换一种更酷、更直观的方式来学习——用Python代码,亲手把这些抽象的理论“画”出来。
想象一下,你不再需要死记硬背等产量曲线的形状,而是可以调整几个参数,亲眼看着曲线如何随之舞动;你不再需要费力理解边际产出递减的规律,而是可以通过动态图表,清晰地看到每增加一单位劳动,总产量增加的幅度是如何变化的。这篇文章就是为你准备的,无论你是对经济学充满好奇的编程爱好者,还是希望借助工具深化理解的经济学初学者。我们将使用Python中强大的`SymPy`和`Matplotlib`库,从零开始,构建一个可以交互、可以探索的微观经济学可视化实验室。你会发现,当理论遇见代码,一切都会变得清晰而有趣。
## 1. 搭建你的经济学分析环境:从零配置Python到第一个图表
工欲善其事,必先利其器。在开始“画”经济学图表之前,我们需要一个趁手的编程环境。别担心,即便你之前从未写过代码,跟着下面的步骤,也能轻松上手。
### 1.1 核心工具包的选择与安装
我们主要依赖三个Python库,它们各有神通:
* **NumPy**: 它是科学计算的基石,擅长处理数组和矩阵运算。我们会用它来生成一系列平滑的数据点,作为我们绘制曲线的基础。
* **SymPy**: 这是本次探索的“灵魂”。它是一个符号计算库,意味着它可以像我们人类一样处理代数符号,进行求导、解方程等操作,完美契合经济学中各种函数关系的数学表达。
* **Matplotlib**: 这是Python绘图领域的“老大哥”,功能强大且灵活。我们将用它来创建静态的、精美的二维图表,直观展示函数图像。
如果你已经安装了Python(建议版本3.8以上),那么安装这些库只需要一行命令。打开你的终端(Windows上是CMD或PowerShell,Mac/Linux上是Terminal),输入:
```bash
pip install numpy sympy matplotlib
```
> 提示:如果安装速度较慢,可以考虑使用国内的镜像源,例如在命令后添加 `-i https://pypi.tuna.tsinghua.edu.cn/simple`。
安装完成后,我们可以在一个Python脚本或Jupyter Notebook中导入它们,并做一个简单的测试。
```python
# 导入必要的库,并给它们起一个简短的别名,方便后续调用
import numpy as np
import sympy as sp
import matplotlib.pyplot as plt
# 测试SymPy:定义一个符号变量x,并计算x^2的导数
x = sp.symbols('x')
expr = x**2
derivative = sp.diff(expr, x)
print(f"函数 f(x) = {expr} 的导数是:{derivative}")
# 测试Matplotlib:绘制一个简单的正弦函数图像
x_vals = np.linspace(0, 2*np.pi, 100) # 生成0到2π之间的100个点
y_vals = np.sin(x_vals)
plt.figure(figsize=(8, 4))
plt.plot(x_vals, y_vals, label='sin(x)', color='blue', linewidth=2)
plt.title('一个简单的测试图表')
plt.xlabel('x')
plt.ylabel('sin(x)')
plt.grid(True, linestyle='--', alpha=0.7)
plt.legend()
plt.show()
```
如果运行后能看到导数的打印结果和一个正弦波图像,那么恭喜你,环境配置成功!
### 1.2 理解我们的第一个“生产函数”:柯布-道格拉斯形式
在微观经济学中,生产函数描述了从生产要素(如资本K和劳动L)到产出Y的映射关系。最著名、也最常用的形式之一就是**柯布-道格拉斯生产函数**。它的数学表达式非常优雅:
\[ Y = A \cdot K^\alpha \cdot L^\beta \]
这个公式里每个字母都代表一个重要的经济学概念:
* **Y**: 总产出。
* **A**: **全要素生产率**,可以理解为技术水平。A越大,意味着在同样的投入下,能获得更高的产出,代表了技术进步。
* **K**: 资本投入量(如机器、厂房)。
* **L**: 劳动投入量。
* **α** 和 **β**: 分别是资本和劳动的**产出弹性**。它们的经济学含义非常深刻:α表示资本投入增加1%时,产出增加的百分比;β同理。通常假设α + β = 1,表示规模报酬不变。
让我们用SymPy把这个函数“请”到Python里来。
```python
# 定义符号变量:产出Y, 技术水平A, 资本K, 劳动L, 弹性系数alpha, beta
A, K, L, alpha, beta = sp.symbols('A K L alpha beta', positive=True)
# 定义柯布-道格拉斯生产函数
Y = A * K**alpha * L**beta
print("我们定义的生产函数是:")
sp.pprint(Y) # 使用pprint美化打印
```
运行这段代码,SymPy会漂亮地打印出这个公式。接下来,我们可以做一些有趣的计算,比如求**边际产出**。
## 2. 让抽象概念“动”起来:边际产出与技术替代率的可视化
理论部分常说“边际产出递减”,但到底是怎么个“递减”法?图形上如何体现?我们现在就用代码来揭示。
### 2.1 计算与可视化劳动的边际产出
劳动的边际产出(MP_L)是指在其他要素(这里是资本K)投入不变的情况下,增加一单位劳动所带来的总产出的增加量。在数学上,它就是生产函数对劳动L的**偏导数**。
```python
# 使用SymPy计算劳动L的边际产出
MP_L = sp.diff(Y, L)
print("劳动的边际产出(MP_L)表达式为:")
sp.pprint(MP_L.simplify())
# 为了绘图,我们需要将符号表达式转换为数值计算函数
# 假设一些具体的参数值:A=1, K=10固定不变, alpha=0.3, beta=0.7
A_val, K_fixed, alpha_val, beta_val = 1, 10, 0.3, 0.7
# 创建一个关于L的数值函数:Y_num = 1 * 10^0.3 * L^0.7
Y_num_func = sp.lambdify(L, Y.subs({A: A_val, K: K_fixed, alpha: alpha_val, beta: beta_val}), 'numpy')
# 同样创建MP_L的数值函数
MP_L_num_func = sp.lambdify(L, MP_L.subs({A: A_val, K: K_fixed, alpha: alpha_val, beta: beta_val}), 'numpy')
# 生成劳动L的取值范围(从0.1到20,避免0值)
L_vals = np.linspace(0.1, 20, 400)
Y_vals = Y_num_func(L_vals)
MP_L_vals = MP_L_num_func(L_vals)
# 开始绘图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
# 左图:总产出曲线
ax1.plot(L_vals, Y_vals, color='darkorange', linewidth=3, label=f'总产出Y (K固定={K_fixed})')
ax1.set_xlabel('劳动投入 (L)')
ax1.set_ylabel('总产出 (Y)')
ax1.set_title('总产出曲线')
ax1.grid(True, linestyle=':', alpha=0.6)
ax1.legend()
ax1.fill_between(L_vals, Y_vals, alpha=0.2, color='darkorange') # 增加面积填充,更美观
# 右图:边际产出曲线
ax2.plot(L_vals, MP_L_vals, color='royalblue', linewidth=3, label='劳动的边际产出 (MP_L)')
ax2.set_xlabel('劳动投入 (L)')
ax2.set_ylabel('MP_L')
ax2.set_title('边际产出递减规律')
ax2.grid(True, linestyle=':', alpha=0.6)
ax2.legend()
# 在曲线上标注递减趋势
ax2.annotate('MP_L随L增加而下降', xy=(10, MP_L_num_func(10)), xytext=(12, MP_L_num_func(5)),
arrowprops=dict(facecolor='black', shrink=0.05, width=1.5, headwidth=8))
plt.tight_layout()
plt.show()
```
运行这段代码,你会得到并列的两张图。左图的总产出曲线随着劳动增加而上升,但上升的“速度”在变慢。右图的边际产出曲线则清晰地呈现出一条向右下方倾斜的曲线,这就是**边际产出递减规律**的直观体现:在资本投入固定的短期内,不断增加劳动,每新增一单位劳动带来的产出增量会越来越少。
### 2.2 探索要素间的替代关系:等产量曲线与技术替代率
等产量曲线是理解生产者如何在不同要素组合间进行选择的关键工具。它表示能够生产**相同产量**的所有资本(K)和劳动(L)投入的组合。技术替代率(TRS)则是等产量曲线上某一点的斜率绝对值,衡量了在保持产量不变时,一种要素可以替代另一种要素的比率。
我们以柯布-道格拉斯函数为例,推导并绘制一条等产量曲线。
```python
# 假设我们要绘制产量Y_target = 50的等产量曲线
Y_target = 50
# 从生产函数 Y = A * K^alpha * L^beta 中,解出K关于L的表达式(给定Y)
# 即 K = [(Y_target / A) * L^(-beta)]^(1/alpha)
K_expr = ((Y_target / A_val) * L**(-beta_val))**(1/alpha_val)
print(f"当Y={Y_target}, A={A_val}, α={alpha_val}, β={beta_val}时,等产量曲线方程为:")
sp.pprint(K_expr)
# 创建数值函数
K_of_L_func = sp.lambdify(L, K_expr, 'numpy')
# 生成L的取值范围(同样要避开0)
L_vals_for_iso = np.linspace(1, 30, 200)
K_vals_for_iso = K_of_L_func(L_vals_for_iso)
# 计算技术替代率 TRS = MP_L / MP_K
# 首先计算资本的边际产出 MP_K
MP_K = sp.diff(Y, K)
MP_K_num = sp.lambdify((K, L), MP_K.subs({A: A_val, alpha: alpha_val, beta: beta_val}), 'numpy')
MP_L_num = sp.lambdify((K, L), MP_L.subs({A: A_val, alpha: alpha_val, beta: beta_val}), 'numpy')
# 选取等产量曲线上的一个点(例如L=10)来计算TRS
L_point = 10
K_point = K_of_L_func(L_point)
TRS_at_point = MP_L_num(K_point, L_point) / MP_K_num(K_point, L_point)
print(f"\n在等产量曲线点(L={L_point:.1f}, K={K_point:.2f})上:")
print(f" 劳动的边际产出 MP_L = {MP_L_num(K_point, L_point):.4f}")
print(f" 资本的边际产出 MP_K = {MP_K_num(K_point, L_point):.4f}")
print(f" 技术替代率 TRS = MP_L / MP_K = {TRS_at_point:.4f}")
# 绘制等产量曲线
plt.figure(figsize=(9, 6))
plt.plot(L_vals_for_iso, K_vals_for_iso, linewidth=3, color='green', label=f'等产量曲线 (Y={Y_target})')
plt.scatter(L_point, K_point, color='red', s=100, zorder=5, label=f'示例点 ({L_point}, {K_point:.1f})')
plt.xlabel('劳动 (L)')
plt.ylabel('资本 (K)')
plt.title('等产量曲线与技术替代率')
plt.grid(True, linestyle='--', alpha=0.5)
plt.legend()
# 在示例点处绘制切线(近似),其斜率即为 -TRS
# 切线方程:K - K_point = -TRS * (L - L_point)
tangent_L = np.array([L_point - 3, L_point + 3])
tangent_K = K_point - TRS_at_point * (tangent_L - L_point)
plt.plot(tangent_L, tangent_K, 'r--', linewidth=2, label=f'切线 (斜率≈-{TRS_at_point:.2f})')
# 添加标注
plt.annotate(f'TRS ≈ {TRS_at_point:.2f}\n(此处L可替代K的比率)',
xy=(L_point, K_point),
xytext=(L_point+5, K_point+3),
arrowprops=dict(facecolor='black', shrink=0.05))
plt.axis([0, 32, 0, 25]) # 设置坐标轴范围
plt.tight_layout()
plt.show()
```
这张图生动地展示了等产量曲线的形状——向右下方倾斜并凸向原点。曲线上的每一个点(如我们标记的红点)都代表能生产50单位产出的一个资本与劳动组合。该点的切线斜率(的绝对值)就是技术替代率。你可以尝试修改代码中的`Y_target`、`alpha_val`、`beta_val`等参数,观察曲线形状如何变化,直观理解参数的经济学含义。
## 3. 构建交互式探索工具:动态参数调整与三维曲面图
静态图表已经能说明很多问题,但如果能让读者自己动手调整参数,观察图形的即时变化,理解会更加深刻。我们可以利用Matplotlib的简单交互功能,或者为代码添加参数输入接口。
### 3.1 创建可调节参数的生产函数可视化
下面的代码示例展示了如何通过改变几个关键参数,一次性观察它们对生产函数曲面和等产量曲线的影响。虽然这不是一个图形界面滑块,但通过分段运行代码并修改参数,你完全可以获得交互探索的体验。
```python
def plot_production_function_and_contour(A=1.0, alpha=0.4, beta=0.6, output_level=30):
"""
绘制指定参数下的生产函数三维曲面和等产量线投影。
参数:
A: 全要素生产率
alpha: 资本的产出弹性
beta: 劳动的产出弹性
output_level: 要突出显示的等产量线对应的产出水平
"""
# 创建K和L的网格
L_grid, K_grid = np.meshgrid(np.linspace(1, 20, 30), np.linspace(1, 20, 30))
# 计算网格上每一点的产出Y
Y_grid = A * (K_grid ** alpha) * (L_grid ** beta)
fig = plt.figure(figsize=(16, 6))
# 子图1:三维生产函数曲面
ax1 = fig.add_subplot(1, 2, 1, projection='3d')
surf = ax1.plot_surface(L_grid, K_grid, Y_grid, cmap='viridis', alpha=0.8, edgecolor='none')
ax1.set_xlabel('劳动 L')
ax1.set_ylabel('资本 K')
ax1.set_zlabel('产出 Y')
ax1.set_title(f'3D 生产函数曲面\nA={A}, α={alpha}, β={beta}')
fig.colorbar(surf, ax=ax1, shrink=0.5, aspect=10, label='产出 Y')
# 在三维曲面上画一条“等高线”,对应固定的Y值(近似)
# 这里我们找到Y_grid接近output_level的索引,并绘制一条线
try:
# 这是一个简化的可视化,更精确的做法是解方程
from matplotlib import cm
# 使用contour在3D曲面上投影
cset = ax1.contour(L_grid, K_grid, Y_grid, [output_level], colors='r', linewidths=3, offset=0)
ax1.contour(L_grid, K_grid, Y_grid, [output_level], colors='r', linewidths=3)
except:
pass
# 子图2:二维等产量线图(等高线图)
ax2 = fig.add_subplot(1, 2, 2)
# 绘制多条等产量线
contour_levels = [10, 20, output_level, 40, 60]
cp = ax2.contour(L_grid, K_grid, Y_grid, levels=contour_levels, colors='black', linewidths=1.5)
ax2.clabel(cp, inline=True, fontsize=10, fmt='%1.0f')
# 高亮显示我们指定的那条等产量线
cp2 = ax2.contour(L_grid, K_grid, Y_grid, levels=[output_level], colors='red', linewidths=3)
ax2.clabel(cp2, inline=True, fontsize=12, fmt=f'Y={output_level}', colors='red')
ax2.set_xlabel('劳动 L')
ax2.set_ylabel('资本 K')
ax2.set_title('等产量线图(平面投影)')
ax2.grid(True, alpha=0.3)
ax2.set_xlim(1, 20)
ax2.set_ylim(1, 20)
ax2.set_aspect('equal')
plt.tight_layout()
plt.show()
print(f"参数设置:A={A}, α={alpha}, β={beta}")
print(f"当前高亮的等产量线对应产出: Y = {output_level}")
print("--- 尝试修改函数参数,重新运行此单元格,观察图形变化 ---")
# 第一次运行,使用默认参数
plot_production_function_and_contour()
# 你可以注释掉上面的调用,然后取消注释下面的某一行,看看不同参数组合的效果
# plot_production_function_and_contour(A=1.5, alpha=0.5, beta=0.5, output_level=40) # 技术进步,弹性相同
# plot_production_function_and_contour(A=1.0, alpha=0.8, beta=0.2, output_level=30) # 资本密集型技术
```
通过对比不同参数下的三维曲面和等产量线图,你可以直观地看到:
* **A值增大**:整个曲面向上移动,意味着在同样投入下,产出更高。等产量线会整体向原点方向移动(因为用更少的投入就能达到同样产量)。
* **α和β的比例变化**:如果α远大于β(资本弹性高),等产量线会变得更陡峭,表示资本对产出的贡献更大,替代劳动相对困难。
### 3.2 规模报酬的图形化检验
规模报酬是分析所有要素同比例变化时,产出如何变化。我们可以通过计算和绘图来检验一个生产函数是规模报酬递增、不变还是递减。
```python
def check_returns_to_scale(alpha, beta):
"""
检验柯布-道格拉斯函数 Y = K^α * L^β 的规模报酬性质。
并绘制规模扩张路径。
"""
t = sp.symbols('t', positive=True) # 比例因子
K_sym, L_sym = sp.symbols('K L', positive=True)
Y_func = K_sym**alpha * L_sym**beta
# 计算F(tK, tL)
Y_scaled = (t*K_sym)**alpha * (t*L_sym)**beta
# 化简
Y_scaled_simplified = sp.simplify(Y_scaled)
print(f"原生产函数: F(K, L) = K^{alpha} * L^{beta}")
print(f"缩放后: F(tK, tL) = {Y_scaled_simplified}")
print(f" = t^{alpha+beta} * [K^{alpha} * L^{beta}]")
print(f" = t^{alpha+beta} * F(K, L)\n")
# 判断规模报酬
sum_elasticity = alpha + beta
if abs(sum_elasticity - 1.0) < 1e-10:
scale_type = "规模报酬不变"
elif sum_elasticity > 1:
scale_type = f"规模报酬递增 (α+β={sum_elasticity:.2f}>1)"
else:
scale_type = f"规模报酬递减 (α+β={sum_elasticity:.2f}<1)"
print(f"结论: {scale_type}")
# 绘图:展示不同规模下的投入产出路径(假设K/L比例固定)
fig, ax = plt.subplots(1, 2, figsize=(14, 5))
# 左图:总产出随规模t的变化
t_vals = np.linspace(0.5, 3, 100)
# 假设一个初始组合 K0=5, L0=5
K0, L0 = 5, 5
Y0 = K0**alpha * L0**beta
Y_scaled_vals = (t_vals*K0)**alpha * (t_vals*L0)**beta
ax[0].plot(t_vals, Y_scaled_vals, 'b-', linewidth=3, label=f'F(tK, tL)')
# 绘制比较线:如果是规模报酬不变,F(tK, tL) = t * F(K,L)
ax[0].plot(t_vals, t_vals * Y0, 'r--', linewidth=2, label='t * F(K,L) (线性基准)')
ax[0].set_xlabel('规模因子 t')
ax[0].set_ylabel('产出 F(tK, tL)')
ax[0].set_title(f'规模报酬检验: {scale_type}')
ax[0].legend()
ax[0].grid(True, alpha=0.3)
# 右图:在等产量线图中画出规模扩张路径(射线)
L_grid, K_grid = np.meshgrid(np.linspace(1, 15, 20), np.linspace(1, 15, 20))
Y_grid = K_grid**alpha * L_grid**beta
ax[1].contour(L_grid, K_grid, Y_grid, levels=[Y0, Y0*2, Y0*4], colors='gray', linewidths=1, alpha=0.7)
ax[1].clabel(ax[1].contour(L_grid, K_grid, Y_grid, levels=[Y0, Y0*2, Y0*4], colors='gray'), inline=True)
# 画一条从原点出发的射线,表示K/L比例固定
ray_t = np.linspace(0, 3, 50)
ray_L = L0 * ray_t
ray_K = K0 * ray_t
ax[1].plot(ray_L, ray_K, 'orange', linewidth=3, label='规模扩张路径 (固定K/L)')
ax[1].scatter([L0, L0*2, L0*3], [K0, K0*2, K0*3], color='red', s=80, zorder=5)
ax[1].set_xlabel('劳动 L')
ax[1].set_ylabel('资本 K')
ax[1].set_title('等产量线与规模扩张路径')
ax[1].legend()
ax[1].grid(True, alpha=0.3)
ax[1].set_aspect('equal')
ax[1].axis([0, 16, 0, 16])
plt.tight_layout()
plt.show()
# 测试三种情况
print("="*50)
print("场景一:规模报酬不变 (α=0.3, β=0.7)")
check_returns_to_scale(0.3, 0.7)
print("\n" + "="*50)
print("场景二:规模报酬递增 (α=0.6, β=0.6)")
check_returns_to_scale(0.6, 0.6)
print("\n" + "="*50)
print("场景三:规模报酬递减 (α=0.2, β=0.3)")
check_returns_to_scale(0.2, 0.3)
```
运行这段代码,你会看到三组对比鲜明的图表。左图清晰地展示了产出随规模因子t的变化曲线与线性基准线的相对位置,从而直观判断规模报酬类型。右图则显示了在等产量线图中,沿一条固定比例的射线扩张时,如何穿越不同产量的等产量线。如果等产量线之间的距离越来越近(产出翻倍所需的投入比例小于翻倍),则暗示规模报酬递增。
## 4. 超越柯布-道格拉斯:探索其他生产函数形式
柯布-道格拉斯函数虽然经典,但现实世界中的生产技术多种多样。用同样的可视化方法,我们可以轻松探索其他形式的生产函数,比较它们的特性。
### 4.1 里昂惕夫生产函数(固定比例)
这种函数描述的是要素之间完全不能替代的情况,比如一辆汽车需要一个方向盘和四个轮子。其形式为:
\[ Y = A \cdot \min\{\frac{K}{v}, \frac{L}{u}\} \]
其中,u和v是生产一单位产品所需的劳动和资本量。它的等产量线是直角形。
```python
def leontief_production(A, u, v, K_vals, L_vals):
"""计算里昂惕夫生产函数的产出网格。"""
K_grid, L_grid = np.meshgrid(K_vals, L_vals)
# 使用np.minimum进行逐元素最小值计算
Y_grid = A * np.minimum(K_grid / v, L_grid / u)
return K_grid, L_grid, Y_grid
# 设置参数
A_leo = 1.0
u = 2 # 每单位产出需要2单位劳动
v = 1 # 每单位产出需要1单位资本
K_range = np.linspace(0, 10, 100)
L_range = np.linspace(0, 10, 100)
K_g, L_g, Y_g = leontief_production(A_leo, u, v, K_range, L_range)
# 绘制等产量线
plt.figure(figsize=(8, 6))
# 绘制几条等产量线
levels = [1.0, 2.0, 3.0, 4.0]
cp = plt.contour(L_g, K_g, Y_g, levels=levels, colors='darkblue', linewidths=2)
plt.clabel(cp, inline=True, fontsize=10, fmt='Y=%1.1f')
# 标注最优投入比例线 K/L = v/u
plt.plot(L_range, (v/u) * L_range, 'r--', linewidth=2, label=f'最优比例线 K/L = {v}/{u}')
plt.fill_between(L_range, 0, (v/u) * L_range, alpha=0.1, color='red')
plt.xlabel('劳动 (L)')
plt.ylabel('资本 (K)')
plt.title('里昂惕夫生产函数的等产量线(直角形)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.axis('equal')
plt.xlim(0, 10)
plt.ylim(0, 10)
plt.show()
print("里昂惕夫函数特性说明:")
print("- 等产量线呈直角形,顶点在比例线 K/L = v/u 上。")
print("- 在顶点左侧(劳动相对不足),增加劳动能提高产量,资本闲置。")
print("- 在顶点右侧(资本相对不足),增加资本能提高产量,劳动闲置。")
print("- 要素之间完全无法替代,必须按固定比例使用。")
```
### 4.2 常替代弹性(CES)生产函数
这是一种更一般化的形式,允许我们通过一个参数(替代弹性σ)来控制资本和劳动之间的替代难易程度。柯布-道格拉斯函数是它的一个特例。
其形式为:
\[ Y = A \left[ \delta K^{-\rho} + (1-\delta) L^{-\rho} \right]^{-1/\rho} \]
其中,替代弹性 σ = 1 / (1+ρ),δ是分配参数。
```python
def ces_production(A, delta, rho, K_vals, L_vals):
"""计算CES生产函数的产出网格。"""
K_grid, L_grid = np.meshgrid(K_vals, L_vals)
# 避免除零错误,当rho接近0时,CES退化为CD函数,这里用近似处理
if abs(rho) < 1e-10:
# 近似为柯布-道格拉斯: Y = A * K^delta * L^(1-delta)
Y_grid = A * (K_grid ** delta) * (L_grid ** (1-delta))
else:
inner = delta * (K_grid ** (-rho)) + (1-delta) * (L_grid ** (-rho))
Y_grid = A * (inner ** (-1.0/rho))
return K_grid, L_grid, Y_grid
# 绘制不同替代弹性下的等产量线对比
fig, axes = plt.subplots(1, 3, figsize=(18, 5))
param_sets = [
{'rho': 2, 'sigma': 1/(1+2), 'label': '低替代弹性 (σ≈0.33)\n等产量线接近直角'},
{'rho': 0, 'sigma': 1, 'label': '单位替代弹性 (σ=1)\n即柯布-道格拉斯'},
{'rho': -0.5, 'sigma': 1/(1-0.5), 'label': '高替代弹性 (σ=2)\n等产量线更平直'}
]
K_vals = np.linspace(0.5, 5, 100)
L_vals = np.linspace(0.5, 5, 100)
for idx, params in enumerate(param_sets):
rho = params['rho']
sigma = params['sigma']
K_g, L_g, Y_g = ces_production(A=1, delta=0.5, rho=rho, K_vals=K_vals, L_vals=L_vals)
ax = axes[idx]
levels = [1, 2, 3, 4]
cp = ax.contour(L_g, K_g, Y_g, levels=levels, colors='purple', linewidths=2)
ax.clabel(cp, inline=True, fontsize=9)
ax.set_xlabel('劳动 L')
ax.set_ylabel('资本 K')
ax.set_title(params['label'])
ax.grid(True, alpha=0.3)
ax.set_aspect('equal')
ax.set_xlim(0.5, 5)
ax.set_ylim(0.5, 5)
plt.tight_layout()
plt.show()
# 创建一个简单的参数影响对比表
print("\nCES生产函数参数影响对比表")
print("| 参数 ρ | 替代弹性 σ | 等产量线形状特征 | 经济学含义 |")
print("| :--- | :--- | :--- | :--- |")
print("| ρ → +∞ | σ → 0 | 接近直角 (里昂惕夫) | 要素完全不能替代 |")
print("| ρ = 0 | σ = 1 | 规则凸向原点 (柯布-道格拉斯) | 要素替代弹性为1 |")
print("| ρ → -1 | σ → ∞ | 接近直线 | 要素完全替代 |")
```
通过对比这三张图,你可以清晰地看到替代弹性σ如何从根本上改变等产量线的弯曲程度,从而影响生产要素之间的替代关系。这种可视化对比,比任何文字描述都更有力量。
写到这里,我们已经从环境搭建、基础概念可视化,走到了交互探索和不同函数形式的对比。你会发现,原本课本上呆板的图表和公式,在代码的驱动下变成了一个可以任意摆弄的沙盘。你可以随时修改参数,观察曲线的瞬时变化;可以尝试定义你自己的生产函数,看看它的等产量线长什么样。这种“动手学”的过程,不仅能帮你深刻理解经济学原理,更能培养你用计算思维分析问题的能力。下次当你再遇到“边际技术替代率递减”这样的术语时,脑海里浮现的将不再是一行抽象的定义,而是一幅由你自己代码生成的、生动形象的画面。这或许就是技术工具带给学习者的最大礼物:将理解,从被动接收变为主动创造。