傅立叶近似仅适用于 0.0–1.0 范围
Fourier approximation only works in range 0.0–1.0
我试图用给定的数值输出(不使用外部库)为 python 函数重新创建傅立叶逼近,但是我的函数仅适用于 0.0 到 1.0 的数字范围。我考虑过简单地将任何大于 1.0 的给定输入乘以 10 的负次方,然后在保存结果后乘以正次方。
但是,由于我限制自己不使用外部库(即 Decimal
或 mpmath
之类的东西),我觉得这个解决方案在给定 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 现象 清晰可见。
顺便说一句,计算非常准确。
我试图用给定的数值输出(不使用外部库)为 python 函数重新创建傅立叶逼近,但是我的函数仅适用于 0.0 到 1.0 的数字范围。我考虑过简单地将任何大于 1.0 的给定输入乘以 10 的负次方,然后在保存结果后乘以正次方。
但是,由于我限制自己不使用外部库(即 Decimal
或 mpmath
之类的东西),我觉得这个解决方案在给定 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 现象 清晰可见。
顺便说一句,计算非常准确。