浅谈范德蒙德(Vandermonde)方阵的逆矩阵与拉格朗日(Lagrange)插值的关系以及快速傅里叶变换(FFT)中IDFT的原理
标签: 行列式 矩阵 线性代数 FFT 拉格朗日插值
只要稍微看过一点线性代数的应该都知道范德蒙德行列式。
V(x0,x1,⋯,xn−1)=⎡⎢
⎢
⎢
⎢
⎢
⎢
⎢
⎢⎣11⋯1x0x1⋯xn−1x20x21⋯x2n−1⋮⋮⋮xn−10xn−11⋯xn−1n−1⎤⎥
⎥
⎥
⎥
⎥
⎥
⎥
⎥⎦
而范德蒙德行列式由于其本身的特殊性,具有通项公式:
V(x0,x1,⋯,xn−1)=∏n>i>j≥0(xi−xj)
我们同样可以把行列式中的项写到矩阵中来,即范德蒙德方阵
V=⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝11⋯1x0x1⋯xn−1x20x21⋯x2n−1⋮⋮⋮xn−10xn−11⋯xn−1n−1⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠
考虑范德蒙德方阵的逆矩阵,我们可以借助伴随矩阵来计算。
对于V的伴随矩阵V∗
(V∗)ij=cij
其中cij为V的代数余子式
有V−1=V∗det(V)
那么对于每一项,有(V−1)ij=cijdet(V)
我们只需要知道每一个代数余子式其与行列式的商即可。
而然这种方法比较复杂,尤其对于缺失了一行的范德蒙德行列式难以计算,而本文的重点并不在此,如果想找详细的证明可以去看这篇博客Vandermonde 矩陣的逆矩陣公式
最后可以得到
(V−1)ij=(−1)j+1∑0≤p1<⋯<pn−j<n; p1,p2,⋯pn−j≠ixp1xp2⋯xpn−j∏0≤k<n; k≠i(xk−xi)
上面的方法太过复杂,接下来我们考虑范德蒙德方阵的实际意义进行思考。
重新审视方阵,发现乘上一个范德蒙德方阵相当于带进了n个点进行求值,即
⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝a0a1a2⋮an−1⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠T⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝11⋯1x0x1⋯xn−1x20x21⋯x2n−1⋮⋮⋮xn−10xn−11⋯xn−1n−1⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠=⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝y0y1y2⋮yn−1⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠T
相当于有多项式f(x)=∑n−1i=0aixi,其中yi=f(xi)
乘上范德蒙德方阵相当于带入n个点求值,反过来,乘上其逆矩阵就应该是用n个点插值。
即
⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝a0a1a2⋮an−1⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠T=⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝y0y1y2⋮yn−1⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠T⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝11⋯1x0x1⋯xn−1x20x21⋯x2n−1⋮⋮⋮xn−10xn−11⋯xn−1n−1⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠−1
那么我们考虑拉格朗日插值,有
f(x)=∑iyi∏j≠ix−xjxi−xj
显然,(V−1)ij为∏k≠ix−xkxi−xk在xj−1项的系数。
快速傅立叶变换的核心思想也是将系数向量迅速变换为点值向量,再迅速的将点值向量还原成系数向量,其中还原的操作我们称之为IDFT。
用1的n次复根w,如果没有特别说明,以下本文中的w都为e2πn
在做快速傅立叶变换的时候,我们乘上了一个V(w0,w1,⋯,wn−1)的矩阵。
而在IDFT时,我们需要乘上V(w0,w1,⋯,wn−1)−1,但是在实际应用中,我们会直接乘上1nV(w0,w−1,⋯,w−n+1)。接下来笔者将证明这两个矩阵是相同的。(当然我们默认n为2的次幂)
∏j≠i(x−wj)(wi−wj)=∏j≠i(x−wj)∏j≠i(wi−wj)
不妨令G(x)=∏0≤j<n(x−wj)
而w0,w1,⋯,wn−1都是1的n次复根,根据代数基本定理,显然有G(x)=xn−1
那么考虑原式分母$$\prod\limits_{j\ne i} (wi-wj) = \lim _{x \to w^i}{G(x) \over {x-w^i}}$$
根据洛必达法则,这个极限的值相当于上下部分求导的商。
limx→wiG(x)x−wi=limx→wiG′(x)=n×wi(n−1)=n×w−i
原式分子
∏j≠i(x−wj)=G(x)x−wi=1−xnwi−x=w−i×(11−xw−i−xn1−xw−i)=w−i×(∑∞j=0w−ijxj−∑∞j=nw−i(j−n)xj)=w−i×n−1∑j=0w−ijxj
分子除以分母,得
原式=w−i×n−1∑j=0w−ijxjn×w−i=n−1∑j=0w−ijnxj
对比各项系数,不难得出两矩阵相同,即
⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝11⋯11w1⋯wn−11w2⋯w(n−1)2⋮⋮⋮1wn−1⋯w(n−1)(n−1)⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠−1=1n⎛⎜
⎜
⎜
⎜
⎜
⎜
⎜⎝11⋯11w−1⋯w−(n−1)1w−2⋯w−(n−1)2⋮⋮⋮1w−(n−1)⋯w−(n−1)(n−1)⎞⎟
⎟
⎟
⎟
⎟
⎟
⎟⎠
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现