You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

欧拉形式三角插值实现问题求助

欧拉形式三角插值实现问题

我正难以正确实现欧拉形式的三角插值,以下是已完成的工作和收集的信息,代码基于Python和numpy库,请注意:我不会使用快速傅里叶变换(FFT)。

实验数据集

所有实验基于以下(x,y)数据集:

[('0.0', '0.0'),
 ('0.6283185307179586', '0.6427876096865393'),
 ('1.2566370614359172', '0.984807753012208'),
 ('1.8849555921538759', '0.8660254037844387'),
 ('2.5132741228718345', '0.3420201433256689'),
 ('3.141592653589793', '-0.34202014332566866'),
 ('3.7699111843077517', '-0.8660254037844384'),
 ('4.39822971502571', '-0.9848077530122081'),
 ('5.026548245743669', '-0.6427876096865396'),
 ('5.654866776461628', '-2.4492935982947064e-16')]

对应图像为标准正弦波。

离散傅里叶变换(DFT)定义

离散傅里叶变换的数学定义:

对于长度为n的序列$Y$,其DFT系数$\hat{Y}_k$计算公式为:
$$\hat{Y}k = \frac{1}{n} \sum{l=0}^{n-1} Y_l e^{-2\pi i k l / n}, \quad k=0,1,...,n-1$$

我的DFT实现

import numpy as np # 后续代码默认已导入numpy

def F_n(Y):
    n = len(Y)
    Y_hat = []
    for k in range(len(Y)):
        transformed_k = 1/n * sum([y_l * np.exp(-2 * np.pi * 1j* k * l/n) for l, y_l in enumerate(Y) ])
        Y_hat.append(transformed_k)
    return Y_hat

系数对比

将自己实现的F_n(y)与np.fft.fft(y)的结果对比,发现系数仅相差n倍(n为数据长度):

# F_n(y)的结果
['(-1.33907057366955e-17+0j)',
 '(0.14283712054380923-0.439607454395199j)',
 '(-0.048591754799448425+0.06688081278992913j)',
 '(-0.039133572999081954+0.028432205056635337j)',
 '(-0.036913281031968816+0.01199385205986717j)',
 '(-0.036397023426620205-2.0058074207055733e-17j)',
 '(-0.03691328103196878-0.011993852059867215j)',
 '(-0.03913357299908168-0.028432205056635646j)',
 '(-0.04859175479944824-0.06688081278992904j)',
 '(0.1428371205438091+0.439607454395199j)']

# np.fft.fft(y)的结果
['(-1.1102230246251565e-16+0j)',
 '(1.428371205438092-4.39607454395199j)',
 '(-0.4859175479944836+0.6688081278992911j)',
 '(-0.3913357299908192+0.2843220505663533j)',
 '(-0.36913281031968803+0.11993852059867194j)',
 '(-0.36397023426620184-1.1102230246251565e-16j)',
 '(-0.36913281031968803-0.11993852059867194j)',
 '(-0.3913357299908196-0.2843220505663534j)',
 '(-0.4859175479944836-0.6688081278992911j)',
 '(1.4283712054380922+4.39607454395199j)']

三角插值实现

三角插值定理定义

给定DFT系数$\hat{Y}_k$,三角插值多项式的定义:

  • 当n为偶数时:$P(x) = \sum_{l=-n/2+1}^{n/2} \hat{Y}_l e^{2\pi i l x}$
  • 当n为奇数时:$P(x) = \sum_{l=-(n-1)/2}^{(n-1)/2} \hat{Y}_l e^{2\pi i l x}$

我的插值实现

def trig_interpolation(Y_hat, x_range, depth=1000):
    n = len(Y_hat)

    get_summand = lambda c_j,l,x: c_j*np.exp(2 * np.pi * 1j * l*x)

    y_intp = []
    x_intp = list((i/depth)*x_range for i in range(depth))
    if n%2==0:
        K = n//2 
        for x in x_intp:
            y_intp.append(sum([get_summand(c_j,l,x) for l,c_j in zip(range(-K+1,K+1), Y_hat)]))
    else:
        K = n//2+1
        for x in x_intp:
            y_intp.append(sum([get_summand(c_j,l,x) for l,c_j in zip(range(-K,K+1), Y_hat)]))

    return x_intp, y_intp

x_range = max(x)-min(x)
x_intp, y_intp = trig_interpolation(np.fft.fft(y), x_range)

其中x_range是原始数据点x值的范围,depth为插值分辨率,get_summand函数对应公式中的$\exp(2\pi i l x)$项。

插值结果

  • 使用numpy的FFT系数运行时,插值曲线能对齐数据点,但与真实正弦曲线偏差较大。
  • 使用自己实现的DFT系数时,得到的曲线完全错误。

请指出我的实现错误,帮助我根据给定的数学定义正确实现三角插值。


内容的提问来源于stack exchange,提问作者Thomas Christopher Davies

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:32:11