很多人第一次看到 (e^{i\theta}=\cos\theta+i\sin\theta) 这个等式时,第一反应往往是:指数里怎么会出现一个虚数?左边是一种“连续增长”对应的指数运算,右边却是两个普通三角函数,看着完全不像一家人。但正是这个等式,撑起了信号处理、电路分析、量子力学以及一切涉及旋转和振动的工程分支。我平时在项目里写傅里叶变换、滤波器设计相关代码时,几乎每天都在和它打交道——把一个复杂实信号分解成不同频率的旋转分量,底层靠的就是它。这篇文章不聊应用,只把这个等式从证明到直觉彻底讲透,再把证明过程中容易被忽略的前提条件、循环论证陷阱和我在实际验证中踩过的坑一并说清楚,适合刚接触复变函数的学生,也适合想补一补数学底子的工程师。
1. 最经典的那条路:麦克劳林级数代换背后不是“瞎换”
1.1 先把三个麦克劳林级数的底细亮出来
麦克劳林级数是泰勒级数在 (x=0) 处的特例,下面三个展开式在实数域内成立,而且收敛半径都是无穷大:
[ e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\frac{x^4}{4!}+\cdots ]
[ \sin x=x-\frac{x^3}{3!}+\frac{x^5}{5!}-\frac{x^7}{7!}+\cdots ]
[ \cos x=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\cdots ]
这三个式子看着只是“三个常见的展开”,但把它们放在一起看,很快会发现结构上的亲近感:分母都是阶乘,幂次递增,区别只在符号按 ( +-+- ) 交替,以及正弦只取奇数项、余弦只取偶数项。这种结构上的对称性,正是当年欧拉能把这个等式写出来的灵感来源之一。
如果你还不太熟悉泰勒展开,可以这样理解:任何一个足够光滑的函数,在某个点附近都能用一个无限次的多项式去逼近,而麦克劳林级数选的点就是 0。这三个函数在 0 附近的行为,被这些多项式完全刻画了。后面把 (x) 替换成 (i\theta) 时,本质上就是在做一次形式上的“变量代换”,但这次代换能成功,需要额外的收敛性保证,这一点放在 1.3 讲。
1.2 代入 iθ:幂次循环带来的实虚部拆分
虚数单位 (i) 有一个非常好的性质:它的幂次会在四个值之间循环。
[ i^0=1,\quad i^1=i,\quad i^2=-1,\quad i^3=-i,\quad i^4=1,\quad i^5=i,\cdots ]
这个循环周期是 4。把 (x=i\theta) 代入 (e^x) 的麦克劳林级数:
[ e^{i\theta}=1+i\theta+\frac{(i\theta)^2}{2!}+\frac{(i\theta)^3}{3!}+\frac{(i\theta)^4}{4!}+\frac{(i\theta)^5}{5!}+\cdots ]
利用 (i^2=-1)、(i^3=-i)、(i^4=1) 逐项化简,得到:
[ e^{i\theta}=1+i\theta-\frac{\theta^2}{2!}-\frac{i\theta^3}{3!}+\frac{\theta^4}{4!}+\frac{i\theta^5}{5!}-\cdots ]
把所有不含 (i) 的项放到一起,所有含 (i) 的项放到一起:
[ e^{i\theta}=\left(1-\frac{\theta^2}{2!}+\frac{\theta^4}{4!}-\frac{\theta^6}{6!}+\cdots\right) +i\left(\theta-\frac{\theta^3}{3!}+\frac{\theta^5}{5!}-\cdots\right) ]
前面括号正是 (\cos\theta) 的展开式,后面括号正是 (\sin\theta) 的展开式。于是:
[ e^{i\theta}=\cos\theta+i\sin\theta ]
整条证明路线就这么顺下来了。很多教程到这里就结束了,但我不建议停在“算出来刚好一样”这个层面,因为还有一个关键的数学细节被悄悄跳过了。
1.3 绝对收敛:这个证明里最值得停下来多想一层的点
为什么可以把无穷级数拆成“实部一串、虚部一串”?为什么这种重排不会改变最终结果?这里靠的不是“看起来合理”,而是级数的绝对收敛性。
看每一项的绝对值:
[ \sum_{k=0}^{\infty}\left|\frac{(i\theta)^k}{k!}\right| =\sum_{k=0}^{\infty}\frac{|\theta|^k}{k!} =e^{|\theta|} ]
这是一个有限的实数。也就是说,(e^{i\theta}) 的幂级数在复平面上是绝对收敛的。在绝对收敛的前提下,级数可以任意调整各项的先后顺序,也可以把实部和虚部分开各自求和,结果不会变。
如果丢掉绝对收敛,重排级数可能会彻底改变结果。最经典的例子是交错调和级数:
[ 1-\frac12+\frac13-\frac14+\cdots ]
它本身收敛到 (\ln 2),但通过适当重排,可以让它收敛到任意你想要的实数。这就是黎曼重排定理。所以欧拉公式能成立,不是“形式上好看”,而是有级数理论在背后兜底。
我在实际教学中发现,学生最容易在这里产生两个误解:一是以为“只要是收敛级数就能随便重排”,二是把“形式上代入”当成“证明”。这两个误解会在后面遇到更复杂的复变函数问题时反复咬人,建议第一次学就在这里停下来,把绝对收敛这个概念吃透。
2. 更省事但容易踩坑的微分方程证明
2.1 构造一个导数为零的函数
第二条路不需要展开级数,思路非常优雅:如果两个函数相等,那么它们的比值应该恒为常数。构造:
[ f(\theta)=\left(\cos\theta+i\sin\theta\right)e^{-i\theta} ]
如果 (f(\theta)) 恒为常数,并且算得 (f(0)=1),那就说明
[ \left(\cos\theta+i\sin\theta\right)e^{-i\theta}\equiv 1 ]
两边同时乘以 (e^{i\theta}),就得到了欧拉公式。
现在来求导。这里 (\theta) 是实变量,所以直接对实变量求导即可:
[ f'(\theta)=(-\sin\theta+i\cos\theta)e^{-i\theta} +(\cos\theta+i\sin\theta)(-ie^{-i\theta}) ]
把公共因子 (e^{-i\theta}) 提出来,整理括号里的内容:
[ (-\sin\theta+i\cos\theta) -i(\cos\theta+i\sin\theta) ]
这里要注意 (-i\cdot i\sin\theta=+\sin\theta),所以括号内恰好是:
[ -\sin\theta+i\cos\theta-i\cos\theta+\sin\theta=0 ]
也就是说 (f'(\theta)\equiv 0)。一个可导函数在实轴上导数为零,由中值定理可知它一定是常数。再代入 (\theta=0):
[ f(0)=(\cos 0+i\sin 0)e^{0}=1 ]
常数就是 1,证明完毕。
2.2 这个方法的优点和那个隐藏前提
微分方程证明最大的优点是计算量小,逻辑链短,几步就拿到了结果。但它有一个常被忽略的前提:计算 (e^{-i\theta}) 的导数时,默认了复指数函数的导数规则仍然服从 ((e^z)'=e^z)。
这个默认本身是对的,但要看你的“定义路线”是什么。如果你已经通过级数定义了复指数函数 (e^z=\sum z^k/k!),那么上面的求导过程完全没有问题;但如果你还处在“复指数函数到底怎么定义”的阶段,这个证明就有循环论证的嫌疑——你一边要证明 (e^{i\theta}) 等于什么,一边又把它的导数规则当作已知来用。
要避开这个坑,可以换一种表述:先定义
[ g(\theta)=\cos\theta+i\sin\theta ]
直接计算得到:
[ g'(\theta)=-\sin\theta+i\cos\theta=i(\cos\theta+i\sin\theta)=ig(\theta) ]
同时 (g(0)=1)。也就是说,(g(\theta)) 是常微分方程初值问题
[ y'=iy,\qquad y(0)=1 ]
的一个解。而在复分析里,完全可以把 (e^{i\theta}) 定义为这个初值问题的唯一解。这样一来,(g(\theta)) 和 (e^{i\theta}) 都是同一个初值问题的解,由解的唯一性,它们必须相等。
“唯一性”为什么成立?直观理解是:在复平面上,每个点处的速度方向都被方程指定了,从 ((0,1)) 这个点出发,解曲线只能沿着速度场走,没有分叉的余地。这是常微分方程理论的标准结论,虽然初学时觉得抽象,但用多了会发现它是很多证明里最有力的工具之一。
2.3 什么时候用微分方程证明更合适
如果你教的对象刚学完常微分方程、还没接触幂级数,微分方程版本是最顺的一条路。它把重点从“算级数”转移到“复指数函数是一个什么样的函数”上:它不是凭空出现的记号,而是满足“变化率等于自身乘以 (i)”的动态对象。
反过来说,如果课程顺序是从幂级数定义 (e^z) 开始的,那第一条级数证明在逻辑上更自洽。我的建议是两条路都亲手推导一遍:级数法让你相信“可以算”,微分方程法让你相信“必须等”。两者是互补关系,不是竞争关系。
3. 从 e 的起源出发:极限定义法怎么完成闭环
3.1 e^x 原始的极限定义在复平面上同样适用
很多人对 (e^x) 的第一印象是级数展开,但历史上 (e) 更本质的定义来自极限:
[ e=\lim_{n\to\infty}\left(1+\frac1n\right)^n ]
更一般地:
[ e^x=\lim_{n\to\infty}\left(1+\frac{x}{n}\right)^n ]
这个定义在实数域成立,在复数域也同样成立。把 (x=i\theta) 代入,就得到另一个证明欧拉公式的入口:
[ e^{i\theta}=\lim_{n\to\infty}\left(1+\frac{i\theta}{n}\right)^n ]
这个式子可以这样理解:把“增长”过程切分成 (n) 个微小的步骤,每一步都在当前值的基础上增加一个微小量 (i\theta/n),连续执行 (n) 次,当 (n) 趋向无穷时,得到的就是“连续复利”的最终结果。只不过这里的增长方向带了一个 (i),使得每一步都不是沿实轴伸长,而是转了一个小角度。
3.2 两个极限的计算:模长趋近 1,辐角趋近 θ
先把复数 (1+i\theta/n) 写成极坐标形式。它的直角坐标是 ((1, \theta/n)),所以:
[ r_n=\sqrt{1+\left(\frac{\theta}{n}\right)^2} ]
[ \varphi_n=\arctan\left(\frac{\theta}{n}\right) ]
于是:
[ \left(1+\frac{i\theta}{n}\right)^n =r_n^n\left(\cos(n\varphi_n)+i\sin(n\varphi_n)\right) ]
现在要分别计算两个极限。
先看模长 (r_n^n)。取对数:
[ \ln(r_n^n)=n\cdot\ln\left(1+\frac{\theta^2}{n^2}\right)\cdot\frac12 ]
当 (n) 很大时,利用 (\ln(1+t)\approx t):
[ n\cdot\frac12\cdot\frac{\theta^2}{n^2}=\frac{\theta^2}{2n}\to 0 ]
所以 (r_n^n\to 1)。
再看辐角 (n\varphi_n):
[ n\arctan\left(\frac{\theta}{n}\right) ]
当 (n) 很大时,利用 (\arctan t\approx t):
[ n\cdot\frac{\theta}{n}=\theta ]
所以 (n\varphi_n\to\theta)。
把两个极限合起来:一个模长趋近 1、辐角趋近 (\theta) 的点,在复平面上最终落在单位圆上辐角为 (\theta) 的位置,也就是:
[ \cos\theta+i\sin\theta ]
于是:
[ e^{i\theta}=\lim_{n\to\infty}\left(1+\frac{i\theta}{n}\right)^n=\cos\theta+i\sin\theta ]
这里有一个细节值得提醒:上面用到了两个等价无穷小替换,严格证明时不能只写“约等于”,要写成极限形式,并确认误差在乘以 (n) 之后依然趋近于 0。实际操作时,用 (\ln(1+t)=t+O(t^2)) 和 (\arctan t=t+O(t^3)) 就能把误差控制住。新手往往在这里一带而过,严格性不够。
3.3 极限法、级数法怎么衔接才不会绕晕
我在教学里的经验是:如果目标是让初学者最快建立直觉,可以先讲极限法,再讲级数法。极限法建立在“(e) 的定义”这个已有地基上,不引入新的复指数函数实体;级数法虽然简洁,但要先接受“把 (i\theta) 塞进实函数级数”这件事,容易让人误以为欧拉公式只是“形式替换”的巧合。
反过来,如果已经学完复变函数课程,再回头看极限法,反而会觉得它更能回答“复指数函数为什么长这样”的问题。两条路并不冲突,它们只是从不同的定义入口出发,最后汇合到同一个结论。
4. 几何直觉:圆周运动与复指数的本质同构
4.1 把 cosθ+isinθ 读作位置向量,而不是两个三角函数的拼接
在复平面上,一个点的位置可以写成:
[ z(\theta)=x(\theta)+iy(\theta) ]
那么:
[ z(\theta)=\cos\theta+i\sin\theta ]
描述的就是单位圆上以角速度 1 逆时针匀速运动的点:(x) 坐标是 (\cos\theta),(y) 坐标是 (\sin\theta)。这不是什么高深的解读,但它比“两个三角函数的拼接”有用得多,因为它把静态的等式变成了动态的过程。
对 (\theta) 求导:
[ z'(\theta)=-\sin\theta+i\cos\theta ]
仔细观察,会发现:
[ z'(\theta)=i(\cos\theta+i\sin\theta)=iz(\theta) ]
这说明速度向量等于位置向量乘以 (i)。在复平面里,乘以 (i) 的几何意义就是逆时针旋转 90 度。所以速度方向始终垂直于当前位置方向,也就是沿圆周切线方向;而速度的模长与位置模长相同,位置模长始终为 1,意味着运动不会远离圆心。这正是匀速圆周运动的速度特征。
4.2 指数函数和旋转为何是同一个故事
实指数函数 (y=e^x) 最核心的性质是 (y'=y),变化率等于自身。到了复数范围,(y=e^{i\theta}) 满足:
[ y'=iy ]
多出来的 (i) 把“自增长”变成了“自旋转”。实指数的增长是沿直线不断放大,虚指数的“增长”是沿圆弧不断转向。微分方程唯一性告诉我们:单位圆周运动 (z(\theta)=\cos\theta+i\sin\theta) 和复指数 (e^{i\theta}) 满足同一个初值问题,所以它们只能是同一个函数。
从这个角度看,欧拉公式不是“两个函数凑巧相等”,而是“单位圆周运动的代数写法就是复指数”。复数的乘法为什么会天然适合描述旋转?因为任何非零复数都能写成 (z=re^{i\theta}),模长 (r) 决定缩放,辐角 (\theta) 决定旋转。两个复数相乘时,模长相乘、辐角相加,对应的是连续两次旋转的叠加。这种几何意义是直角坐标表示完全给不了的。
4.3 一个很好用的推论:欧拉公式直接给出三角加法定理
从欧拉公式立刻可以得到指数法则:
[ e^{i\alpha}e^{i\beta}=e^{i(\alpha+\beta)} ]
把左边展开:
[ (\cos\alpha+i\sin\alpha)(\cos\beta+i\sin\beta) ]
实部是:
[ \cos\alpha\cos\beta-\sin\alpha\sin\beta ]
虚部是:
[ \sin\alpha\cos\beta+\cos\alpha\sin\beta ]
而右边 (e^{i(\alpha+\beta)}) 的实虚部分别是 (\cos(\alpha+\beta)) 和 (\sin(\alpha+\beta))。对照两边,正弦、余弦的加法定理就直接出来了。
反过来,如果你先证明了复指数满足 (e^{a+b}=e^a e^b),那么三角恒等式就成了它的直接推论。我平时推导一些带相位项的公式时,经常用这个思路替代死记硬背。比如在信号处理里,两个同频率正弦波的叠加可以统一成“两个复指数相加再取实部”,整个过程清爽很多。
5. 从证明到使用:容易翻车的细节和我踩过的坑
5.1 角度制 vs 弧度制:一个数值验证的翻车现场
麦克劳林展开、微分方程、极限定义里的 (\theta) 都默认是弧度。如果用角度制,导数公式里会多出 (\pi/180) 的因子,整个公式系统都会变得非常难看。
我第一次在 Python 里验证欧拉公式时,把角度传成了 30,以为是 30 度,结果算出来的复数和 (\cos30^\circ+i\sin30^\circ) 完全对不上。查了半天才发现是单位问题。验证时正确的写法是:
import cmath import math theta = math.pi / 6 print(cmath.exp(1j * theta)) # 输出约 (0.8660254037844387+0.49999999999999994j) print(complex(math.cos(theta), math.sin(theta))) # 输出约 (0.8660254037844387+0.49999999999999994j)在工程代码里,凡是 (e^{i\omega t}) 这类式子,(\omega) 必须是 rad/s 而不是 deg/s。这句话听起来像废话,但实际项目里真的很容易翻车,尤其是从硬件接口拿到的频率参数经常是 Hz,换算角频率时忘了乘 (2\pi) 是高频失误。
5.2 复指数函数和“代入一个数”完全是两个层次
初学者容易把 (e^{i\theta}) 理解成“把 (i\theta) 当成一个实数代进指数函数”,并且把实数域的各种指数法则原封不动搬到复数域。这在很多情况下可以工作,但遇到底数不是正实数的幂运算时,就会踩到多值性的坑。
关键区别在于:(\exp(z)) 是单值复指数函数,而 (a^z) 在底数 (a) 不是正实数时,一般定义成:
[ a^z=e^{z,\mathrm{Log},a} ]
其中 (\mathrm{Log},a) 是多值对数。比如:
[ (-1)^{1/2} ]
按实数直觉应该是“平方等于 -1 的数”,但这样的数有两个:(i) 和 (-i),到底取哪个?如果写成 (\exp(\frac12\mathrm{Log}(-1))),也会因为对数取不同分支而得到不同结果。
欧拉公式中的 (e^{i\theta}) 指的是 (\exp(i\theta)),这是一个确定的数。但如果写成 ((-1)^i) 这类形式,得到的就是一族数而不是一个数。我的建议是:在复数运算中,尽量只用 (\exp(z)) 表示“指数函数”,把 (a^z) 留给已经明确分支的场景,否则很容易在推导中得出相互矛盾的结论。
5.3 定义与定理的区别:别让证明变成循环
我见过不少文章直接把
[ e^{i\theta}=\cos\theta+i\sin\theta ]
当作定义,然后用它推出各种结论。在工程应用层面这完全没问题,反正公式本身已经是严格确认过的结论,怎么用都安全。但在数学推导层面,这会带来一个隐患:如果你把等式本身当作定义,那后面所有推导都只是“把定义展开”,并不能算作证明。
要分清自己站在哪条定义路线上:
| 定义路线 | 欧拉公式的地位 |
|---|---|
| 用幂级数定义 (e^z) | 欧拉公式是定理,可证明 |
| 用微分方程初值问题定义 (e^{i\theta}) | 欧拉公式是定理,可证明 |
| 直接把等式当作定义 | 欧拉公式是定义,后续只是展开 |
同一件事,在不同定义体系里地位不同。我在教学时一定会先让学生明确定义入口,再谈证明,否则很容易陷入“先有鸡还是先有蛋”的困惑。第 2 节和第 3 节就是两种不循环的证明路线的完整展示。
5.4 数值验证的小技巧:用极限定义做抽样测试
如果你不想背公式,也不信任手算,可以在程序里直接验证欧拉公式的极限定义。用 (n) 从 10 逐级放大到 100000,计算 ((1+i\theta/n)^n) 与 (\cos\theta+i\sin\theta) 的误差:
import math theta = math.pi / 3 for n in [10, 100, 1000, 10000, 100000]: approx = (1 + 1j * theta / n) ** n exact = complex(math.cos(theta), math.sin(theta)) print(n, abs(approx - exact))输出会看到误差随 (n) 增大快速下降,大致按 (1/n) 的量级变小。这个测试既可以验证程序实现,也可以用来理解为什么极限定义是合理的——它和“微分方程唯一解”的故事互相印证。
我个人的习惯是:凡是新接触一个用到复数的库、硬件实现或者新算法,先写一小段这样的数值对照测试,再放心使用。这比单纯信任公式推导可靠得多,尤其在项目里涉及浮点精度和单位换算的时候。
最后说一个小技巧。处理复数的极坐标形式时,我永远优先写 (z=re^{i\theta}) 而不是 (r(\cos\theta+i\sin\theta)),因为前者把“模长 (r)、辐角 (\theta)”两个信息直接摆在明面上,做乘除和开方时心算特别快。至于证明本身,我自己的体会是:三条路线不需要全背,但一定要亲手推导至少一遍。级数法负责让你相信“可以算”,微分方程法负责让你相信“必须等”,极限法负责让你相信“从哪来”。三个视角拼在一起,以后再看到带 (i) 的指数表达式,就不会觉得它是某种奇怪记号,而是真的可以参与运算的量。