上QQ阅读APP看书,第一时间看更新
1.4.3 复数运算
在实际工作中,我们有时需要用复数来执行一些运算,或者使用复数空间来解决网络认证方案遇到的难题,并且复数空间是唯一的解决办法。
复数可以由函数complex(real,imag)或者带有后缀j的浮点数来指定,相关代码(complex_exp.py)示例如下:
a = complex(2, 4) b = 3 - 5j print(f'complex(2, 4) is: {a}') print(f'{b}')
执行py文件,输出结果如下:
complex(2, 4) is: (2+4j) (3-5j)
对应的实部、虚部和共轭复数可以很容易地获取,示例(complex_exp.py)如下:
print(f'real of {a} is: {a.real}') print(f'imag of {a} is: {a.imag}') print(f'conjugate of {a} is: {a.conjugate()}')
执行py文件,输出结果如下:
real of (2+4j) is: 2.0 imag of (2+4j) is: 4.0 conjugate of (2+4j) is: (2-4j)
另外,可以进行所有常见的数学运算,示例(complex_exp.py)如下:
print(f'{a} + {b} = {a + b}') print(f'{a} * {b} = {a * b}') print(f'{a} / {b} = {a / b}') print(f'abs({a}) = {abs(a)}')
执行py文件,输出结果如下:
(2+4j) + (3-5j) = (5-1j) (2+4j) * (3-5j) = (26+2j) (2+4j) / (3-5j) = (-0.4117647058823529+0.6470588235294118j) abs((2+4j)) = 4.47213595499958
如果要计算复数的正弦值、余弦值或平方根,我们可使用cmath模块(complex_exp.py):
import cmath print(f'cmath.sin({a}) = {cmath.sin(a)}') print(f'cmath.cos({a}) = {cmath.cos(a)}') print(f'cmath.exp({a}) = {cmath.exp(a)}')
执行py文件,输出结果如下:
cmath.sin((2+4j)) = (24.83130584894638-11.356612711218174j) cmath.cos((2+4j)) = (-11.36423470640106-24.814651485634187j) cmath.exp((2+4j)) = (-4.829809383269385-5.5920560936409816j)
Python中大部分与数学相关的模块都能处理复数。如使用numpy,可以很容易地构造一个复数数组并在这个数组上执行各种操作,相关代码(complex_exp.py)示例如下:
import numpy as np np_a = np.array([2+3j, 4+5j, 6-7j, 8+9j]) print(f'np_a object is: {np_a}') print(f'{np_a} + 2 = {np_a + 2}') print(f'np.sin({np_a}) = {np.sin(np_a)}')
执行py文件,输出结果如下:
np_a object is: [2.+3.j 4.+5.j 6.-7.j 8.+9.j] [2.+3.j 4.+5.j 6.-7.j 8.+9.j] + 2 = [ 4.+3.j 6.+5.j 8.-7.j 10.+9.j] np.sin([2.+3.j 4.+5.j 6.-7.j 8.+9.j]) = [ 9.15449915 -4.16890696j -56.16227422 -48.50245524j-153.20827755-526.47684926j 4008.42651446-589.49948373j]
Python的标准数学函数在实际情况下并不能产生复数值,因此代码中不会出现复数返回值,相关代码(complex_exp.py)示例如下:
import math print(math.sqrt(-1))
执行py文件,输出结果如下:
Traceback (most recent call last): File "/Users/lyz/Desktop/python-workspace/advanced_programming/chapter3/complex_exp.py", line 32, in <module> print(math.sqrt(-1)) ValueError: math domain error
如果想生成一个复数返回值,必须使用cmath模块,或者在某个支持复数的库中声明复数类型的使用,相关代码(complex_exp.py)示例如下:
print(f'cmath.sqrt(-1) = {cmath.sqrt(-1)}')
执行py文件,输出结果如下:
cmath.sqrt(-1) = 1j