FFT 精度误差分析

发布时间 2023-05-06 23:15:59作者: skip2004

可能写的有错的,也可能没有,大家看着当个乐子就好。

FFT 是 oi 中常用的一种算法,但是我们没有关心过它的精度,所以我们现在来关心一下。

我们知道对于一个长度为 \(n\) 的向量 \(\alpha\),我们对它做 DFT,相当于左乘了一个正交矩阵 \(T\)(我们知道常规的 DFT 中做的不是标准的正交变换,但是如果每轮后将所有数除以 \(\sqrt{2}\) 就是了,因此下文中都以这种方式分析)

正交矩阵有着很好的性质,就是它相当于一个旋转,即:\(||\alpha||_2 = ||T \alpha||_2\),因此,我们考虑从 \(L_2-norm\) 入手分析误差。

我们的 \(DFT\) 算法可以看成很多步骤,每次蝴蝶变换都相当于乘上一个正交矩阵 \(M_i\),我们要乘 \(m=\log_2(n)\) 个正交矩阵,即 \(T=\prod_{i=1}^m m_{m+1-i}\)

因此

\[T \alpha=M_m \cdots M_2 M_1 \alpha \]

但是我们知道,每一轮蝴蝶变换都会引入新的误差,我们用 DFT 表示计算机中的函数,因此,在计算机运算中,我们可以用这一个式子精确表示结果:

\[DFT(\alpha) = M_m(\cdots M_2 (M_1 \alpha + \epsilon_1)+ \epsilon_2)\cdots) + \epsilon_m \]

我们现在来分析一下 \(\epsilon_1\) 的精度,我们不妨假设 \(||\alpha||_2 \leq 1\)(利用浮点数的性质,我们可以进行放缩)。

我们容易分析出 \(||\epsilon_1||_2 = O(\epsilon)\),其中 \(\epsilon\) 是机器浮点数所保证的精度。

由三角不等式 \(||\alpha + \beta||_2 \leq ||\alpha||_2 + ||\beta||_2\),我们可以轻松得到 \(||\epsilon_i||_2 = O(\epsilon)\)\(||DFT(\alpha) - T\alpha||_2=O(\log_2 n \epsilon)\)

我们就分析出了 DFT 的精度误差,卷积的精度误差留作练习(没啥区别)。