查看: 300|回复: 0

Python complex复数创建、运算与cmath模块实践

[复制链接]
发表于 4 小时前 | 显示全部楼层 |阅读模式
Python的complex是内置数值类型,不需要第三方库即可完成复数创建、算术运算和cmath数学函数调用。原文示例覆盖字面量、complex()构造、实部虚部读取、DFT、二维点旋转、RLC阻抗和曼德勃罗集。下面按代码实现组织这些要点,便于在脚本中逐段验证。

一、创建复数与读取实部虚部
  1. z1 = 3 + 4j
  2. z2 = 1 - 2j
  3. z3 = 5j
  4. z4 = 2 + 0j
  5. # e = 1 + j  # NameError,j必须紧挨系数
  6. e = 1 + 1j
  7. z5 = complex(5)
  8. z6 = complex(3, 4)
  9. z7 = complex('-1-2j')
  10. # complex('3 + 4j')  # 字符串内不能有空格
  11. # complex('3+4i')    # Python使用j,不是i
  12. z = 3 + 4j
  13. print(z.real)        # 3.0
  14. print(z.imag)        # 4.0
  15. print(z.conjugate()) # (3-4j)
复制代码
字面量创建时,虚部系数必须紧挨j,不能写成1 + j;complex(real, imag)接受两个参数,complex(字符串)则要求字符串中没有空格,并且虚数单位用j而不是i。z.real和z.imag返回float,conjugate()把虚部取反。

二、算术运算、abs与比较限制
  1. a = 3 + 4j
  2. b = 1 - 2j
  3. print(a + b)  # (4+2j)
  4. print(a - b)  # (2+6j)
  5. print(a * b)  # (11-2j)
  6. print(a / b)  # (-1+2j)
  7. print(a ** 2) # (-7+24j)
  8. print(abs(a)) # 5.0
  9. print(pow(a, 2)) # (-7+24j)
  10. print(a == b) # False
  11. # print(a > b)  # TypeError,复数不能比较大小
复制代码
加减乘除和幂运算都按复数规则进行。abs(a)计算模,3+4j的模为sqrt(3²+4²)=5.0。复数可以判断相等或不等,但不能使用大于、小于比较;原文也指出round()不能用于复数。

三、cmath模块、极坐标与安全开方
  1. import cmath
  2. z = 3 + 4j
  3. print(cmath.sqrt(z))      # (2+1j)
  4. print(cmath.polar(z))     # (5.0, 0.9272952180016122)
  5. print(cmath.rect(5.0, 0.9272952180016122)) # (3+4j)
  6. x = 0.5
  7. print(cmath.exp(1j * x))  # (0.87758+0.47943j)
  8. print(cmath.sqrt(4))      # (2+0j)
  9. print(cmath.sqrt(-4))     # 2j
复制代码
cmath提供复数的sqrt、exp、log、log10、sin、cos、tan、asin、acos、atan、sinh、cosh、tanh,以及isinf、isnan、isclose等判断函数。polar()返回模和辐角,rect()从极坐标恢复复数。需要注意cmath.sqrt(4)返回(2+0j),即使结果是实数也仍是complex;cmath.sqrt(-4)返回2j,实际表示0+2j。原文用safe_sqrt区分正数走math.sqrt、负数走cmath.sqrt:
  1. import math
  2. import cmath
  3. def safe_sqrt(x):
  4.     if x >= 0:
  5.         return math.sqrt(x)
  6.     return cmath.sqrt(x)
  7. print(safe_sqrt(4))   # 2.0
  8. print(safe_sqrt(-4))  # 2j
复制代码

四、可落地场景:DFT、点旋转、RLC阻抗、分形
离散傅里叶变换把时域采样累加为频域复数,复数同时保存幅度和相位信息。原文示例用50Hz和120Hz正弦波叠加,采样率500、时长1秒,并输出前10个频率分量的幅度:
  1. import cmath
  2. import math
  3. def discrete_fourier_transform(samples):
  4.     n = len(samples)
  5.     result = []
  6.     for k in range(n):
  7.         frequency_component = 0j
  8.         for t in range(n):
  9.             angle = -2 * cmath.pi * 1j * k * t / n
  10.             frequency_component += samples[t] * cmath.exp(angle)
  11.         result.append(frequency_component)
  12.     return result
  13. sample_rate = 500
  14. duration = 1.0
  15. n_samples = int(sample_rate * duration)
  16. samples = []
  17. for i in range(n_samples):
  18.     t = i / sample_rate
  19.     value = math.sin(2 * math.pi * 50 * t) + 0.5 * math.sin(2 * math.pi * 120 * t)
  20.     samples.append(value)
  21. frequency_spectrum = discrete_fourier_transform(samples)
  22. for i in range(10):
  23.     magnitude = abs(frequency_spectrum[i])
  24.     frequency = i * sample_rate / n_samples
  25.     print(f'{frequency:.0f}Hz: 幅度={magnitude:.2f}')
复制代码
二维点旋转可以把坐标写成复数,再乘以旋转因子e^(jθ)=cos(θ)+j*sin(θ)。原文把点(1,0)旋转90度,输出(0.00,1.00);缩放点则直接用复数乘以factor。
  1. def rotate_point(x, y, angle_degrees):
  2.     point = complex(x, y)
  3.     angle_radians = math.radians(angle_degrees)
  4.     rotation = complex(math.cos(angle_radians), math.sin(angle_radians))
  5.     rotated = point * rotation
  6.     return rotated.real, rotated.imag
  7. x, y = rotate_point(1, 0, 90)
  8. print(f'(1, 0)旋转90度后:({x:.2f}, {y:.2f})')  # (0.00, 1.00)
复制代码
交流电路阻抗用Z=R+jX表示,电阻阻抗为complex(r,0),电感阻抗为jωL,电容阻抗为1/(jωC),即-j/(ωC)。串联阻抗用sum求和,并联阻抗用(z1*z2)/(z1+z2)。原文RLC参数为R=100.0、L=0.1、C=10e-6、f=1000.0:
  1. def impedance_resistor(r):
  2.     return complex(r, 0)
  3. def impedance_inductor(inductance, frequency):
  4.     omega = 2 * 3.14159 * frequency
  5.     return complex(0, omega * inductance)
  6. def impedance_capacitor(capacitance, frequency):
  7.     omega = 2 * 3.14159 * frequency
  8.     return complex(0, -1 / (omega * capacitance))
  9. def series_impedance(*impedances):
  10.     return sum(impedances)
  11. R = 100.0
  12. L = 0.1
  13. C = 10e-6
  14. f = 1000.0
  15. Z_total = series_impedance(impedance_resistor(R), impedance_inductor(L, f), impedance_capacitor(C, f))
  16. print(f'总阻抗:{Z_total}')
  17. print(f'阻抗模:{abs(Z_total):.2f}欧姆')
  18. print(f'相位角:{cmath.phase(Z_total):.2f}弧度')
复制代码
曼德勃罗集用迭代z=z*z+c判断发散,|z|超过2即退出。原文用迭代次数映射ASCII字符,坐标范围为x_min=-2.0、x_max=1.0、y_min=-1.0、y_max=1.0,生成100x40的终端图形:
  1. def mandelbrot(c, max_iterations=100):
  2.     z = 0j
  3.     for n in range(max_iterations):
  4.         z = z * z + c
  5.         if abs(z) > 2:
  6.             return n
  7.     return max_iterations
  8. def generate_mandelbrot(width=80, height=40, max_iter=50):
  9.     x_min, x_max = -2.0, 1.0
  10.     y_min, y_max = -1.0, 1.0
  11.     for y in range(height):
  12.         line = ''
  13.         for x in range(width):
  14.             real = x_min + (x / width) * (x_max - x_min)
  15.             imag = y_min + (y / height) * (y_max - y_min)
  16.             c = complex(real, imag)
  17.             m = mandelbrot(c, max_iter)
  18.             if m == max_iter:
  19.                 line += '#'
  20.             elif m > max_iter * 0.8:
  21.                 line += '*'
  22.             elif m > max_iter * 0.5:
  23.                 line += '+'
  24.             elif m > max_iter * 0.2:
  25.                 line += '.'
  26.             else:
  27.                 line += ' '
  28.         print(line)
  29. generate_mandelbrot(100, 40)
复制代码

五、类型转换与常见注意点
  1. z = 3 + 4j
  2. print(str(z)) # '(3+4j)'
  3. # int(z)   # TypeError
  4. # float(z) # TypeError
  5. print(complex(5))    # (5+0j)
  6. print(complex(3, 4)) # (3+4j)
  7. print(complex('1+2j')) # (1+2j)
  8. print(type(z.real))  # <class 'float'>
  9. print(type(z.imag))  # <class 'float'>
  10. z1 = complex(float('inf'), 0)
  11. z2 = complex(0, float('nan'))
  12. print(z1, z2)
复制代码
复数可以转成字符串,但不能直接用int()或float()转换;需要数值时可使用abs()取模。复数实部和虚部都是float,因此可以承载inf和nan。创建字符串形式时不能有空格,虚数单位必须是j。cmath.sqrt(-4)的输出2j容易让人误以为是整数,实际是0+2j。原文最后强调,complex适合信号处理、科学计算和图形学等场景,日常脚本不常用,但需要时无需额外安装库。

本文代码均取自原文示例,主要保留了创建、运算、cmath、DFT、点旋转、RLC阻抗、分形和类型转换的实现,可逐段在Python解释器中验证。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-20 14:12 , Processed in 0.033915 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部