切比雪夫多项式近似原理讲解

📅 2026/7/23 20:25:27
切比雪夫多项式近似原理讲解
切比雪夫多项式切比雪夫多项式Chebyshev polynomials近似是一种在数值分析中用来逼近函数的强大方法它的核心思想是在区间[-1, 1]上用切比雪夫多项式的线性组合来逼近一个连续函数使得最大逼近误差在某种意义下达到最小从而避免像泰勒级数那样在端点附近产生巨大的误差龙格现象。普通的多项式逼近如泰勒展开是基于函数在某一点的各阶导数信息它在展开点附近精度高但在区间端点处误差可能急剧增大。这对于需要在整个区间内保持“一致精度”的问题如计算数学、信号处理是不利的。切比雪夫近似则追求在定义域内让多项式逼近的最大绝对误差尽可能小。这是一个“最小化最大误差”问题也叫“最佳一致逼近”。假设我们想用次数不超过 n 的多项式来逼近区间上的一个足够光滑的函数。有很多种构造方式比如切比雪夫级数截断、切比雪夫节点插值等。一种标准的误差分析来自多项式插值或带余项的展开。考虑在 n1 个不同节点上做插值得到插值多项式。对于任意存在某个使得这里定义是一个首一多项式最高次项系数为1。于是逼近误差的绝对值满足因此在全区间上最大误差上界由决定。为了获得尽可能小的误差上界即让逼近效果更好我们当然希望尽可能小。注意是一个首一多项式因为它是由节点决定的 n1 次多项式且最高次项系数为1。于是问题转化为在所有可能的 n1 次首一多项式中哪一个在上的最大绝对值最小设是次数为 n 的首一多项式。定义要求找到使得最小并求出这个最小值。切比雪夫意识到如果是最优的即取得最小最大绝对值那么它在上必须交替地达到 M 和 -M 至少 n1 次。为什么记 M 为最优点处的最大绝对值。那么区间上有些点 x 满足这些点称为极值点。在这些点上要么等于 M要么等于 -M。为什么必须交替达到 M 和 -M考虑一个简单情形如果最优多项式只在某些点取 M却从来没有取 -M那么我们可以整体向下平移一点减去一个很小的正数得到的新多项式。由于且从不达到 -M适当小的可以使的最大值小于 M。但这样会改变首项系数吗不会因为减去常数不影响最高次项。所以我们得到了一个最大绝对值更小的首一多项式与的最优性矛盾。类似地如果正负极值点不交替出现例如出现两个相邻的 M 之间没有 -M我们也可以构造一个微调比如加上一个与正交的微小多项式来降低峰值。严格证明需要用到多项式逼近中的一个引理如果最优多项式在某个子区间上保持同号那么可以通过添加一个与该区间上符号一致的小的多项式来“削平”峰值。关键的“至少 n1 次”从何而来这是次数 n 的多项式能达到的最大振荡次数。考虑误差函数即多项式本身。为了让最大绝对值尽可能小必须在区间内尽可能“来回摆动”使得峰值被均匀钳制。如果只有 k 个交替的极值点正负交替那么可以构造一个次数小于等于 k-1 的多项式作为修正项在不增加最高次项的情况下降低峰值。只有当时才能保证任何这样的修正多项式的次数都会达到 n从而无法在不破坏首一性的前提下降低最大值。假设最优只有个交替极值点。那么可以找到一个非零多项式q(x)次数小于等于使得 q(x) 在极值点上的符号与相同。那么对于足够小的的最大绝对值严格小于 M且首项系数仍为1因为 q 次数低于 n。这与最优性矛盾。因此 r 不可能小于 n1。所以至少需要 n1 个交替的极值点才能“堵死”所有可能的降峰值修正。对于 n 次多项式在整个区间 [-1,1] 上包括端点极值点的个数不可能超过 n1。因为多项式的导数是 n-1 次最多有 n-1 个内点极值再加上两个端点最多 n1 个点。因此当我们说“最优多项式必须在区间上交替达到至少 n1 次”实际上就是恰好 n1 次——因为不可能更多了。所以“至少 n1”这个表述只是为了强调下界而上界自然由多项式次数决定。最优首一多项式在 [-1,1] 上恰好有 n1 个交替符号的极值点取值为。切比雪夫多项式就实现了这一点在这 n1 个点上。切比雪夫接着证明了若一个首一多项式在 [-1,1]上有 n1 个交替取的极值点且则 M 必为最小值且只能是的形式。这是切比雪夫多项式理论中最核心的极小极大Minimax性质。是第一类切比雪夫多项式Chebyshev polynomials of the first kind是制造“最平缓”首一多项式的“母版”。交错定理这个唯一性可以从“交错定理”的严格证明中得到如果有两个不同的最优多项式它们的差将是一个次数小于 n 的多项式却在 n1 个点上为零从而恒为零。最优首一多项式的唯一性与形式下面给出一个严格的证明说明在区间 [-1,1] 上使得最小的首一 n 次多项式是唯一的并且它等于。证明的核心是\textbf{交错定理}及其推论。设表示所有首一多项式即最高次项系数为1的集合。定义我们的目标是找到以及达到这个最小值的多项式。交错定理Chebyshev 交错定理设是首一 n 次多项式且令。则是最优的即 M 达到最小可能值当且仅当存在 n1 个点使得并且符号交替通常取然后交替。这个定理的证明可以在多数逼近论教材中找到这里我们直接引用其结论。该定理不仅给出了最优的必要条件而且可以证明这样的最优多项式存在且唯一。唯一性的证明假设存在两个不同的首一最优多项式和它们都达到最小最大模即。那么根据交错定理每个多项式都有 n1 个交错点分别记为且在这些点上分别有、符号交替。考虑它们的平均多项式仍然是首一多项式吗是的因为首项系数。另外对于任意因此。由于是最小可能的最大模故即也是最优多项式。现在考虑差D(x) 的次数最多为 n-1因为首项抵消。我们要证明。在证明唯一性的过程中考虑其中是首一最优多项式也是最优是另一个最优多项式。在的交错点上。现在分析的符号若则因为所以。于是若则于是因此总是与同号或为零。由于的符号交替所以的符号也交替或出现零但零不影响后续论证。特别地如果某个那么它与相邻的符号相反。于是在每相邻两个之间即区间内如果和异号由介值定理必存在一个零点如果其中之一为零则该零点就是或自身。因此我们至少可以得到 n 个不同的零点因为 n1 个点产生 n 个区间每个区间至少贡献一个零点。而 S(x) 是次数不超过 n-1 的非零多项式如果它最多有 n-1 个零点。这里我们得到了至少 n 个零点矛盾。因此从而。下面从多项式的形式入手不预先假设三角表达式通过分析最优多项式应满足的条件逐步推导出最小值以及多项式的具体形式。设是首一 n 次多项式在 [-1,1] 上达到最小可能的最大模 M即“首一多项式”指的是 最高次项的系数为 1。对于就是的系数是 1。这里的端点必为极值点反证法假设端点 -1 不是极值点即。由于连续存在一个小区间使得。类似地对于 x1 也可作类似假设但先只讨论左端点。因为是第一个交错点且否则若则端点已是极值点。于是在上严格小于 M绝对值。由切比雪夫交错定理存在 n1 个点使得且对所有有。在内部点处达到局部最大值故构造辅助多项式 R(x)令R(x) 是首一 (n-1) 次多项式因为最高次项系数为 1它的根正好是的所有内部极值点。由于是 n-1 次多项式且对成立因此与 R(x) 有完全相同的根计重数这里都是单根。又因为首一的首项系数为 n而 R(x) 的首项系数为 1故(1)分析的因式分解显然对所有。在内部点() 处因为。所以是 Q 的至少二重根。在端点,处除非退化情形但最优多项式时确实非零故因此端点只是 Q 的单根。的次数为 2n因为最高次为系数为1减去常数后仍为 2n 次。结合根的重数可唯一分解为其中 K 是待定常数。注意于是记则。为了符号简便下面仍将常数记为 K吸收负号即(2)代入由 (1) 得代入 (2)整理得3这就是要求的微分方程形式其中。比较 (2) 式两端最高次项系数。设则所以即左边的系数为 -1。右边是首一多项式故乘以得因此右边的系数为 -K。比较得 -K -1即 K 1。最终微分方程将 K 1 代入 (3) 得4这就是切比雪夫微分方程。解微分方程简述令则代入 (4)消去在非节点处得积分得。由边界条件因为时但取绝对值后为 M符号取决于 n 的奇偶可调整常数使之满足取常数0则最后利用首一性确定 M展开后系数为故得。这就是切比雪夫多项式。在通过最优性条件解出多项式形式之后很容易导出其递推关系。具体步骤如下令则满足余弦的和差化积公式设于是上式变为整理得这就是切比雪夫多项式的递推关系。初始条件从出发可以依次算出等等。这些多项式正是前面得到的最优多项式相差常数因子。尽管已有了三角形式的闭式表达但在实际应用中递推关系仍然非常必要。直接计算通式对每个 x 计算再取涉及两次超越函数调用且当 n 很大时可能产生舍入误差或计算缓慢。递推计算只需给定和然后反复使用每次运算仅包含乘法和减法速度快、精度高且对任意 n 都可以稳定生成尤其当时。切比雪夫多项式是正交多项式族中的一种而所有正交多项式都满足三项递推关系如勒让德、拉盖尔等。掌握递推关系是理解和应用这些多项式族的通用工具。如果只依赖三角闭式就掩盖了这一统一结构不利于推广到非经典区间或带不同权重的多项式。法瓦尔Favard定理任何正交多项式族相对于某个正权函数在区间上正交都满足一个三项递推关系。其根本原因在于多项式空间的维数结构和正交性。下面给出一个简洁的证明思路考虑区间上的权函数内积定义为设是首一正交多项式即且对。注意首一性不是必须的可以取任意标准化但三项递推总是存在只是系数形式不同。因为所以是 n1 次多项式。它可以在正交多项式基下唯一展开系数由正交性给出对于考虑。由于的次数因为时而正交于所有次数小于 n 的多项式因此所以对。对于一般不为零因为的次数为 n与不一定正交。类似地k n 和 k n1 也可能非零。因此展开式中只保留三项因为是首一的可以算出具体的系数表达式但重要的是只有这三项。法瓦尔Favard定理如果一个多项式族满足首一性或适当标准化和三项递推关系且那么它们一定关于某个权函数正交。因此三项递推是正交多项式族的特征性质。切比雪夫多项式的物理意义取单位圆上半圆周的 n1 个等分点把它们的横坐标即投影到X轴上并令纵坐标等于对应角度的余弦倍角值就是唯一经过这些投影点的 n 次多项式。import numpy as np import matplotlib.pyplot as plt from ssqueezepy.visuals import imshow plt.rcParams[font.sans-serif] [WenQuanYi Zen Hei, SimHei, Microsoft YaHei] # Linux 推荐 WenQuanYi Zen HeiWindows 可选 SimHei 或 Microsoft YaHei plt.rcParams[axes.unicode_minus] False # 解决负号 - 显示为方块的问题 # 参数 n 5 # 1. 定义切比雪夫多项式递推 def chebyshev_T(n, x): if n 0: return np.ones_like(x) elif n 1: return x T_prev np.ones_like(x) T_curr x.copy() for _ in range(2, n 1): T_next 2 * x * T_curr - T_prev T_prev, T_curr T_curr, T_next return T_curr # 2. 生成连续的参数曲线theta 从 0 到 pi theta_cont np.linspace(0, np.pi, 500) x_cont np.cos(theta_cont) # 横坐标圆上点的水平投影 y_cont np.cos(n * theta_cont) # 纵坐标倍角余弦值这就是 T_n(x) # 3. 提取离散的 n1 个等分点极值点 k np.arange(n 1) theta_k k * np.pi / n x_k np.cos(theta_k) # 横坐标等分点的水平投影 y_k np.cos(n * theta_k) # 纵坐标 (-1)^k交替 ±1 # 创建三张子图 fig, axes plt.subplots(1, 3, figsize(18, 5)) # ---- 图1原始单位圆参考 ---- ax1 axes[0] # 画上半圆 circle_theta np.linspace(0, np.pi, 100) ax1.plot(np.cos(circle_theta), np.sin(circle_theta), k-, lw2, alpha0.5) # 画等分点红色 ax1.scatter(np.cos(theta_k), np.sin(theta_k), colorred, s80, zorder5) # 从等分点画垂直虚线到 X 轴蓝色投影线 for t in theta_k: ax1.plot([np.cos(t), np.cos(t)], [0, np.sin(t)], blue, linestyle:, alpha0.5) # X 轴上的投影点蓝色小点 ax1.scatter(np.cos(theta_k), np.zeros_like(theta_k), colorblue, s40, zorder6) ax1.set_aspect(equal) ax1.set_title(图1单位圆上半圆\n红色 等分点蓝色 水平投影到 X 轴) ax1.set_xlabel(横坐标 x cosθ) ax1.set_ylabel(纵坐标 y sinθ (原始圆)) ax1.grid(True, alpha0.3) ax1.set_xlim(-1.3, 1.3) ax1.set_ylim(-0.3, 1.3) # ---- 图2参数轨迹 (x cosθ, y cos nθ) 这就是 T_n(x) ---- ax2 axes[1] # 画出完整的参数曲线这是 T_n(x) 的图像 ax2.plot(x_cont, y_cont, purple, lw2.5, labelf$x\cosθ, y\cos({n}θ)$) # 标记离散点 (x_k, y_k) (cosθ_k, cos nθ_k) (x_k, (-1)^k) ax2.scatter(x_k, y_k, colorred, s100, zorder5, edgecolorsblack, label离散点 $(x_k, (-1)^k)$) # 从离散点画垂直虚线到 X 轴 for xv, yv in zip(x_k, y_k): ax2.plot([xv, xv], [0, yv], blue, linestyle:, alpha0.5) ax2.axhline(0, colorgray, lw0.5) ax2.set_title(图2$T_n(x)$ 的轨迹\n纵坐标 倍角余弦 $\\cos nθ$非圆上 $\\sinθ$) ax2.set_xlabel(横坐标 x cosθ) ax2.set_ylabel(纵坐标 y cos nθ (倍角值)) ax2.legend() ax2.grid(True, alpha0.3) ax2.set_xlim(-1.1, 1.1) ax2.set_ylim(-1.3, 1.3) # ---- 图3把两个坐标系叠加以便对比 ---- ax3 axes[2] # 画单位圆灰色背景参考 ax3.plot(np.cos(circle_theta), np.sin(circle_theta), gray, lw1.5, alpha0.3, label单位圆 (参考)) # 画 T_n 参数曲线紫色 ax3.plot(x_cont, y_cont, purple, lw2.5, labelf$T_{n}(x)$ 轨迹) # 画离散点 ax3.scatter(x_k, y_k, colorred, s80, zorder5, edgecolorsblack) # 从离散点画垂直虚线到 X 轴 for xv, yv in zip(x_k, y_k): ax3.plot([xv, xv], [0, yv], blue, linestyle:, alpha0.4) ax3.axhline(0, colorgray, lw0.5) ax3.set_aspect(equal) ax3.set_title(图3叠加对比\n灰色是原圆紫色是 $T_n$ 的轨迹) ax3.set_xlabel(横坐标 x) ax3.set_ylabel(纵坐标) ax3.legend() ax3.grid(True, alpha0.3) ax3.set_xlim(-1.3, 1.3) ax3.set_ylim(-1.3, 1.3) plt.tight_layout() plt.show() # 打印具体的映射数值选取前3个点 print(\n【关键映射】同一个角度 θ横纵坐标的含义完全不同) print(θ | 圆上点 (cosθ, sinθ) | T_n 轨迹点 (cosθ, cos nθ)) for i in range(min(3, n1)): t theta_k[i] print(f{t:.3f} | ({np.cos(t):.3f}, {np.sin(t):.3f}) | ({np.cos(t):.3f}, {np.cos(n*t):.1f}))回顾熟悉的倍角公式基础还有三倍角公式仔细观察这两个式子你会发现一个极其重要的规律等号右边虽然含有三角函数但已经没有任何“和角”或“积化和差”的痕迹它完全变成了的整式幂次组合多项式。切比雪夫的伟大创举在于他做了一个极其简单的变量替换令那么。把上面的公式改写一下二倍角变成了三倍角变成了此时等号右边只剩下了关于 x 的代数多项式和。这就是“推广”的第一层含义把离散的2倍、3倍推广到了任意正整数n倍。不仅在于倍数从2、3变成了 n 更在于它严格证明了这种形式的普遍存在性。切比雪夫利用三角函数的和差化积公式得到递推关系代入和得到切比雪夫多项式递推式初值条件已知已知利用该递推公式可以无限制推导出任意倍数的多项式切比雪夫发现“余弦的n倍角展开后本质上就是关于余弦值的一个n次多项式。”他利用这个特性把复杂的三角振荡问题完美地转化为了简单、优雅的代数多项式问题这也正是它在数值分析中如此好用的根本原因。由三角倍角公式推导出的多项式$T_n(x)$在三个看似毫不相关的领域都有着极其重要的应用1. 数值计算领域多项式插值的“防震荡神器”高次多项式做均匀插值时端点处往往会产生剧烈震荡即“龙格现象”。最经典的例子是$f(x)\dfrac{1}{125x^2}$如果用等距点做高次插值两端会剧烈发散。但如果用$T_n(x)$的根作为插值点就可以最大限度地抑制这种震荡——因为这些根“两端密集、中间稀疏”的分布恰好抵消了高次多项式在端点处容易出现的剧烈波动从而最小化插值误差。2. 信号处理领域电子工程中“等波纹滤波器”的核心}切比雪夫滤波器的频率响应正是基于$T_n(x)$在$[-1,1]$内$\pm1$等幅振荡的性质设计的。它可以使通带内的增益均匀波动从而在阻带获得更陡峭的衰减特性。相比巴特沃斯滤波器切比雪夫滤波器能用更少的元件达到更好的截止效果。3. 微分方程求解领域空气动力学/气象预测中“谱方法”的基函数}$T_n(x)$具备带权重的正交性可以通过快速傅里叶变换FFT高效计算。因此在流体、气象等领域的数值模拟中常用$T_n(x)$展开物理场以谱方法求解偏微分方程——在同等精度下计算量远低于有限差分法。两端密集、中间稀疏取极值点计算相邻间隔。第$k$、$k1$个点的坐标分别为用和差化积公式得到相邻间距忽略常数因子$\sin\left(\dfrac{\pi}{2n}\right)$分布由$\sin\left(\dfrac{(2k1)\pi}{2n}\right)$决定中间$k\approx \dfrac{n}{2}$角度接近$\dfrac{\pi}{2}$$\sin\approx1$$\Delta x$最大节点稀疏。两端$k\approx0$或$k\approx n$角度接近0或$\pi$$\sin\approx0$$\Delta x$趋近于0节点密集。端点间距约为中间间距的$\dfrac{\pi^2}{2n^2}$倍$n$很大时密度差距悬殊属于指数级压缩。回到最初的问题背景多项式插值。高次多项式在区间两端最容易发生剧烈震荡龙格现象。中间稀疏因为中间区域函数通常比较平滑不需要太多点去约束。两端密集因为两端是“事故高发区”切比雪夫特意在这里加密了“监控摄像头”插值节点强行把多项式在端点的振荡幅度压到最低。所以这种“两端密集”不是物理巧合而是切比雪夫为了\textbf{平衡整个区间上的最大误差}利用余弦投影的数学特性人为设计出的最优“布点策略”。import numpy as np import matplotlib.pyplot as plt from ssqueezepy.visuals import imshow plt.rcParams[font.sans-serif] [WenQuanYi Zen Hei, SimHei, Microsoft YaHei] # Linux 推荐 WenQuanYi Zen HeiWindows 可选 SimHei 或 Microsoft YaHei plt.rcParams[axes.unicode_minus] False # 解决负号 - 显示为方块的问题 # 参数设置 n 10 # 阶数越大两端密集效果越明显 # 1. 计算切比雪夫极值点波腹/节点: x_k cos(k*pi/n) k_values np.arange(n 1) theta k_values * np.pi / n # 角度空间绝对均匀 x_cheb np.cos(theta) # 物理空间被挤压到两端 # 2. 生成均匀节点作为对比用于显示“均匀网格”长什么样 x_uniform np.linspace(-1, 1, n 1) # 3. 计算相邻点之间的物理间距量化疏密 d_cheb np.abs(np.diff(x_cheb)) # 切比雪夫相邻间距 d_uniform np.abs(np.diff(x_uniform)) # 均匀网格相邻间距恒为常数 # 图1单位圆投影几何本质 fig1, ax1 plt.subplots(figsize(8, 8), subplot_kw{projection: polar}) # 画单位圆 circle np.linspace(0, 2*np.pi, 100) ax1.plot(circle, np.ones_like(circle), k-, lw1, alpha0.5) # 画角度射线只画上半圆0到pi for t in theta: ax1.plot([0, t], [0, 1], gray, lw0.8, alpha0.6, linestyle--) # 标记圆上的均匀角度点红色 ax1.scatter(theta, np.ones_like(theta), colorred, s80, label均匀角度点) # 特别标注水平轴x轴投影 ax1.set_title(f单位圆投影均匀角度 (红点) 挤压到 X 轴两端, vabottom) ax1.set_ylim(0, 1.2) plt.show() # 图2物理空间一维分布对比直观视觉 fig2, ax2 plt.subplots(figsize(12, 4)) # 绘制切比雪夫节点上半部分 ax2.scatter(x_cheb, np.ones_like(x_cheb) * 1.2, colorred, s100, label切比雪夫节点 (极值点)) ax2.vlines(x_cheb, 1.0, 1.4, colorsred, alpha0.5) # 在点旁标注具体数值只看两端和中间几个避免太拥挤 for i, val in enumerate(x_cheb): if i % 2 0 or i 0 or i n: # 隔一个标一个防止文字重叠 ax2.annotate(f{val:.2f}, (val, 1.25), hacenter, fontsize8, rotation45) # 绘制均匀节点下半部分 ax2.scatter(x_uniform, np.ones_like(x_uniform) * -0.2, colorblue, s100, label均匀节点 (对比)) ax2.vlines(x_uniform, -0.4, 0.0, colorsblue, alpha0.5) # 辅助线和坐标轴美化 ax2.axhline(0, colorblack, lw1, alpha0.5) ax2.set_yticks([]) ax2.set_xlim(-1.1, 1.1) ax2.set_xlabel(物理空间坐标 x) ax2.set_title(f切比雪夫节点 (n{n}) vs 均匀节点肉眼可见两端被压得极密) ax2.legend(locupper center) ax2.grid(axisx, alpha0.3) plt.tight_layout() plt.show()带权正交性首先严格的正交公式长这样1. 这个“权重”$\dfrac{1}{\sqrt{1-x^2}}$是什么}这个权重在区间两端$x\pm1$趋向于无穷大。表面看是“奇异性”但实际上它极其巧妙物理直觉它相当于在区间两端给多项式“加了更多的砝码权重”。因为$T_n(x)$在两端波动最剧烈极值密集权重加在两端正好抵消了端点处因“高次震荡”带来的数值误差使得积分在全局范围内保持均衡。数学直觉如果没有这个权重普通多项式如$1,x,x^2$在$[-1,1]$上并不正交求系数时需要解一个病态的希尔伯特矩阵条件数极大。而加入这个“端点重权”后切比雪夫多项式变成了正交基求展开系数时只需要做一个简单的内积除法不会出现数值崩溃。2. 为什么它完美地连接了“三角傅里叶”这是最精彩的一步令$x\cos\theta$则$dx-\sin\theta d\theta$且$\sqrt{1-x^2}\sin\theta$。代入上面的积分$\sin\theta$和分母的$\sin\theta$完美抵消积分直接变成这就是我们熟悉的标准傅里叶余弦级数的正交性这意味着切比雪夫级数本质上就是换元后的傅里叶余弦级数。它继承了傅里叶级数所有的优秀收敛性质指数级收敛但又完全脱离了周期函数的限制完美适应有限区间$[-1,1]$。第二部分如何通过“余弦变换FFT”快速计算换元$x\cos\theta$同样可以应用到积分和离散计算中。考虑将函数$f(x)$展开为切比雪夫多项式直接求系数$a_k$需要计算$O(N^2)$的运算但切比雪夫有更聪明的方法。关键操作选取Gauss-Lobatto节点作为离散采样点这种非均匀网格的采样点公式为这些点恰好是$T_N(x)$的极值点。代入切比雪夫多项式$T_k(x)$后可以化简得到这意味着切比雪夫多项式求值完全等价于标准离散余弦变换DCTDiscrete Cosine Transform而DCT的底层计算核心是快速傅里叶变换FFT。计算流程对比传统暴力法计算每个系数$a_k$需要累加$N$个点的值总运算量为$N \times N N^2$次乘加运算。切比雪夫FFT法仅需提取$f(x)$在特殊余弦节点的值调用底层为FFT的DCT运算量为$O(N\log N)$次。实际案例当数据量$N1000000$时传统方法需要$10^{12}$次运算而FFT方法仅需约$10^6 \times \log_2(10^6) \approx 2 \times 10^7$次运算速度提升\textbf{5万倍}。第三部分这两者结合带来的“降维打击”效应在计算流体力学或气象预测谱方法中两者的结合堪称完美用正交性把复杂的偏微分方程PDE映射到切比雪夫空间得到一个对角矩阵或近似对角使得未知数之间不再耦合可以直接逐个求解。用FFTDCT每次迭代更新解时不需要做矩阵乘法只需要在物理空间和谱空间之间来回切换。所有的求导、积分操作在谱空间里只是简单的数乘再通过$O(N\log N)$的FFT迅速还原回物理空间。这使得现代超级计算机能够在上百万个网格点上以惊人的速度模拟飞机机翼的气流或全球气候的变化而不会因为计算量太大而卡死。通带等波纹在滤波器中我们不做简单的替换 $x \omega$而是将频率轴\textbf{归一化并拉伸}到切比雪夫多项式的定义域 $[-1,1]$ 上当实际频率 $\omega$ 在通带内$0 \leq \omega \leq \omega_c$时$x$ 就在 $[0,1]$ 之间。当 $\omega$ 超过截止频率 $\omega_c$ 进入阻带时$x 1$。为什么通带内会出现“等波纹”数学根源滤波器幅频响应增益公式通带范围 $0 \leq \dfrac{\omega}{\omega_c} \leq 1$在此范围内$n$阶切比雪夫多项式$T_n(x)$在$[-1,1]$之间剧烈振荡因此$T_n^2(x)$在0和1之间来回波动。代入增益公式当$T_n0$时增益为1最大值当$|T_n|1$时增益为$\dfrac{1}{\sqrt{1\epsilon^2}}$最小值增益在1和$\dfrac{1}{\sqrt{1\epsilon^2}}$之间\textbf{等幅振荡}就是\textbf{“通带等波纹”}其中参数$\epsilon$控制波纹的大小。为什么巴特沃斯滤波器是“单调衰减”的巴特沃斯滤波器的增益公式为其中$\omega$为信号角频率$\omega_c$为截止角频率$n$为滤波器阶数。在通带内$\dfrac{\omega}{\omega_c} \leq 1$分母随着频率增加而\textbf{单调递增}所以增益\textbf{单调递减}。它在$\omega0$处最平坦导数全为0但没有波纹整体平缓下滑。为什么切比雪夫能用更少元件达到更好截止效果频率进入阻带$\omega\omega_c$即$x1$时巴特沃斯滤波器}阻带内特性随$x^{2n}$缓慢增长阻带衰减较慢。切比雪夫滤波器}基于双曲余弦性质增长速度远快于$x^n$。举例对比$n5$阶、$\omega2\omega_c$处巴特沃斯分母项为$2^{10}1024$增益约$-30\mathrm{dB}$。切比雪夫分母项$T_5(2)362$结合波纹系数后$1\epsilon^2\cdot362^2$数值极大增益约$-51\mathrm{dB}$。若要求阻带衰减达到$-50\mathrm{dB}$巴特沃斯需要$n8$阶8个电抗元件切比雪夫仅需$n5$阶5个元件即可实现同等效果。这一特性在射频芯片、手机天线电路中可减少元件用量实现成本降低、体积缩小。左图线性尺度蓝色代表巴特沃斯滤波器数值从1平滑下降到0.7附近无波动。红色代表切比雪夫滤波器数值在1和0.7之间规则震荡呈现“波纹”效果是“等波纹”特性的直观表现。右图dB对数尺度}观察阻带$\omega \omega_c$区域红色切比雪夫曲线的下降斜率远大于蓝色巴特沃斯曲线。在$\omega 2\omega_c$的位置红色曲线数值已低于$-40\mathrm{dB}$蓝色曲线数值仍在$-30\mathrm{dB}$左右。import numpy as np import matplotlib.pyplot as plt from scipy.signal import butter, cheby1, freqz from ssqueezepy.visuals import imshow plt.rcParams[font.sans-serif] [WenQuanYi Zen Hei, SimHei, Microsoft YaHei] # Linux 推荐 WenQuanYi Zen HeiWindows 可选 SimHei 或 Microsoft YaHei plt.rcParams[axes.unicode_minus] False # 解决负号 - 显示为方块的问题 # 参数设置 n 5 # 滤波器阶数 rp 1.0 # 切比雪夫通带波纹 (dB)对应 epsilon omega np.linspace(0, 2, 1000) # 归一化频率 omega/omega_c # ---------- 1. 理论公式直接对比不依赖库函数 ---------- # 切比雪夫递推仅用于画图也可以用 scipy 自带 def cheb_T(n, x): if n 0: return np.ones_like(x) if n 1: return x T_prev np.ones_like(x) T_curr x.copy() for _ in range(2, n 1): T_next 2 * x * T_curr - T_prev T_prev, T_curr T_curr, T_next return T_curr epsilon np.sqrt(10 ** (rp / 10) - 1) # 由波纹 dB 换算得到 x_freq omega # 归一化频率 # 巴特沃斯单调衰减 butter_gain 1 / np.sqrt(1 x_freq ** (2 * n)) # 切比雪夫通带等波纹 cheb_gain 1 / np.sqrt(1 epsilon**2 * cheb_T(n, x_freq)**2) # 转换为 dB分贝 butter_db 20 * np.log10(butter_gain 1e-12) cheb_db 20 * np.log10(cheb_gain 1e-12) # ---------- 绘图 ---------- fig, (ax1, ax2) plt.subplots(1, 2, figsize(14, 5)) # 左图线性尺度看通带波纹 ax1.plot(omega, butter_gain, b-, lw2, label巴特沃斯 (单调)) ax1.plot(omega, cheb_gain, r-, lw2, label切比雪夫 (等波纹)) ax1.axvline(1, colorgray, linestyle--, alpha0.5, label截止频率 $\\omega_c$) ax1.set_xlabel(归一化频率 $\\omega / \\omega_c$) ax1.set_ylabel(增益 (线性)) ax1.set_title(通带内对比切比雪夫呈等幅波动巴特沃斯单调下降) ax1.legend() ax1.grid(True, alpha0.3) ax1.set_xlim(0, 1.2) # 右图对数尺度dB看阻带陡峭度 ax2.plot(omega, butter_db, b-, lw2, label巴特沃斯 (缓慢下降)) ax2.plot(omega, cheb_db, r-, lw2, label切比雪夫 (急剧下降)) ax2.axvline(1, colorgray, linestyle--, alpha0.5, label截止频率) ax2.axhline(-40, colorgreen, linestyle:, alpha0.7, label-40dB 目标线) ax2.set_xlabel(归一化频率 $\\omega / \\omega_c$) ax2.set_ylabel(增益 (dB)) ax2.set_title(阻带对比同阶数下切比雪夫提前到达 -40dB) ax2.legend() ax2.grid(True, alpha0.3) ax2.set_xlim(0.5, 2) ax2.set_ylim(-60, 5) plt.tight_layout() plt.show() # 打印具体数值验证 idx_2fc np.argmin(np.abs(omega - 2.0)) print(f在频率 2*omega_c 处) print(f巴特沃斯增益: {butter_db[idx_2fc]:.2f} dB) print(f切比雪夫增益: {cheb_db[idx_2fc]:.2f} dB) print(f差距: {cheb_db[idx_2fc] - butter_db[idx_2fc]:.2f} dB (切比雪夫衰减多出这么多))