手把手用Python可视化复平面:动态理解Stein《复分析》中的收敛、曲线与Cauchy定理
用Python动态可视化复平面:从收敛曲线到Cauchy定理的编程实践
复分析作为数学中最优雅的学科之一,其核心概念往往建立在几何直观之上。本文将带领读者通过Python编程,将Stein《复分析》中的抽象数学概念转化为可交互的动态可视化,实现"看见数学"的学习体验。
1. 复平面基础与Python表示
复平面的几何表示是理解复分析的基石。在Python中,我们可以用NumPy数组高效地表示复数集合:
import numpy as np import matplotlib.pyplot as plt # 创建复平面网格 real = np.linspace(-2, 2, 800) imag = np.linspace(-2, 2, 800) Real, Imag = np.meshgrid(real, imag) complex_plane = Real + 1j*Imag复数的基本运算在NumPy中具有向量化实现:
- 加法:
z1 + z2对应平面向量相加 - 乘法:
z1 * z2对应旋转加缩放 - 共轭:
np.conj(z)实现实轴对称
# 复数运算示例 z = 1 + 2j w = 3 - 1j print(f"乘法结果: {z*w}") # (5+5j) print(f"共轭结果: {np.conj(z)}") # (1-2j)可视化复数集合时,常用颜色映射表示相位角,亮度表示模长:
def plot_complex_set(z_set, title): plt.figure(figsize=(10, 8)) plt.imshow(np.angle(z_set), cmap='hsv', extent=[-2, 2, -2, 2], alpha=0.8) plt.colorbar(label='Phase (radians)') plt.title(title) plt.xlabel('Real') plt.ylabel('Imaginary') plt.show() plot_complex_set(complex_plane, "基本复平面")2. 序列收敛与集合拓扑的可视化
Cauchy序列的收敛性是分析学的核心概念。我们可以动态展示不同序列的收敛行为:
def visualize_convergence(sequence_func, max_terms=50): fig, ax = plt.subplots(figsize=(10, 6)) # 生成序列 sequence = sequence_func(max_terms) limit = sequence[-1] # 假设最后一项接近极限 # 绘制收敛过程 for n, z in enumerate(sequence, 1): ax.plot(z.real, z.imag, 'bo', alpha=0.5) ax.plot([z.real, limit.real], [z.imag, limit.imag], 'r-', lw=0.5) ax.set_title(f"n = {n}, z = {z:.4f}") plt.pause(0.2) ax.plot(limit.real, limit.imag, 'ro', markersize=10, label='Limit') plt.legend() plt.show() # 示例:收敛于e^i的序列 visualize_convergence(lambda n: [np.exp(1j*(1-1/k)) for k in range(1, n+1)])集合拓扑概念的可视化对比:
| 集合类型 | 数学定义 | Python判断条件 | 可视化特征 |
|---|---|---|---|
| 开集 | 所有点都是内点 | np.all(np.abs(z - z0) < r) | 边缘虚线 |
| 闭集 | 包含所有极限点 | np.all(np.abs(z - z0) <= r) | 边缘实线 |
| 紧集 | 闭且有界 | np.all((np.abs(z) <= R) & (condition)) | 封闭区域 |
# 开集与闭集对比可视化 open_disc = np.abs(complex_plane - (1+1j)) < 1 closed_disc = np.abs(complex_plane - (-1-1j)) <= 1 plt.figure(figsize=(12, 5)) plt.subplot(121) plt.imshow(open_disc, extent=[-2, 2, -2, 2]) plt.title("开圆盘 |z-(1+i)|<1") plt.subplot(122) plt.imshow(closed_disc, extent=[-2, 2, -2, 2]) plt.title("闭圆盘 |z-(-1-i)|≤1") plt.show()3. 全纯函数与Cauchy-Riemann方程
全纯函数的局部性质可以通过Cauchy-Riemann方程验证。我们实现一个可视化检验工具:
def check_holomorphic(f, z0, delta=1e-5): """验证函数在z0点是否满足Cauchy-Riemann方程""" # 计算偏导数 df_dx = (f(z0 + delta) - f(z0 - delta))/(2*delta) df_dy = (f(z0 + 1j*delta) - f(z0 - 1j*delta))/(2*delta) # Cauchy-Riemann方程:df/dy = i*df/dx cr_diff = df_dy - 1j*df_dx return np.abs(cr_diff) < 1e-6 # 测试函数 def f1(z): return z**2 # 全纯 def f2(z): return np.conj(z) # 非全纯 print(check_holomorphic(f1, 1+1j)) # True print(check_holomorphic(f2, 1+1j)) # False幂级数展开的动态可视化展示收敛半径概念:
def plot_power_series(coeffs, center=0): """绘制幂级数部分和的渐进逼近""" radii = [np.abs(center - (-1+1j)), np.abs(center - (1-1j))] R = min(radii) # 收敛半径估计 fig = plt.figure(figsize=(12, 6)) ax = fig.add_subplot(121, projection='3d') ax2 = fig.add_subplot(122) z_values = center + R * np.exp(1j * np.linspace(0, 2*np.pi, 100)) for N in range(1, len(coeffs)+1): # 计算部分和 partial_sum = np.polyval(coeffs[:N][::-1], (complex_plane - center)) # 3D可视化 ax.clear() ax.plot_surface(Real, Imag, np.abs(partial_sum), cmap='viridis', alpha=0.8) ax.set_title(f"N={N}部分和") # 收敛边界 ax2.clear() ax2.plot(z_values.real, z_values.imag, 'r-', label='收敛圆') ax2.set_title("收敛区域") plt.pause(0.5) plt.show() # 示例:1/(1-z)在单位圆内的展开 plot_power_series(np.ones(20))4. 曲线积分与Cauchy定理验证
复积分沿路径的特性是理解Cauchy定理的关键。我们实现一个通用的复积分计算器:
def complex_integral(f, curve, n_points=1000): """计算函数f沿curve的复积分""" t = np.linspace(0, 1, n_points) z = curve(t) dz = np.gradient(z, t[1]-t[0]) integrand = f(z) * dz return np.trapz(integrand, t) # 定义不同曲线 def unit_circle(t): return np.exp(2j * np.pi * t) def square_path(t): vertices = [1+1j, -1+1j, -1-1j, 1-1j, 1+1j] idx = np.floor(t * 4).astype(int) alpha = t * 4 - idx return (1-alpha) * vertices[idx] + alpha * vertices[idx+1] # 测试不同函数的积分 funcs = { "z^2": lambda z: z**2, "1/z": lambda z: 1/z, "sin(z)": lambda z: np.sin(z) } for name, f in funcs.items(): print(f"{name}沿单位圆的积分:", complex_integral(f, unit_circle))Cauchy定理验证实验设计:
- 选择全纯函数(如f(z) = z²)和非全纯函数(如f(z) = |z|)
- 定义各种闭合曲线(圆、正方形、自定义形状)
- 计算数值积分并与理论值对比
- 可视化积分路径和被积函数
def verify_cauchy_theorem(): # 全纯函数示例 holomorphic_func = lambda z: np.exp(z) non_holomorphic = lambda z: np.abs(z) curves = [unit_circle, square_path] for curve in curves: print(f"\n曲线: {curve.__name__}") print("全纯函数积分:", complex_integral(holomorphic_func, curve)) print("非全纯函数积分:", complex_integral(non_holomorphic, curve)) verify_cauchy_theorem()通过这种交互式编程实践,读者可以直观观察到:
- 全纯函数沿闭合曲线的积分确实为零
- 非全纯函数的积分通常不为零
- 积分值只与曲线环绕的奇点有关(对1/z的情况)
5. 高级可视化与交互应用
为加深理解,我们创建交互式控件探索复变函数性质:
from ipywidgets import interact, FloatSlider @interact def explore_mapping(real_part=FloatSlider(-1, -2, 2, 0.1), imag_part=FloatSlider(-1, -2, 2, 0.1), function=["z^2", "sin(z)", "exp(z)", "1/z"]): z0 = real_part + 1j*imag_part delta = 0.3 # 创建局部网格 real = np.linspace(z0.real - delta, z0.real + delta, 100) imag = np.linspace(z0.imag - delta, z0.imag + delta, 100) Real, Imag = np.meshgrid(real, imag) Z = Real + 1j*Imag # 应用函数 if function == "z^2": W = Z**2 elif function == "sin(z): W = np.sin(Z) elif function == "exp(z): W = np.exp(Z) else: W = 1/Z W[np.abs(Z) < 0.05] = np.nan # 避免奇点 # 绘制映射效果 plt.figure(figsize=(12, 5)) # 原像 plt.subplot(121) plt.scatter(Z.real, Z.imag, c=np.angle(Z), cmap='hsv', alpha=0.6) plt.title("原像平面") # 像 plt.subplot(122) plt.scatter(W.real, W.imag, c=np.angle(W), cmap='hsv', alpha=0.6) plt.title(f"映射后 ({function})") plt.tight_layout() plt.show()保角映射的可视化展示:
def plot_conformal_mapping(f, title): # 创建网格线 x = np.linspace(-2, 2, 21) y = np.linspace(-2, 2, 21) X, Y = np.meshgrid(x, y) Z = X + 1j*Y # 应用映射 W = f(Z) # 绘制 plt.figure(figsize=(10, 8)) # 原网格 plt.subplot(121) for i in range(len(x)): plt.plot(Z.real[i,:], Z.imag[i,:], 'b') plt.plot(Z.real[:,i], Z.imag[:,i], 'r') plt.title("原网格") # 映射后网格 plt.subplot(122) for i in range(len(x)): plt.plot(W.real[i,:], W.imag[i,:], 'b') plt.plot(W.real[:,i], W.imag[:,i], 'r') plt.title(title) plt.show() # 示例映射 plot_conformal_mapping(lambda z: np.exp(z), "指数映射 w = exp(z)") plot_conformal_mapping(lambda z: (z-1)/(z+1), "Möbius变换")这种可视化清晰地展示了全纯函数的保角特性——局部上保持角度不变,仅进行旋转和缩放。
