基于Chebyshev极值点与FFT的插值结果错误排查
Chebyshev插值错误排查与修正
问题根源
你的代码存在三个核心错误:
- FFT类型与缩放规则错误:用正FFT计算Chebyshev系数是错误的,且统一乘以
2/N的缩放逻辑不符合Chebyshev系数的计算规则——常数项c₀和最高次项c_{N-1}仅需除以N,中间项才需要乘以2/N。 - 系数顺序错误:
np.polynomial.chebyshev.chebval要求系数按低阶到高阶([c₀, c₁, c₂, ..., c_{N-1}])排列,你用[::-1]反转顺序导致求值完全偏离预期。
修正后的代码
import numpy as np import matplotlib.pyplot as plt N = 10 def f(x): return x**2 # 生成Chebyshev极值点(这部分是正确的) x = np.cos(np.arange(N) * np.pi / N) y = f(x) # 用逆FFT计算Chebyshev系数 cheb_coeffs = np.fft.ifft(y).real # 应用正确的缩放规则 cheb_coeffs *= 2/N cheb_coeffs[0] /= 2 cheb_coeffs[-1] /= 2 # 直接使用低阶到高阶的系数求值 x_eval = np.linspace(-1, 1, 100) y_approx = np.polynomial.chebyshev.chebval(x_eval, cheb_coeffs) # 绘图对比 plt.plot(x, y, 'o', label='原函数采样点') plt.plot(x_eval, f(x_eval), '--', label='原函数') plt.plot(x_eval, y_approx, '-', label='Chebyshev近似') plt.legend() plt.show()
效果说明
修正后,Chebyshev近似曲线会完全贴合原函数x²,因为x²是二次多项式,用10个Chebyshev点插值可以完美还原目标函数。
内容的提问来源于stack exchange,提问作者Kristoffer Lindvall
相关产品推荐
相关产品推荐

