笔者本身是电气工程及其自动化专业出身,在平时的工作学习过程中,经常需要进行复数的运算以及矩阵相关的运算,但是奈何我实在是用不习惯matlab,一方面,matlab软件动辄十几个G这么大;另一方面,并且在嵌入式系统或者树莓派之类的系统上,更是不可能安装matlab这样的软件,因此,笔者便着手于Python语言的科学计算能力的探索。
复数运算
在数学上,形如a + bi 或者在工程上形如 a + bj的数叫做复数,a称为实部,b称为虚部。
在python语言中,遵循工程上的定义形式,直接在python文本中输入
x = 1 + 1j
不需要额外引入任何库文件,直接这样输入就实现了复数变量的定义
print(type(x))
print(x)
通过print方法我们输出变量x的数据类型和x变量的值
<class 'complex'>
(1+1j)
输出结果如上图所示,不难发现,变量x属于python中的复数类型。特别值得注意的是
1、虚数不能单独存在,它们总是和一个值为 0.0 的实数部分一起构成一个复数
2、复数由实数部分和虚数部分构成
3、表示虚数的语法:re+im j
4、实数部分和虚数部分都是浮点数
5、虚数部分必须有后缀j或J
这样我们就可以把复数当作普通的数值进行运算了。
但是很多时候,我们可能需要求得某个复数的共轭复数或者模值甚至是转换为极坐标形式。
求共轭复数
对于python内置的complex类来说,可以通过调用conjugate()
方法求得某个复数的共轭复数
x = 1 + 1j
y = x.conjugate()
print(y)
这样我们就可以得到
(1-1j)
符合我们的预期
求复数模值
通过调用python内置的complex类里面的__abs__()
方法,可以得到某个复数的模值
x = 1 + 1j
y = x.__abs__()
print(y)
这样我们就得到了模值
1.4142135623730951
将复数进行标准形式与极坐标模式的互换
目前在python内置的complex类型中,没有办法直接通过调用方法进行互换,因此我们需要引入cmath标准库。
from cmath import *
引入完cmath标准库之后,就可以调用rect()
方法和polar()
方法,前者是将一个极坐标形式的复数转换为标准形式的复数;后者是将一个标准形式的复数转换为极坐标形式的复数
x = 1 + 1j
a = polar(x)
print(a)
上面的代码可以将变量x转换为极坐标形式的复数,其输出结果如下所示:
(1.4142135623730951, 0.7853981633974483)
返回值是一个元组类型,第一项是模值,第二项是相角,相角采用的是弧度制,这一点需要特别注意!
接下来我们尝试将极坐标形式的复数转换为标准形式的复数,因此我们需要调用
rect()
方法,这个方法需要接收两个参数,第一个参数是幅值,第二个参数是相角,这里面的相角也是弧度制,例如下面的代码将上面例子中的极坐标形式的变量a转换为标准形式的复数
x = 1 + 1j
a = polar(x) # 转换为极坐标形式
b = rect(a[0], a[1]) # 转换为标准形式
print(b) # 输出变量b的值
print(type(b)) # 输出变量b的类型
输出结果如下所示:
(1.0000000000000002+1.0000000000000002j)
<class 'complex'>
可以看到输出结果符合预期,至于并不绝对等于原来x变量的原因还是因为计算机对浮点数的精度影响,实际使用过程中忽略就可以了。
通过输出变量b的类型,我们发现变成了python内置的complex类型,因此可以继续参与后续的数学运算了!