
2.5.4 复数相关的函数
MATLAB对复数提供了直接的支持。也就是说,MATLAB中的变量均可以取复数值,并且跟普通的实数一样参与各种算术运算或函数调用,而不需要额外的数据结构来特别声明某个变量是复数变量。这一特性为MATLAB进行涉及复数的大量常见科学计算提供了便利。
【例2.11】
求解如下的一元二次方程

在命令窗口中输入如下内容:

输出结果为

可见,MATLAB直接给出了方程的复数解。
MATLAB中的复数相关函数见表2-4。
表2-4 MATLAB中的复数相关函数

【例2.12】
一辆模型小车在平地上以(2.5m/s,1.5m/s)的速度行进了4m,然后逆时针旋转了37°后又行进了6m,请问小车的位移是多少?
对于平面上点(矢量)的运动的分析而言,复数是一个有力的工具。我们可以将平面上的矢量v=(a,b)等价地用复数表示为v=a+bi,于是,矢量加法s=v1+v2就可以用相应的复数加法s=v1+v2完成,而矢量v逆时针旋转θ角度的操作可以通过复数乘法vejθ完成。
本例题中的小车运动轨迹如图2-5所示。设u为开始时小车运行方向上的单位长度矢量,那么小车第一步的位移即为4u;之后小车逆时针旋转了θ=37°,因此小车运行方向上的单位长度矢量变为了uejθ,而第二步的位移为6uejθ。小车的总位移为两步位移之和,即(4+6ejθ)u。

图2-5 例2.12中小车的运动轨迹
在命令窗口中输入如下内容:

输出结果为

因此,小车的位移为(5.68m, 7.62m)。
注意:本例题中小车的速度只是给出了运动的方向,但是并不能保证该矢量是单位长度的。因此,在实际编程时,需要将速度矢量除以其模值进行归一化,从而得到运动方向上的单位长度矢量。
在例2.12中可以看到两种MATLAB中的复数输入方式。如果要输入的复数的虚部此时是以一个数字直接提供的,那么在数字后面直接加上虚单位i或j即可,如2.5+1.5i;如果复数的虚部是以一个变量或表达式来提供的,这时可以用虚单位i或j与之相乘,如i*sind(37)。需要注意的是,由于标识符i或j很容易被作为循环变量在程序中使用,那么这时它们将失去虚单位的含义。如果通过上面的方式来产生复数,就很容易造成语法正确但实际语义被改变的不易察觉的错误。因此,作为一种更加稳妥的产生复数的方式,用户可以使用表2-4中所列举的complex函数。
此外,例2.12中的eiθ可以利用下一节将要介绍的exp函数更方便也更易懂地实现。不过,需要注意此时θ的单位应为弧度。