manim边做边学--复数平面

所谓复数平面,就是一种二维坐标系统,用于几何表示复数的场景,其中横轴代表实部,纵轴代表虚部。

每个点对应一个唯一的复数,反之亦然,这种表示方法使得复数的加法、乘法等运算可以通过直观的图形变换来理解。

ComplexPlaneManim库中用于处理复数平面的类。

它不仅提供了标准的笛卡尔坐标系,还特别针对复数操作进行了优化,使得复数及其变换的可视化变得更加直观。

通过 ComplexPlane,我们可以轻松地绘制出复数点、向量以及执行复数变换,如旋转、缩放等。

本篇将介绍Manim中的ComplexPlane对象以及一些常用的使用示例。

1. 主要参数

ComplexPlane继承自上一篇介绍的NumberPlane

ComplexPlane没有自己特有的参数,和NumberPlane的参数是一样的。

参数名称类型说明
x_rangeSequence[float]直角平面的横坐标轴范围,间隔
y_rangeSequence[float]直角平面的纵坐标轴范围,间隔
x_lengthfloat直角平面宽度
y_lengthfloat直角平面高度
background_line_styledict直角平面背景网格线的样式
faded_line_styledict淡化网格线的样式,用于辅助背景网格线
faded_line_ratioint定义淡化网格线与背景网格线的比例
make_smooth_after_applying_functionsbool应用函数后是否进行平滑处理

2. 主要方法

NumberPlane一样,ComplexPlane也包含了坐标系统CoordinateSystem类提供的方法,

不过,在复数平面中,我比较常用的是以下3个方法:

名称说明
add_coordinates给复数平面的坐标轴添加刻度数值
n2p(number_to_point)根据复数得到此复数在复数平面上的位置
p2n(point_to_number)根据复数平面上的位置得到对应的复数

3. 使用示例

下面通过示例来演示复数平面ComplexPlane的多种功能,包括复数平面的网格与坐标轴,复数点的标记与展示、复数平面上的函数图像、复数变换动画等。

ComplexPlane成为我们展示复数概念和性质的有力工具。

3.1. 网格与坐标轴

创建一个复数平面ComplexPlane,绘制网格线和坐标轴,设置实部的范围[-5, 5],虚部的范围[-4, 4],最后再给坐标轴加上刻度值。

plane = ComplexPlane(
    x_range=[-5, 5],
    y_range=[-4, 4],
    x_length=6,
    y_length=4,
)

# 加上刻度值
plane.add_coordinates()

3.2. 复数点的标记

在复数平面坐标上添加2个复数点,再给这两个点添加标签,显示其复数的值。

# 创建复数平面
plane = ComplexPlane(
    x_range=[-5, 5],
    y_range=[-5, 5],
)
plane.add_coordinates()

# 添加复数的点
d1 = Dot(plane.n2p(3 + 2j))
d2 = Dot(plane.n2p(-4 - 2j))

3.3. 复数运算

复数平面上添加两个点,然后计算这两个复数相加的结果,并将计算过程在复数平面上用动画显示出来。

# 创建复数平面
plane = ComplexPlane(
    x_range=[-1, 8],
    y_range=[-1, 8],
)
plane.add_coordinates()

# 初始的两个点
d1 = Dot(plane.n2p(2 + 1j))
d2 = Dot(plane.n2p(2 + 4j))

# 相加后的点
d3 = Dot(plane.n2p(4 + 5j))

3.4. 复数变换

最后,是复数点经过一个函数变换后,在复数平面上显示新的位置。

示例中先初始4个点,然后经过函数f(x)=2x f ( x ) = 2 x 的变换后,显示其变换后的位置。

其中用到了ComplexPlane的主要方法n2pp2n

# 创建复数平面
plane = ComplexPlane(
    x_range=[-5, 5],
    y_range=[-5, 5],
)
plane.add_coordinates()

d1 = LabeledDot(
    label=MathTex("1"),
    point=plane.n2p(2 + 1j),
)
d2 = LabeledDot(
    label=MathTex("2"),
    point=plane.n2p(2 + 3j),
)
d3 = LabeledDot(
    label=MathTex("3"),
    point=plane.n2p(-2 - 2j),
)
d4 = LabeledDot(
    label=MathTex("4"),
    point=plane.n2p(-3 + 2j),
)
self.add(d1, d2, d3, d4)

# 变换后点的位置
pd1 = np.exp2(plane.p2n(d1.get_center()))
pd2 = np.exp2(plane.p2n(d2.get_center()))
pd3 = np.exp2(plane.p2n(d3.get_center()))
pd4 = np.exp2(plane.p2n(d4.get_center()))

4. 附件

文中的代码只是关键部分的截取,完整的代码共享在网盘中(complex_plane.py),

下载地址: 完整代码 (访问密码: 6872)

原创作者: wang_yb 转载于: https://www.cnblogs.com/wang_yb/p/18494562
<think>好的,我现在需要帮助用户了解Python中的cmath模块针对复数的数学函数用法。首先,用户已经提供了之前的对话历史,其中我之前详细介绍了math模块的用法,现在用户转向了cmath模块。用户还提供了五个引用资料,我需要参考这些资料来构建回答。 首先,我需要确认用户的需求。用户明确提到想了解cmath模块的复数数学函数用法,所以我的回答需要集中在cmath模块的功能、常用函数、与math模块的区别以及实际应用示例上。同时,用户希望回答结构清晰,分步骤说明,并生成相关问题。 接下来,我需要查看用户提供的引用内容。引用1提到cmath是处理复数的模块,引用2指出cmath的函数与math类似但不同,cmath总是返回复数,而math处理实数。引用3说明cmath的参数可以是整数、浮点数或复数,引用4提到了复数的模数、相位和极坐标转换函数如abs(), phase(), polar()。引用5看起来是推广内容,可以忽略。 结合这些信息,我应该组织回答的结构。首先介绍模块导入,然后对比math和cmath的区别,接着列出常用函数,如sqrt(), exp(), log(), 三角函数,以及极坐标转换函数。然后给出注意事项,比如参数类型和复数返回值的特性。最后,提供应用示例,如计算电路中的阻抗,并生成相关问题。 需要确保回答符合用户之前的格式要求,比如使用中文,行内公式用$...$,独立公式用$$...$$,并正确引用资料中的内容。例如,引用2提到cmath函数总是返回复数,这一点要在注意事项中强调。引用4中的polar()和phase()函数需要详细说明。 另外,用户可能对如何在实际项目中使用cmath模块感兴趣,所以应用示例部分应贴近实际场景,比如工程计算或信号处理中的复数运算。同时,要指出cmath模块在处理复数时的优势,比如直接支持复数运算,而无需自行处理实部和虚部。 需要检查是否有遗漏的重要函数,比如复数的绝对值(模)使用abs(),相位使用phase(),极坐标转换用polar(),直角坐标转换用rect()。同时,三角函数部分如sin(), cos()在cmath中的行为可能与math不同,需要指出它们接受复数参数。 注意事项部分要提到错误处理,比如cmath模块可能不会抛出域错误,因为复数运算更灵活。例如,sqrt(-1)在cmath中返回1j,而math会报错。同时,复数运算的精度问题也需要提及。 最后,生成的相关问题需要围绕用户可能进一步探索的方向,比如与math模块的性能比较,在科学计算中的应用,处理多值函数的方法,以及第三方库如numpy的区别。 总结回答结构: 1. 模块导入与基础操作 2. cmath与math的核心区别 3. 常用函数分类(基础运算、指数对数、三角函数、坐标转换) 4. 注意事项(返回值类型、参数类型、多值函数) 5. 应用示例(电路阻抗计算) 6. 相关问题 需要确保每个部分简洁明了,代码示例准确,引用标记正确。例如,在说明cmath.sqrt(-1)时,引用资料2和4来支持这一点,并添加引用标识[^2][^4]。 现在,检查是否有遗漏的信息点,比如cmath模块中的特殊函数如相位计算和极坐标转换,这些在引用4中提到,需要包含在坐标转换部分。同时,引用3提到参数可以是拥有__complex__或__float__方法的对象,这点可以在注意事项的参数类型部分说明。 最后,确保语言口语化,避免技术术语堆砌,分步骤讲解,帮助用户逐步理解如何使用cmath模块处理复数运算。</think>### Python cmath模块复数数学函数使用详解 `cmath`模块专为**复数运算**设计,提供了与`math`模块相似的函数接口,但所有函数均支持复数输入与输出。以下从**核心功能**、**与math模块的差异**、**典型应用场景**三方面详细解析: --- #### 一、模块导入与基础操作 **1. 导入模块** ```python import cmath ``` **2. 创建复数** - 直接赋值:`z = 3 + 4j` - 通过函数构造:`z = complex(3, 4)` **3. 基础运算示例** ```python z = 3 + 4j print(cmath.sqrt(z)) # 输出:(2+0.5j) ``` --- #### 二、cmath与math模块的核心区别 | 特性 | math模块 | cmath模块 | |---------------------|------------------|--------------------| | **输入类型** | 仅实数 | 支持复数、实数 | | **输出类型** | 实数 | 始终返回复数[^2] | | **域错误处理** | 报错(如负数开方)| 返回复数解[^4] | **示例对比**: ```python import math, cmath # math模块处理负数 try: print(math.sqrt(-1)) # 触发ValueError except ValueError as e: print(e) # 输出:math domain error # cmath模块处理负数 print(cmath.sqrt(-1)) # 输出:1j [^2][^4] ``` --- #### 三、常用函数分类及用法 **1. 基础运算函数** - **平方根**:`cmath.sqrt(z)` ```python print(cmath.sqrt(-9)) # 输出:3j ``` - **绝对值(模)**:`abs(z)`(内置函数) ```python print(abs(3+4j)) # 输出:5.0 ``` **2. 指数与对数函数** - **自然指数**:`cmath.exp(z)` ```python print(cmath.exp(1j * cmath.pi)) # 输出:(-1+1.2246467991473532e-16j) ≈ -1 ``` - **自然对数**:`cmath.log(z)` ```python print(cmath.log(1j)) # 输出:0+1.5707963267948966j(即$0 + \frac{\pi}{2}j$) ``` **3. 三角函数** - **正弦函数**:`cmath.sin(z)` ```python print(cmath.sin(1j)) # 输出:0+1.1752011936438014j ``` **4. 极坐标与直角坐标转换** - **极坐标转换**:`cmath.polar(z)` → 返回模和相位角$(r, \phi)$[^4] ```python print(cmath.polar(1+1j)) # 输出:(1.4142135623730951, 0.7853981633974483) ``` - **直角坐标转换**:`cmath.rect(r, phi)` → 从极坐标还原复数 ```python print(cmath.rect(1, cmath.pi/2)) # 输出:(0+1j) ``` **5. 相位角计算** - **获取相位**:`cmath.phase(z)`(范围$(-\pi, \pi]$) ```python print(cmath.phase(-1+1j)) # 输出:2.356194490192345(即$\frac{3\pi}{4}$) ``` --- #### 四、注意事项 1. **返回值类型**: - 所有函数返回复数,即使结果为实数(虚部为0)[^2] ```python print(cmath.sqrt(4)) # 输出:(2+0j) ``` 2. **参数类型兼容性**: - 支持整数、浮点数、复数,或实现了`__complex__()`方法的对象[^3] 3. **多值函数处理**: - 如复对数`cmath.log(z)`仅返回主值,需手动处理多值性 --- #### 五、应用示例:计算交流电路阻抗 **场景**:计算电阻$R=5Ω$与电感$L=0.1H$串联的阻抗(频率$f=50Hz$) ```python import cmath R = 5 L = 0.1 f = 50 omega = 2 * cmath.pi * f Z = R + 1j * omega * L # 复数阻抗 print(f"阻抗模:{abs(Z):.2f} Ω") # 输出:阻抗模:8.21 Ω print(f"相位角:{cmath.degrees(cmath.phase(Z)):.2f}°") # 输出:相位角:32.13° ``` --- ### 相关问题 1. **如何用cmath处理复数的多值函数(如平方根的对称性)?** 2. **cmath模块与numpy的复数运算性能有何差异?** 3. **在信号处理中如何利用cmath模块分析频域响应?** 4. **如何自定义复数运算的异常处理机制?** 如需深入理解复数运算的数学背景,可参考复变函数理论[^4],或查阅Python官方文档[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值