傅立叶近似仅适用于 0.0–1.0 范围

Fourier approximation only works in range 0.0–1.0

我试图用给定的数值输出(不使用外部库)为 python 函数重新创建傅立叶逼近,但是我的函数仅适用于 0.0 到 1.0 的数字范围。我考虑过简单地将任何大于 1.0 的给定输入乘以 10 的负次方,然后在保存结果后乘以正次方。

但是,由于我限制自己不使用外部库(即 Decimalmpmath 之类的东西),我觉得这个解决方案在给定 python 的情况下似乎效果不佳的浮点精度有限。我觉得这个问题似乎没有多少 'hacky' 解决方案,但是我无法弄清楚可能是什么。

e = 2.718281828459045
i_tau = 6.283185307179586j

def integrate(func, a, b, step=0.001):
    total = 0
    while a <= b:
        a += step
        total += func(a)*step
    return total

def fourier_constant(func, n):
    return integrate(lambda x: func(x)*e**(-n*i_tau*x), 0, 1)

def fourier_approx(func, count):
    return lambda x: sum([fourier_constant(func, n)*e**(n*i_tau*x) for n in range(-count, count+1)]).real

series_accuracy = 500
test_value = 0.3        # FIX: only works in range 0.0-1.0

function_to_approximate = lambda x: x*2
approximated_function = fourier_approx(function_to_approximate, series_accuracy)

print(f"expected output at value {test_value} : {function_to_approximate(test_value)}")
print(f"  actual output at value {test_value} : {approximated_function(test_value)}")

这段代码正在计算一个漂亮的三角波(它绝不限于区间 [0, 1])。我将项数限制为 5,然后限制为 50,以使 Runge 现象 清晰可见。

顺便说一句,计算非常准确。