• 【几何系列】复数基础与二维空间旋转


    本文我们讨论复数及其旋转的含义。复数很有意思,本文介绍了复数的基本定义和性质,以及它关于旋转的几何意义。

    复数对于旋转的表示非常重要:

    1. 它引入了旋转算子(rotational operator)的思想:可以通过复数表示一个旋转变换。

    2. 它是四元数多向量的内在属性。

    虽然我们暂时不讨论四元数多向量(后面文章会介绍),但是我们会讨论复数的旋转含义(复平面上的 2D 旋转),以及引入的旋转子(rotor),我们发现通过特定的复数可以描述一个 2D 旋转。

    介绍

    复数(complex number)又称为数字王国中的“国王”,它可以解决普通实数不能很好解决的问题。

    例如,对于以下方程:

    $$x^2+1=0$$

    尽管方程如此简单,但并没有实数解。实际上,实数无法解决这样的问题:

    $$x=sqrt{-1}$$

    但这没有妨碍数学家们找到解决此类问题的方法,他们提出一个很牛很简单的思想,就是承认 $i$ 的存在,它满足 $i^2=-1$,于是前面的方程我们可以解出:

    $$x=pm i$$

    那么 $i$ 到底是什么呢?我们可以不必纠结,$i$ 就是数学家提出的数学工具,一个简单的数学对象,满足 $i^2=-1$。本文会探讨这个数学工具对于旋转如何发挥作用。

    复数基础

    复数的定义

    复数由两个部分组成:实部(real part)虚部(imaginary part)。实部就是我们平常遇到的数(正数、负数、0),而虚部是一个实数和 $i$ 的乘积。

    例如,$2+3i$ 是一个复数,2 是实部,$3i$ 是虚部。

    复数集就像是实数集的扩展,它包含了所有实数(虚部为 0)。而虚部不为 0 的复数不是实数。以下都属于复数:

    • 2
    • $2+2i$
    • $1-3i$
    • $-4i$
    • $17i$
    • $isin heta$
    • $4.5+icos heta$

    不过在 Python 中,复数的 $i$ 符号用 $j$ 表示,在 Jupyter 中运行 Python:

    1 z = 3 + 4j
    2 z, z.real, z.imag   # 复数、实部、虚部

    输出:

    ((3+4j), 3.0, 4.0)
    5.0

    复数的公理

    下面的公理体现了复数的性质。对于任意的复数 $z_1$、$z_2$ 和 $z_3$,满足:

    • 加法交换律:$z_1+z_2=z_2+z_1$
    • 加法结合律:$(z_1+z_2)+z_3=z_1+(z_2+z_3)$
    • 乘法交换律:$z_1z_2=z_2z_1$
    • 乘法结合律:$(z_1z_2)z_3=z_1(z_2z_3)$
    • 乘法分配律:$z_1(z_2+z_3)=z_1z_2+z_1z_3$、$(z_1+z_2)z_3=z_1z_3+z_2z_3$

    其实复数的这些加法和乘法的公理和实数一样的。由于复数集里面包含实数集,如果不和实数一致,反而比较奇怪的。

    复数的模

    模(modulus)长度的含义。对于复数 $z=a+bi$,它的模定义为:

    $$left | z ight |=sqrt{a^2+b^2}$$

    例如,$3+4i$ 的模为 5。

    后面我们会看到,模定义在复数的极坐标表示中的作用。

    例子:

    abs(3 + 4j)   #

    输出:

    5.0

    复数的加减

    对于两个复数:$z_1=a+bi$ 和 $z_2=c+di$,其加减法为

    $$z_1pm z_2=(apm c)+(bpm d)i$$

    即实部和虚部分别相加减。

    例子:

    (2 + 3j) + (3 - 4j)  # 加法

    输出:

    (5-1j)

    复数的标量乘法

    标量乘法同样符合我们的直觉。对于标量 $lambda$ 和复数 $a+bi$,有

    $$lambda(a+bi)=lambda a+lambda bi$$

    例如:

    $$2(3+5i)=6+10i$$

    2 * (3 + 5j)  # 标量乘法

    输出:

    (6+10j)

    两个复数的乘积

    两个复数的乘积就是各项分别相乘并相加。对于两个复数 $z_1=a+bi$ 和 $z_2=c+di$,有

    egin{align*}
    z_1z_2 &= (a+bi)(c+di)\
    &= ac+adi+bci+bdi^2\
    &= (ac-bd)+(ad+bc)i
    end{align*}

    例如,对于 $z_1=3+4i$ 和 $z_2=5-2i$,有

    egin{align*}
    z_1z_2 &= (3+4i)(5-2i)\
    &= 15-6i+20i-8i^2\
    &= 23+14i
    end{align*}

    可以看到。两个复数的加减和乘积都是一个复数。

    (3 + 4j) * (5 - 2j)  # 两复数的乘法

    输出:

    (23+14j)

    共轭复数

    两个复数相乘还有个特殊情况:

    egin{align*}
    (a+bi)(a-bi)&=a^2-b^2i \
    &= a^2+b^2
    end{align*}

    其中 $a-bi$ 称作是 $a+bi$ 的共轭复数(conjugate complex number),又称复共轭、复数共轭。

    更一般的定义,$z=a+bi$ 的共轭复数用 $ar{z}$ 或 $z^*$ 表示,其中:

    $$z^*=a-bi$$

    $$zz^*=a^2+b^2=left |z  ight |^2$$

    例子:

    (3 + 4j).conjugate()  # 共轭复数

    输出:

    (3-4j)

    两个复数的除法

    利用共轭复数的性质,我们再来看复数的除法。

    对于 $z_1=a+bi$ 和 $z_2=c+di$,其中 $z_2 eq 0$。

    那么,

    egin{align*}
    frac{z_1}{z_2}&=frac{z_1z_2^*}{z_2z_2^*} \
    &= frac{z_1z_2^*}{left | z_2 ight |^2} \
    &= frac{(a+bi)(c-di)}{c^2+d^2} \
    &= frac{(ac+bd)+(bc-ad)i}{c^2+d^2}
    end{align*}

    例子:

    egin{align*}
    frac{4+3i}{3+4i}&=frac{(4*3+3*4)+(3*3-4*4)i}{3^2+4^2} \
    &= frac{24}{25}-frac{7}{25}i
    end{align*}

    (4 + 3j) / (3 + 4j)  # 两复数的除法

    输出:

    (0.96-0.28j)

    复数的逆

    已知一个复数 $z eq 0$,定义它的逆 $z^{-1}=frac{1}{z}$。利用共轭复数的性质,我们可以推导:

    $$frac{z^{-1}}{z^*}=frac{1}{zz^*} = frac{1}{left | z ight |^2}$$

    $$Rightarrow z^{-1}=frac{z^*}{left | z ight |^2}$$

    例子:

    egin{align*}
    frac{1}{3+4i} &=(3+4i)^{-1} \
    &= frac{3-4i}{25} \
    &= frac{3}{25}-frac{4}{25}i
    end{align*}

    检查:$(3+4i)(frac{3}{25}-frac{4}{25}i)=frac{9}{25}-frac{12}{25}i+frac{12}{25}i+frac{16}{25}=1$

    1 / (3 + 4j)  # 复数求逆

    输出:

    (0.12-0.16j)

    复数与旋转

    首先,考虑一条实数轴,想象对于一个实数而言,与它的相反数究竟有什么关系?

    我们可以把相反数看成:原实数绕原点旋转了 180°

    例如,“2” 旋转 180° 后变成 -2,“-3” 旋转 180° 后变成 “3”。由于复数的定义,我们可以把相反数 $-n$ 写成:

    $$-n=i^2n$$

    于是我们可以把乘以 $i^2$ 看成是绕原点 180° 的旋转。那么乘以 $i$ 表示什么呢?

    90° 的旋转

    复平面

    当我们用复数的实部和虚部构建一个 2D 坐标系,这就是复平面(complex plane)。复平面的横坐标表示实部,纵坐标表示虚部。

    使用复平面,我们来观察这个 90° 的旋转是什么意思。

    下面我们画出 4 个复数:$z_1=1+2i$、$z_2=-2+i$、$z_3=-1-2i$、$z_4=2-i$,它们分别可以代表 4 个长度相等的向量:$u$、$v$、$w$、$a$。之所以长度相等,是因为这 4 个复数的模相等。

    我们可以看到它们依次逆时针旋转 90°。例如,

    对 $u$ 旋转 90°:$i(1+2i)=-2+i=v$,得到 $v$。

    对 $v$ 旋转 90°:$i(-2+i)=-1-2i=w$,得到 $w$。

    对 $w$ 旋转 90°:$i(-1-2i)=2-i=a$,得到 $a$。

    对 $a$ 旋转 90°:$i(2-i)=1+2i=u$,得到 $u$。

    于是我们发现,要对一个复数(这个复数在复平面可以表示为一个 2D 向量)旋转 90°,只需乘以 $i$ 即可。

    几百年前,Euler 通过复平面把复数画了出来,而其中蕴含的“复数可以表示旋转”的思想,在现在很多领域得到了应用。

    极坐标表示

    我们再整理一下上两节的内容。我们实际上发现:复数在几何上的有一些有意思的性质。

    如果我们用复数来表示一个 2 维直角坐标系上的向量的话(当然复数是一个数学工具,也可以表示其他含义),看起来乘以 $i$ 表示旋转 90°。

    那么自然地,我们就会去进一步思考,如果旋转任意角度应该怎么表达呢?旋转 45° 究竟是乘以 $frac{1}{2}i$,还是乘以 $sqrt{i}$,还是乘以其他的什么东西?

    以及,为什么乘以复数会表示旋转?

    为了解决这两个问题,我们开始引入复平面上的极坐标表示

    在这样的极坐标下,复数 $z=a+bi$ 可以通过长度 $left r=| z ight |$ 和角度 $ heta=arg(z) $ 来唯一确定。

    长度 $r$ 等于复数的模,而角度 $ heta$ 是实数轴和复数所表示的向量的夹角,称为幅角(argument),记为 $arg(z)$。接下来根据三角函数,我们有 $a=rcos heta $ 和 $b=rsin heta $,于是可以得到:

    egin{align*}
    z&=a+bi \
    &=rcos heta+irsin heta \
    &=r(cos heta+isin heta)
    end{align*}

    根据欧拉公式 $e^{i heta}=cos heta+isin heta$,复数的极坐标表示可以写成更为简洁的形式:

    $$z=re^{i heta}$$

    关于欧拉公式

    Euler 提出的欧拉公式体现了自然底数 $e$ 和三角函数 $sin heta$、$cos heta$ 之间的关系。

    关于它的含义一眼看去并不直观。欧拉方程的其中一种证明方法是利用泰勒级数展开式把 $e^x$ 、$cosx$ 和 $sinx$ 关联起来。以下是简单证明。

    根据级数展开:

    $$e^{i heta}=1+(i heta)+frac{(i heta)^2}{2!}+frac{(i heta)^3}{3!}+...$$

    $$cos heta=1-frac{ heta^2}{2!}+frac{ heta^4}{4!}-frac{ heta^6}{6!}+...$$

    $$sin heta=1-frac{ heta^3}{3!}+frac{ heta^5}{5!}-frac{ heta^7}{7!}+...$$

    根据复数的定义 $i^2=-1$,于是有:

    egin{align*}
    e^{i heta} &= 1 + i heta - frac{ heta^2}{2!} - ifrac{ heta^3}{3!} + frac{ heta^4}{4!}+ifrac{ heta^5}{5!}- frac{ heta^6}{6!} - ifrac{ heta^7}{7!}+...\
    &= (1-frac{ heta^2}{2!}+ frac{ heta^4}{4!}- frac{ heta^6}{6!}+...)+i( heta-frac{ heta^3}{3!}+frac{ heta^5}{5!}-frac{ heta^7}{7!}+...) \
    &=cos heta+isin heta
    end{align*}

    到了这种表达形式后,我们再看两个复数的乘法,就会发现它的几何含义。

    给定两个任意用极坐标表示的复数:$z_1=r_1e^{i heta _1}$ 和 $z_2=r_2e^{i heta _2}$。那么我们会得到:

    egin{align*}
    z_1z_2 &= r_1r_2e^{i heta _1}e^{i heta _2} \
    &= r_1r_2e^{i( heta _1+ heta _2)}
    end{align*}

    可以看到,两个复数的乘积得到另一个复数。

    它的模等于两个复数的模的乘积:$left | z_1z_2 ight |=r_1r_2$。

    它的幅角等于两个复数的幅角的和:$arg(z_1z_2)= heta _1+ heta _2$

    于是看起来,考虑复平面这个几何情形,乘以一个复数,可以同时带来两种变换的效果

    1. 长度的缩放(通过改变模长)。

    2. 旋转(通过改变幅角)。

    旋转子

    接下来一个很自然的想法,就是:乘以一个什么样的复数,不会产生缩放,只会产生旋转

    显然,通过前面极坐标下自然底数的表达形式的推导,我们知道乘以一个模为 1 的复数时,不会导致缩放,只会产生旋转

    这样的复数就称为旋转子(rotor),旋转子提供了“纯”旋转动作的数学表示,它可以将复数旋转任意角度。一般而言,将复数旋转角度 $ heta$ 的旋转子定义为:

    $$R_ heta =cos heta + isin heta =e^{i heta}$$

    例如,对于复数 $2+2i$,我们如果需要对它进行逆时针 45° 的旋转,需要乘以:

    $$1cdot e^{icdot 45^{circ}}=cos45^{circ}+isin45^{circ}=frac{sqrt{2}}{2}+frac{sqrt{2}}{2}i$$

    我们通过手算计算出其乘积为 $2sqrt{2}i$

    $$(frac{sqrt{2}}{2}+frac{sqrt{2}}{2}i)(2+2i)=sqrt{2}+sqrt{2}i+sqrt{2}i+sqrt{2}i^2=2sqrt{2}i$$

    如果通过 Python 计算会得到其对应的结果:

    1 from math import pi, cos, sin
    2 
    3 theta = pi / 4  # 定义角度
    4 z1 = 2 + 2j
    5 z2 = cos(theta) + 1j * sin(theta)
    6 print(z1)
    7 print(z2)
    8 print(z1 * z2)

    输出:

    (2+2j)
    (0.7071067811865476+0.7071067811865476j)
    2.8284271247461903j

    通过下图,我们看到了旋转子的“纯”旋转效果。

    接下来,我们看看旋转子的共轭复数是什么。由于旋转子模为 1,而根据前面共轭复数的定义,我们不难证明:旋转子的共轭复数等于该旋转子的逆

    对于旋转子 $R_ heta=e^{i heta}=cos heta+isin heta$,

    它的共轭复数:$(R_ heta)^*=cos heta-isin heta=cos(- heta)+isin(- heta)=R_{- heta}$

    它的逆:$e^{i heta}e^{-i heta}=1Rightarrow (R_ heta)^{-1}=e^{-i heta}=R_{- heta}$

    那么接着前面的例子,$z_1$ 乘以 $z_2$ 的共轭复数(或者逆)后的效果,是顺时针旋转 45°

    $z_2$ 的共轭复数(或者逆)为:$R_{- heta}=frac{sqrt{2}}{2}-frac{sqrt{2}}{2}i$

    手算:$(frac{sqrt{2}}{2}-frac{sqrt{2}}{2}i)(2+2i)=sqrt{2}-sqrt{2}i+sqrt{2}i-sqrt{2}i^2=2sqrt{2}$

    用代码计算结果:

    1 z3 = z2.conjugate()  # z2 的共轭复数
    2 print(z3)
    3 print(z1 * z3)

    输出:

    (0.7071067811865476-0.7071067811865476j)
    (2.8284271247461903+0j)

    最后再看看复平面图,确认复数 $z_1$ 沿着相反方向旋转 45°:

     “逆”的含义也在于此,既然旋转子表示旋转任意角度,那么它的逆就应该是“抵消”这种旋转效果,于是它的作用就是朝相反的方向旋转对应的角度

    到此为止,我们已经可以用复数表示二维空间的任意旋转角度,并且利用复数的逆/共轭复数来表示旋转的抵消作用。后面我还会继续发布与旋转有关的文章。

    原文作者:雨先生
    原文链接:https://www.cnblogs.com/noluye/p/11964513.html
    许可协议:知识共享署名-非商业性使用 4.0 国际许可协议

    总结

    • 我们谈了复数的基础:复数的定义、公理、加减乘除、模、共轭复数、逆。复数域对实数域进行了很好的扩展,使我们可以去描述旋转。
    • 我们定义了复平面,作为我们讨论的二维直角坐标系。
    • 我们首先给出了复数的极坐标表示,并且利用欧拉公式推导出了等价的自然底数的表示。到了这一步,复数对于二维旋转的刻画性质已经呼之欲出。
    • 复数的乘法运算表现了伸缩旋转的两种性质,通过对模进行约束(模长等于 1),我们最终得到只表示旋转的复数,称为旋转子
    • 在旋转子中,共轭复数和逆是相等的,而逆表示相反方向的旋转

    参考

    • Rotation Transforms for Computer Graphics by John Vince
    • 欧拉公式
  • 相关阅读:
    C++-POJ1020-Anniversary Cake[搜索][dfs]
    C++-POJ1988-Cube Stacking[数据结构][并查集]
    大佬的代码
    C++-POJ3349-Snowflake Snow Snowflakes[STL][set][hash未写]
    C++-POJ3274-Gold Balanced Lineup[hash]
    ListView 在设备切换横竖屏时保存状态
    Android Studio 常见命令
    android textView 总是有paddingtop怎么解决
    ionic build Android错误记录 error in opening zip file
    git grep 或者 ag 进行快速代码搜索
  • 原文地址:https://www.cnblogs.com/noluye/p/11964513.html
Copyright © 2020-2023  润新知