Python实例题
题目
代码实现
实现原理
复数运算:
函数可视化:
积分计算:
解析函数分析:
关键代码解析
1. 复数运算
2. 函数可视化
3. 积分计算
4. 解析函数分析
使用说明
安装依赖:
基本用法:
示例输出:
扩展建议
增强功能:
用户界面:
性能优化:
教学辅助:
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()
这个复变函数计算工具基于以下技术实现:
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)
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()
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
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