欧拉公式和二维向量旋转

Posted by lili on June 14, 2025

本文介绍欧拉公式的定义。

目录

旋转矩阵

对于二维平面的向量$(a, b)$,把它逆时针旋转$\theta$,得到新的向量是$(a’, b’)$。计算方法为:

\[\begin{pmatrix} a' \\ b' \end{pmatrix} = \begin{pmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{pmatrix} \begin{pmatrix} a \\ b \end{pmatrix}\]

这个怎么来的呢?对于任意向量$(a, b)$,我们可以把它分解成两个正交的向量$(a, b) = a \mathbf{i} + b \mathbf{j}$。其中$\mathbf{i} = (1, 0)$ 和 $\mathbf{j} = (0, 1)$。上面的加法是向量(矢量)加法。

我们想象一下,如果同时把$a \mathbf{i}$和$b \mathbf{j}$都逆时针旋转$\theta$,那么这两个旋转后的向量相加就应该等于$(a’, b’)$。

参考这个视频,通过下面的图:

$a \mathbf{i}$旋转后的向量是$(a \cos \theta, a \sin \theta)$。

类似的,根据:

$b \mathbf{j}$旋转后的向量是$(-b \sin \theta, b \cos \theta)$。

把这两个向量相加就得到:

\[(a', b') = (a \cos \theta - b \sin \theta, a \sin \theta + b \cos \theta)\]

我们可以把上面的公式用矩阵乘法展开对比一下:

\[\begin{pmatrix} a' \\ b' \end{pmatrix} = \begin{pmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{pmatrix} \begin{pmatrix} a \\ b \end{pmatrix} = \begin{pmatrix} a \cos \theta - b \sin \theta \\ a \sin \theta + b \cos \theta \end{pmatrix}\]

正好就是上面的等式。

和复数乘法的关系

如果我们把旋转矩阵替换成复数$\cos \theta + i \sin \theta$,并且把向量看成复平面的复数$a + ib, a’ + ib’$,那么可以证明:

\[a' + ib' = (a + ib)(\cos \theta + i \sin \theta)\]

在证明这个结论之前,我们先看看这个式子表达的含义:对一个二维向量$v=(a,b)$做逆时针$\theta$的旋转得到旋转后的向量$v’=(a’,b’)$。这个计算过程等价于把二维向量$v=(a,b)$看成复数$v=a+bi$,然后乘以$\cos \theta + i \sin \theta$,得到新的复数$(c’+d’i)$,而且$c’=a’, d’=b’$。也就是说如果把新的复数当成向量,那么这个向量正好等于旋转后的向量。

或者再换一种简洁的说法,对一个复数$v’$(代表的向量)逆时针旋转$\theta$得到的新复数$v’$(向量),则$v’ = v \times (\cos \theta + i \sin \theta)$。这里的$\times$就是”普通的”复数乘法。下面证明一下:

用复数乘法公式把它展开(把i看成一个符号并且记得$i^2=-1$就行了):

\[\begin{align*} (a + ib)(\cos \theta + i \sin \theta) &= (a \cos \theta + i^2 b \sin \theta) + (a \sin \theta + b \cos \theta)i \\ &= (a \cos \theta - b \sin \theta) + (a \sin \theta + b \cos \theta)i \end{align*}\]

两个复数相等的条件是实部和虚部都相等,所以就可以得到:

\[a' = a \cos \theta - b \sin \theta \\ b' = a \sin \theta + b \cos \theta\]

把它写成矩阵乘以向量的形式(不会的话可以反过来用下面的式子做一下[2x2]x2的矩阵向量乘法来验证):

\[\begin{pmatrix} a' \\ b' \end{pmatrix} = \begin{pmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{pmatrix} \begin{pmatrix} a \\ b \end{pmatrix}\]

下面我们通过简单的代码示例来验证一下。

把(1,0)两次旋转45°

import torch
import numpy as np

for dtype in [torch.float32, torch.float64]: 
    print(f"dtype={dtype}")
    v = torch.tensor([1, 0], dtype=dtype)
    
    v_comp = torch.view_as_complex(v)
    rotate_angle = torch.tensor(np.pi / 4, dtype=v.dtype)
    rotate_comp = torch.polar(torch.tensor(1.0, dtype=v.dtype), rotate_angle)

    print(v_comp, rotate_comp)
    v2 = v_comp * rotate_comp
    print(f"v2={v2}")

    v3 = v2 * rotate_comp
    print(f"v3={v3}")

对于torch.float32输出的结果:

v2=(0.7071067690849304+0.7071067690849304j)
v3=(1.2688051498344066e-08+0.9999999403953552j)

torch.float64的结果是:

v2=(0.7071067811865476+0.7071067811865475j)
v3=(1.7938038903913487e-16+1j)

可以看到,即使是float64,由于浮点数的误差,旋转两个45°(也就是90°)后和精确值0+1j还是有点误差。

复数极坐标

对于旋转这样的运算,用极坐标会更加方便一些。复数(或者二维向量)的极坐标是$(r, \theta)$其中$r \ge 0, 0 \le \theta < 2\pi$。

把极坐标转换成笛卡尔坐标的方法是:

\[\begin{align*} x &= r \cos \theta \\ y &= r \sin \theta \end{align*}\]

把笛卡尔坐标转换成极坐标的方法是:

\[\begin{align*} r &= \sqrt{x^2 + y^2} \\ \theta &=atan2(y,x) \end{align*}\]

用复数乘法表示极坐标

任何一个复数$v=(r,\theta)$都可以看成是复数$(r,0)$旋转$\theta$得到,如果用复数乘法表示旋转就是$v=(r+0i)(\cos\theta + \sin \theta i)=r(\cos\theta + \sin \theta i)$。

用欧拉公式简化

根据欧拉公式:$e^{i\theta} = \cos\theta + \sin \theta i$,我们可以把一个复数写成$re^{i\theta}$。把它写成指数的形式可以简化乘法。就像实数的乘法可以写成指数的加法:

\[a^x \times a^y = a^{x+y}\]

两个复数的乘法也可以变成模的乘法和辐角的加法:

\[r_1e^{i\theta_1} \times r_2 e^{i\theta_2} = r_1r_2e^{i (\theta_1 + \theta_2)}\]

或者可以这么说:把第二个复数$r_2 e^{i\theta_2}$乘以第一个复数$r_1e^{i\theta_1}$,等价于先把第一个复数的模缩放(乘以)第二个复数的模,然后把第一个复数逆时针旋转$\theta_2$的角度。

而前面的$e^{i\theta} = \cos\theta + \sin \theta i$,这个复数的模(长度)是1,所以它乘以另外一个复数的效果就是纯粹的旋转,没有长度的变化。

在讨论复数向量旋转时经常会看到欧拉公式$e^{ix} = \cos x + i \sin x$。虽然还依稀记得这个公式,但这个公式是怎么来的,它有什么用完全忘掉了,所以找Gemini问了一下。下面是根据它的回答总结的我的看法。

欧拉公式是什么意思

我们再睁大眼睛仔细观察一下欧拉公式:

\[e^{i\theta} = \cos\theta + \sin \theta i\]

我们看到一个陌生的符号首先就要想到它的定义,那么这里涉及三个重要的定义,一个是虚(复)数i;另外一个就是指数;最后一个就是虚(复)指数。

欧拉公式(Euler’s formula)是一个公式(废话!),那么它究竟是定义出来的还是证明出来的呢?在回答这个问题之前,我们需要先知道复指数$e^{ix}$的定义。要知道复指数我们得从最基本的说起。

“指数”这个概念在数学中是一个非常基础且重要的概念,它的定义随着我们所研究的数集范围的扩大而逐步推广。

指数

1. 自然数指数(最基本形式)

这是我们最早接触到的指数定义,表示重复乘法。

定义: 对于一个实数 $a$(称为底数)和一个正整数 $n$(称为指数或幂次),$a^n$ 定义为 $n$ 个 $a$ 相乘: \(a^n = \underbrace{a \times a \times \dots \times a}_{n \text{ times}}\)

例子:

  • $2^3 = 2 \times 2 \times 2 = 8$
  • $(-5)^2 = (-5) \times (-5) = 25$
  • $x^4 = x \times x \times x \times x$

2. 零指数

为了保持指数运算的性质(如 $a^{m+n} = a^m \cdot a^n$),零指数被定义为 1。

定义: 对于任何非零实数 $a$,定义 $a^0 = 1$。

例子:

  • $7^0 = 1$
  • $(-100)^0 = 1$
  • $(\frac{1}{2})^0 = 1$

注意: $0^0$ 在数学上是一个不定式(indeterminate form),其值在不同上下文中可以有不同的约定(例如在组合数学中常约定为 1,但在极限运算中需具体分析)。在通常的指数定义中,我们避免讨论 $0^0$。

3. 负整数指数

为了进一步保持指数运算的性质(如 $a^{m-n} = \frac{a^m}{a^n}$),负整数指数被定义为倒数的形式。

定义: 对于任何非零实数 $a$ 和正整数 $n$,定义 $a^{-n} = \frac{1}{a^n}$。

例子:

  • $2^{-3} = \frac{1}{2^3} = \frac{1}{8}$
  • $10^{-2} = \frac{1}{10^2} = \frac{1}{100}$

4. 有理数指数(分数指数)

有理数指数通过根式来定义,使得指数运算能够推广到分数。

定义: 对于非负实数 $a$ 和任意有理数 $\frac{m}{n}$(其中 $m$ 是整数,$n$ 是正整数),定义 $a^{\frac{m}{n}} = \sqrt[n]{a^m} = (\sqrt[n]{a})^m$。

例子:

  • $8^{\frac{1}{3}} = \sqrt[3]{8} = 2$
  • $9^{\frac{3}{2}} = (\sqrt{9})^3 = 3^3 = 27$
  • $4^{-0.5} = 4^{-\frac{1}{2}} = \frac{1}{\sqrt{4}} = \frac{1}{2}$

注意: 当底数 $a$ 为负数时,只有当分母 $n$ 为奇数时,$\sqrt[n]{a}$ 才有实数定义。因此,有理数指数通常要求底数为非负数,以避免歧义和复杂性。

5. 无理数指数(实数指数)

当指数是无理数时,例如 $2^{\sqrt{2}}$,我们不能用重复乘法或根式来直接定义。它的定义依赖于极限的概念。

定义: 对于一个正实数 $a$ 和一个无理数 $x$,定义 $a^x = \lim_{q \to x} a^q$,其中 $q$ 是一个有理数,且 $q$ 趋近于 $x$。 这实际上是通过有理数指数的连续性来推广的。

例子:

  • $2^{\pi}$
  • $e^{\sqrt{2}}$

6. 复数指数(最广义形式)

当指数和/或底数可以是复数时,指数的定义进一步推广,通常通过泰勒级数或欧拉公式来定义。

定义: 对于复数 $z$,指数函数 $e^z$(或 $\exp(z)$)通常定义为它的泰勒级数展开: \(e^z = \sum_{n=0}^{\infty} \frac{z^n}{n!} = 1 + z + \frac{z^2}{2!} + \frac{z^3}{3!} + \dots\) 对于任意底数 $a$($a \ne 0$)和复数 $z$,定义 $a^z = e^{z \ln a}$。这里 $\ln a$ 是复数的自然对数,它是一个多值函数,所以 $a^z$ 也是一个多值函数。

例子:

  • $e^{i\pi} = \cos \pi + i \sin \pi = -1$ (这是著名的欧拉恒等式)
  • $i^i = e^{i \ln i} = e^{i(i\frac{\pi}{2} + 2k\pi i)} = e^{-\frac{\pi}{2} - 2k\pi}$ (其中 $k$ 是整数,这是一个实数集合)

总结

“指数的定义”是一个层层递进的概念,从最简单的重复乘法开始,通过保持运算性质的推广,逐步扩展到零、负数、有理数、无理数,直到最终的复数指数。每一次推广都使得指数运算能够在一个更大的数域中保持其一致性和重要性质。

欧拉公式的推导

有了复数指数的定义,我们就可以推导欧拉公式了。

  • 前提:
    • 指数函数 $e^z$ 的定义:对于任何复数 $z$,其泰勒级数展开为: $e^z = \sum_{n=0}^{\infty} \frac{z^n}{n!} = 1 + z + \frac{z^2}{2!} + \frac{z^3}{3!} + \frac{z^4}{4!} + \dots$
    • 正弦函数 $\sin x$ 的定义:对于任何实数 $x$,其泰勒级数展开为: $\sin x = \sum_{n=0}^{\infty} \frac{(-1)^n x^{2n+1}}{(2n+1)!} = x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \dots$
    • 余弦函数 $\cos x$ 的定义:对于任何实数 $x$,其泰勒级数展开为: $\cos x = \sum_{n=0}^{\infty} \frac{(-1)^n x^{2n}}{(2n)!} = 1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \dots$
  • 证明过程: 现在,我们将 $z = ix$ 代入 $e^z$ 的泰勒级数展开式: $e^{ix} = 1 + (ix) + \frac{(ix)^2}{2!} + \frac{(ix)^3}{3!} + \frac{(ix)^4}{4!} + \frac{(ix)^5}{5!} + \dots$ $e^{ix} = 1 + ix + \frac{i^2 x^2}{2!} + \frac{i^3 x^3}{3!} + \frac{i^4 x^4}{4!} + \frac{i^5 x^5}{5!} + \dots$ 由于 $i^2 = -1, i^3 = -i, i^4 = 1, i^5 = i, \dots$,我们可以将上述级数分成实部和虚部: $e^{ix} = (1 - \frac{x^2}{2!} + \frac{x^4}{4!} - \frac{x^6}{6!} + \dots) + i(x - \frac{x^3}{3!} + \frac{x^5}{5!} - \frac{x^7}{7!} + \dots)$ 通过与 $\cos x$ 和 $\sin x$ 的泰勒级数展开式进行比较,我们发现: $e^{ix} = \cos x + i \sin x$

欧拉公式在复数向量旋转中的作用