Python实例题:Python计算复变函数

目录

Python实例题

题目

代码实现

实现原理

复数运算:

函数可视化:

积分计算:

解析函数分析:

关键代码解析

1. 复数运算

2. 函数可视化

3. 积分计算

4. 解析函数分析

使用说明

安装依赖:

基本用法:

示例输出:

扩展建议

增强功能:

用户界面:

性能优化:

教学辅助:

Python实例题

题目

Python计算复变函数

代码实现

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
import sympy as sp
from scipy import integrate

class ComplexAnalysis:
    """复变函数分析类,支持复数运算、复变函数可视化和积分计算"""
    
    def __init__(self):
        """初始化分析器"""
        self.z = sp.Symbol('z')
        self.x = sp.Symbol('x')
        self.y = sp.Symbol('y')
        
    def complex_add(self, z1, z2):
        """
        复数加法
        
        参数:
            z1: 第一个复数
            z2: 第二个复数
            
        返回:
            complex: 复数和
        """
        return z1 + z2
    
    def complex_subtract(self, z1, z2):
        """
        复数减法
        
        参数:
            z1: 第一个复数
            z2: 第二个复数
            
        返回:
            complex: 复数差
        """
        return z1 - z2
    
    def complex_multiply(self, z1, z2):
        """
        复数乘法
        
        参数:
            z1: 第一个复数
            z2: 第二个复数
            
        返回:
            complex: 复数积
        """
        return z1 * z2
    
    def complex_divide(self, z1, z2):
        """
        复数除法
        
        参数:
            z1: 被除数
            z2: 除数
            
        返回:
            complex: 商
        """
        if z2 == 0:
            raise ValueError("除数不能为零")
        return z1 / z2
    
    def complex_pow(self, z, n):
        """
        复数幂运算
        
        参数:
            z: 底数
            n: 指数
            
        返回:
            complex: 幂结果
        """
        return z ** n
    
    def complex_exp(self, z):
        """
        复指数函数
        
        参数:
            z: 复数
            
        返回:
            complex: e^z
        """
        return np.exp(z)
    
    def complex_log(self, z):
        """
        复对数函数(主值)
        
        参数:
            z: 复数
            
        返回:
            complex: Log(z)
        """
        return np.log(z)
    
    def complex_sin(self, z):
        """
        复正弦函数
        
        参数:
            z: 复数
            
        返回:
            complex: sin(z)
        """
        return np.sin(z)
    
    def complex_cos(self, z):
        """
        复余弦函数
        
        参数:
            z: 复数
            
        返回:
            complex: cos(z)
        """
        return np.cos(z)
    
    def complex_tan(self, z):
        """
        复正切函数
        
        参数:
            z: 复数
            
        返回:
            complex: tan(z)
        """
        return np.tan(z)
    
    def complex_sqrt(self, z):
        """
        复平方根函数(主值)
        
        参数:
            z: 复数
            
        返回:
            complex: sqrt(z)
        """
        return np.sqrt(z)
    
    def modulus(self, z):
        """
        复数模长
        
        参数:
            z: 复数
            
        返回:
            float: 模长
        """
        return np.abs(z)
    
    def argument(self, z):
        """
        复数辐角(主值,范围(-π, π])
        
        参数:
            z: 复数
            
        返回:
            float: 辐角
        """
        return np.angle(z)
    
    def polar_to_rectangular(self, r, theta):
        """
        极坐标转直角坐标
        
        参数:
            r: 模长
            theta: 辐角
            
        返回:
            complex: 对应的复数
        """
        return r * (np.cos(theta) + 1j * np.sin(theta))
    
    def rectangular_to_polar(self, z):
        """
        直角坐标转极坐标
        
        参数:
            z: 复数
            
        返回:
            tuple: (模长, 辐角)
        """
        return (self.modulus(z), self.argument(z))
    
    def plot_complex_function(self, f, x_range=(-2, 2), y_range=(-2, 2), num_points=100):
        """
        绘制复变函数的模长和相位
        
        参数:
            f: 复变函数(接受复数输入并返回复数输出)
            x_range: x轴范围,默认为(-2, 2)
            y_range: y轴范围,默认为(-2, 2)
            num_points: 每个维度的采样点数,默认为100
        """
        x = np.linspace(x_range[0], x_range[1], num_points)
        y = np.linspace(y_range[0], y_range[1], num_points)
        X, Y = np.meshgrid(x, y)
        Z = X + 1j * Y
        
        # 计算函数值
        F = np.vectorize(f)(Z)
        
        # 计算模长和相位
        modulus = np.abs(F)
        phase = np.angle(F)
        
        # 创建图形
        fig = plt.figure(figsize=(15, 10))
        
        # 绘制模长的3D图
        ax1 = fig.add_subplot(221, projection='3d')
        surf1 = ax1.plot_surface(X, Y, modulus, cmap=cm.coolwarm,
                                linewidth=0, antialiased=True)
        ax1.set_title('函数模长 |f(z)|')
        ax1.set_xlabel('Re(z)')
        ax1.set_ylabel('Im(z)')
        ax1.set_zlabel('|f(z)|')
        fig.colorbar(surf1, ax=ax1, shrink=0.5, aspect=5)
        
        # 绘制相位的3D图
        ax2 = fig.add_subplot(222, projection='3d')
        surf2 = ax2.plot_surface(X, Y, phase, cmap=cm.hsv,
                                linewidth=0, antialiased=True)
        ax2.set_title('函数相位 arg(f(z))')
        ax2.set_xlabel('Re(z)')
        ax2.set_ylabel('Im(z)')
        ax2.set_zlabel('arg(f(z))')
        fig.colorbar(surf2, ax=ax2, shrink=0.5, aspect=5)
        
        # 绘制模长的等高线图
        ax3 = fig.add_subplot(223)
        contour1 = ax3.contourf(X, Y, modulus, 20, cmap=cm.coolwarm)
        ax3.set_title('模长等高线图')
        ax3.set_xlabel('Re(z)')
        ax3.set_ylabel('Im(z)')
        fig.colorbar(contour1, ax=ax3)
        
        # 绘制相位的等高线图
        ax4 = fig.add_subplot(224)
        contour2 = ax4.contourf(X, Y, phase, 20, cmap=cm.hsv)
        ax4.set_title('相位等高线图')
        ax4.set_xlabel('Re(z)')
        ax4.set_ylabel('Im(z)')
        fig.colorbar(contour2, ax=ax4)
        
        plt.tight_layout()
        plt.show()
    
    def complex_integral(self, f, a, b, num_points=1000):
        """
        计算复变函数沿实轴的积分
        
        参数:
            f: 复变函数(接受复数输入并返回复数输出)
            a: 积分下限(复数)
            b: 积分上限(复数)
            num_points: 积分采样点数,默认为1000
            
        返回:
            complex: 积分结果
        """
        if not np.isreal(a) or not np.isreal(b):
            raise ValueError("目前仅支持沿实轴的积分")
        
        # 定义实值积分函数
        def real_integrand(t):
            return np.real(f(t))
        
        def imag_integrand(t):
            return np.imag(f(t))
        
        # 计算实部和虚部的积分
        real_integral, _ = integrate.quad(real_integrand, a, b)
        imag_integral, _ = integrate.quad(imag_integrand, a, b)
        
        return real_integral + 1j * imag_integral
    
    def check_cauchy_riemann(self, u_expr, v_expr, x, y):
        """
        检查柯西-黎曼方程是否满足
        
        参数:
            u_expr: 实部函数表达式(sympy表达式)
            v_expr: 虚部函数表达式(sympy表达式)
            x: sympy符号,表示实部变量
            y: sympy符号,表示虚部变量
            
        返回:
            dict: 包含偏导数和柯西-黎曼方程检查结果的字典
        """
        # 计算偏导数
        du_dx = sp.diff(u_expr, x)
        du_dy = sp.diff(u_expr, y)
        dv_dx = sp.diff(v_expr, x)
        dv_dy = sp.diff(v_expr, y)
        
        # 检查柯西-黎曼方程
        cr1 = sp.simplify(du_dx - dv_dy)
        cr2 = sp.simplify(du_dy + dv_dx)
        
        results = {
            '∂u/∂x': du_dx,
            '∂u/∂y': du_dy,
            '∂v/∂x': dv_dx,
            '∂v/∂y': dv_dy,
            '柯西-黎曼方程1 (∂u/∂x = ∂v/∂y)': cr1 == 0,
            '柯西-黎曼方程2 (∂u/∂y = -∂v/∂x)': cr2 == 0,
            '是否解析': cr1 == 0 and cr2 == 0
        }
        
        return results
    
    def taylor_series(self, f_expr, z0, n):
        """
        计算函数在给定点的泰勒级数展开
        
        参数:
            f_expr: 函数表达式(sympy表达式)
            z0: 展开点(复数或sympy符号)
            n: 展开阶数
            
        返回:
            sympy表达式: 泰勒级数展开式
        """
        z = sp.Symbol('z')
        series = sp.series(f_expr, z, z0, n)
        return series
    
    def laurent_series(self, f_expr, z0, n, m):
        """
        计算函数在给定点的洛朗级数展开
        
        参数:
            f_expr: 函数表达式(sympy表达式)
            z0: 展开点(复数或sympy符号)
            n: 正幂项的最高阶数
            m: 负幂项的最高阶数
            
        返回:
            sympy表达式: 洛朗级数展开式
        """
        z = sp.Symbol('z')
        series = sp.laurent(f_expr, z, z0, n, m)
        return series


# 示例使用
def example_usage():
    analysis = ComplexAnalysis()
    
    print("\n===== 复数运算示例 =====")
    z1 = 3 + 4j
    z2 = 1 - 2j
    
    print(f"z1 = {z1}")
    print(f"z2 = {z2}")
    print(f"z1 + z2 = {analysis.complex_add(z1, z2)}")
    print(f"z1 - z2 = {analysis.complex_subtract(z1, z2)}")
    print(f"z1 * z2 = {analysis.complex_multiply(z1, z2)}")
    print(f"z1 / z2 = {analysis.complex_divide(z1, z2)}")
    print(f"z1^2 = {analysis.complex_pow(z1, 2)}")
    print(f"|z1| = {analysis.modulus(z1)}")
    print(f"arg(z1) = {analysis.argument(z1)} radians")
    print(f"arg(z1) = {analysis.argument(z1) * 180/np.pi} degrees")
    
    print("\n===== 复变函数示例 =====")
    z = 1 + 1j
    print(f"z = {z}")
    print(f"e^z = {analysis.complex_exp(z)}")
    print(f"log(z) = {analysis.complex_log(z)}")
    print(f"sin(z) = {analysis.complex_sin(z)}")
    print(f"cos(z) = {analysis.complex_cos(z)}")
    print(f"sqrt(z) = {analysis.complex_sqrt(z)}")
    
    print("\n===== 复变函数可视化示例 =====")
    # 定义函数
    def f(z):
        return z**2
    
    print("绘制 f(z) = z^2 的图像...")
    analysis.plot_complex_function(f, x_range=(-2, 2), y_range=(-2, 2))
    
    # 定义更复杂的函数
    def g(z):
        return 1/(z-1)
    
    print("绘制 f(z) = 1/(z-1) 的图像...")
    analysis.plot_complex_function(g, x_range=(-3, 3), y_range=(-3, 3))
    
    print("\n===== 复积分示例 =====")
    # 定义被积函数
    def integrand(z):
        return z**2
    
    a = 0
    b = 1
    integral = analysis.complex_integral(integrand, a, b)
    print(f"∫[0,1] z^2 dz = {integral}")
    print(f"解析结果应为 1/3: {1/3}")
    
    print("\n===== 柯西-黎曼方程示例 =====")
    # 定义函数 f(z) = z^2 = (x+iy)^2 = x^2-y^2 + 2xyi
    x, y = sp.symbols('x y')
    u = x**2 - y**2
    v = 2 * x * y
    
    results = analysis.check_cauchy_riemann(u, v, x, y)
    for key, value in results.items():
        print(f"{key}: {value}")
    
    print("\n===== 泰勒级数展开示例 =====")
    z = sp.Symbol('z')
    f_expr = sp.exp(z)
    z0 = 0
    n = 5
    
    series = analysis.taylor_series(f_expr, z0, n)
    print(f"e^z 在 z={z0} 处的泰勒展开到 {n-1} 阶: {series}")
    
    print("\n===== 洛朗级数展开示例 =====")
    f_expr = 1/(z*(z-1))
    z0 = 0
    n = 3
    m = 3
    
    series = analysis.laurent_series(f_expr, z0, n, m)
    print(f"1/(z(z-1)) 在 z={z0} 处的洛朗展开: {series}")


if __name__ == "__main__":
    example_usage()    

实现原理

这个复变函数计算工具基于以下技术实现:

  • 复数运算

    • 实现基本的复数加减乘除和幂运算
    • 提供指数、对数、三角函数等复变函数
    • 支持极坐标和直角坐标之间的转换
  • 函数可视化

    • 使用 Matplotlib 绘制复变函数的模长和相位
    • 提供 3D 图和等高线图两种可视化方式
    • 支持自定义绘图范围和精度
  • 积分计算

    • 实现沿实轴的复积分计算
    • 使用 SciPy 的数值积分功能
    • 支持自定义积分路径和采样点数
  • 解析函数分析

    • 使用 SymPy 进行符号计算
    • 检查函数是否满足柯西 - 黎曼方程
    • 计算函数的泰勒级数和洛朗级数展开

关键代码解析

1. 复数运算

def complex_multiply(self, z1, z2):
    """复数乘法"""
    return z1 * z2

def complex_exp(self, z):
    """复指数函数"""
    return np.exp(z)

def modulus(self, z):
    """复数模长"""
    return np.abs(z)

2. 函数可视化

def plot_complex_function(self, f, x_range=(-2, 2), y_range=(-2, 2), num_points=100):
    """绘制复变函数的模长和相位"""
    x = np.linspace(x_range[0], x_range[1], num_points)
    y = np.linspace(y_range[0], y_range[1], num_points)
    X, Y = np.meshgrid(x, y)
    Z = X + 1j * Y
    
    F = np.vectorize(f)(Z)
    modulus = np.abs(F)
    phase = np.angle(F)
    
    # 创建图形
    fig = plt.figure(figsize=(15, 10))
    
    # 绘制模长的3D图
    ax1 = fig.add_subplot(221, projection='3d')
    surf1 = ax1.plot_surface(X, Y, modulus, cmap=cm.coolwarm)
    ax1.set_title('函数模长 |f(z)|')
    
    # 绘制相位的3D图
    ax2 = fig.add_subplot(222, projection='3d')
    surf2 = ax2.plot_surface(X, Y, phase, cmap=cm.hsv)
    ax2.set_title('函数相位 arg(f(z))')
    
    # 绘制模长和相位的等高线图
    ax3 = fig.add_subplot(223)
    contour1 = ax3.contourf(X, Y, modulus, 20, cmap=cm.coolwarm)
    ax3.set_title('模长等高线图')
    
    ax4 = fig.add_subplot(224)
    contour2 = ax4.contourf(X, Y, phase, 20, cmap=cm.hsv)
    ax4.set_title('相位等高线图')
    
    plt.tight_layout()
    plt.show()

3. 积分计算

def complex_integral(self, f, a, b, num_points=1000):
    """计算复变函数沿实轴的积分"""
    if not np.isreal(a) or not np.isreal(b):
        raise ValueError("目前仅支持沿实轴的积分")
    
    def real_integrand(t):
        return np.real(f(t))
    
    def imag_integrand(t):
        return np.imag(f(t))
    
    real_integral, _ = integrate.quad(real_integrand, a, b)
    imag_integral, _ = integrate.quad(imag_integrand, a, b)
    
    return real_integral + 1j * imag_integral

4. 解析函数分析

def check_cauchy_riemann(self, u_expr, v_expr, x, y):
    """检查柯西-黎曼方程是否满足"""
    du_dx = sp.diff(u_expr, x)
    du_dy = sp.diff(u_expr, y)
    dv_dx = sp.diff(v_expr, x)
    dv_dy = sp.diff(v_expr, y)
    
    cr1 = sp.simplify(du_dx - dv_dy)
    cr2 = sp.simplify(du_dy + dv_dx)
    
    results = {
        '∂u/∂x': du_dx,
        '∂u/∂y': du_dy,
        '∂v/∂x': dv_dx,
        '∂v/∂y': dv_dy,
        '柯西-黎曼方程1 (∂u/∂x = ∂v/∂y)': cr1 == 0,
        '柯西-黎曼方程2 (∂u/∂y = -∂v/∂x)': cr2 == 0,
        '是否解析': cr1 == 0 and cr2 == 0
    }
    
    return results

使用说明

  • 安装依赖

pip install numpy matplotlib sympy scipy
  • 基本用法

from complex_analysis import ComplexAnalysis

# 创建分析器实例
analysis = ComplexAnalysis()

# 复数运算
z1 = 3 + 4j
z2 = 1 - 2j
print(f"z1 + z2 = {analysis.complex_add(z1, z2)}")
print(f"z1 * z2 = {analysis.complex_multiply(z1, z2)}")

# 复变函数
z = 1 + 1j
print(f"e^z = {analysis.complex_exp(z)}")
print(f"sin(z) = {analysis.complex_sin(z)}")

# 函数可视化
def f(z):
    return z**3

analysis.plot_complex_function(f, x_range=(-2, 2), y_range=(-2, 2))

# 复积分
def integrand(z):
    return z**2

integral = analysis.complex_integral(integrand, 0, 1)
print(f"∫[0,1] z^2 dz = {integral}")

# 柯西-黎曼方程检查
from sympy import symbols

x, y = symbols('x y')
u = x**2 - y**2  # Re(z^2)
v = 2 * x * y    # Im(z^2)

results = analysis.check_cauchy_riemann(u, v, x, y)
print(f"函数是否解析: {results['是否解析']}")
  • 示例输出

z1 + z2 = (4+2j)
z1 * z2 = (11-2j)
e^z = (1.46869393991589+2.28735528717884j)
sin(z) = (1.29845758141598+0.634963914784736j)
∫[0,1] z^2 dz = (0.333333333333333+0j)
函数是否解析: True

扩展建议

  • 增强功能

    • 添加沿任意路径的复积分计算
    • 实现留数定理和围道积分
    • 增加共形映射分析
    • 支持多值函数(如复对数的不同分支)
  • 用户界面

    • 开发命令行交互界面
    • 创建图形界面(如使用 Tkinter 或 PyQt)
    • 实现 Web 界面(如使用 Flask 或 Django)
  • 性能优化

    • 针对大规模计算进行优化
    • 添加并行计算支持
    • 优化符号计算的效率
  • 教学辅助

    • 添加复变函数概念解释和公式推导
    • 提供函数可视化的动画演示
    • 实现交互式可视化(如动态调整参数)

你可能感兴趣的:(实例,python,开发语言)