java虚数复数计算_虚部?从搞懂虚数开始....

本文转自公众号 imath, 作者 阮一峰。

一直觉得虚数(imaginary number)很难懂。

中学老师说,虚数就是-1的平方根。

可是,什么数的平方等于-1呢?计算器直接显示出错!

直到今天,我也没有搞懂。谁能解释,虚数到底是什么?它有什么用?

对于虚数,很多童鞋都有上面的疑问,有人推荐了一篇非常棒的文章《虚数的图解》。我读后恍然大悟,醍醐灌顶,原来虚数这么简单,一点也不奇怪和难懂!下面,我就用自己的语言,讲述我所理解的虚数。

一什么是虚数

首先,假设有一根数轴,上面有两个反向的点: 1和-1。

99053713_1

这根数轴的正向部分,可以绕原点旋转。显然,逆时针旋转180度, 1就会变成-1。

99053713_2

这相当于两次逆时针旋转90度。

99053713_3

因此,我们可以得到下面的关系式:

( 1) * (逆时针旋转90度) * (逆时针旋转90度) = (-1)

如果把 1消去,这个式子就变为:

(逆时针旋转90度)^2 = (-1)

将'逆时针旋转90度'记为 i :

i^2 = (-1)

这个式子很眼熟,它就是虚数的定义公式。

所以,我们可以知道,虚数 i 就是逆时针旋转90度,i 不是一个数,而是一个旋转量。

二复数的定义

既然 i 表示旋转量,我们就可以用 i ,表示任何实数的旋转状态。

99053713_4

将实数轴看作横轴,虚数轴看作纵轴,就构成了一个二维平面。旋转到某一个角度的任何正实数,必然唯一对应这个平面中的某个点。

只要确定横坐标和纵坐标,比如( 1 , i ),就可以确定某个实数的旋转量(45度)。

数学家用一种特殊的表示方法,表示这个二维坐标:用 号把横坐标和纵坐标连接起来。比如,把 ( 1 , i ) 表示成 1 i 。这种表示方法就叫做复数(complex number),其中 1 称为实数部,i 称为虚数部。

为什么要把二维坐标表示成这样呢,下一节告诉你原因。

三虚数的作用:加法

虚数的引入,大大方便了涉及到旋转的计算。

99053713_5

比如,物理学需要计算'力的合成'。假定一个力是 3 i ,另一个力是 1 3i ,请问它们的合成力是多少?

99053713_6

根据'平行四边形法则',你马上得到,合成力就是 ( 3 i ) ( 1 3i ) = ( 4 4i )。

这就是虚数加法的物理意义。

四虚数的作用:乘法

如果涉及到旋转角度的改变,处理起来更方便。

99053713_7

比如,一条船的航向是 3 4i 。

如果该船的航向,逆时针增加45度,请问新航向是多少?

99053713_8

45度的航向就是 1 i 。计算新航向,只要把这两个航向 3 4i 与 1 i 相乘就可以了(原因在下一节解释):

( 3 4i ) * ( 1 i ) = ( -1 7i )

所以,该船的新航向是 -1 7i 。

如果航向逆时针增加90度,就更简单了。因为90度的航向就是 i ,所以新航向等于:

( 3 4i ) * i = ( -4 3i )

这就是虚数乘法的物理意义:改变旋转角度。

五虚数乘法的数学证明

为什么一个复数改变旋转角度,只要做乘法就可以了?

下面就是它的数学证明,实际上很简单。

99053713_9

任何复数 a bi,都可以改写成旋转半径 r 与横轴夹角 θ 的形式。

假定现有两个复数 a bi 和 c di,可以将它们改写如下:a bi = r1 * ( cosα isinα )c di = r2 * ( cosβ isinβ )

这两个复数相乘,( a bi )( c di ) 就相当于

r1 * r2 * ( cosα isinα ) * ( cosβ isinβ )

展开后面的乘式,得到

cosα * cosβ - sinα * sinβ i( cosα * sinβ sinα * cosβ )

根据三角函数公式,上面的式子就等于

cos(α β) isin(α β)

所以,

( a bi )( c di ) = r1 * r2 * ( cos(α β) isin(α β) )

这就证明了,两个复数相乘,就等于旋转半径相乘、旋转角度相加。

在C语言中,计算复数虚数根通常涉及到复数数学和浮点数运算。如果你有一个复数 `a + bi`,其虚部 `b` 非零,你可以使用欧拉公式来求解其n次根。欧拉公式表示复数的指数形式为 `e^(ix) = cos(x) + i*sin(x)`。 对于实系数多项式,可以使用牛顿迭代法或者更精确的算法如De Moivre定理。以下是一个简单的步骤概述: 1. **将复数转换为极坐标形式** (`r`, `θ`),其中 `r = sqrt(a^2 + b^2)` 是复数的模,`θ = atan(b/a)` 是它的幅角。 2. **应用De Moivre定理**: 对于给定的次方 `n`,计算 `(r * e^(i*θ/n))^n`,这会得到原始复数的一个虚数根。 3. **处理整数次幂**: 如果 `n` 是偶数,你会得到两个相同的根(因为 `cos(θ) + i*sin(θ)` 和 `-cos(θ) - i*sin(θ)` 是共轭复数)。如果是奇数,你会得到一个唯一的根。 4. **取模和四舍五入**:结果可能是复数,需要取模并可能进行四舍五入到特定精度。 以下是一个简化的伪代码示例: ```c #include <math.h> #include <complex.h> // 定义复数结构体 typedef struct { double real; double imag; } Complex; // 计算复数虚数根函数 Complex complex_nth_root(Complex z, int n) { double r = hypot(z.real, z.imag); double theta = atan2(z.imag, z.real); // 应用De Moivre定理 double root_r = pow(r, 1.0 / n); double angle = theta / n; // 计算n次根 Complex result = {root_r * cos(angle), root_r * sin(angle)}; return result; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值