gpt4 book ai didi

python - 用三角方法计算傅里叶级数

转载 作者:太空狗 更新时间:2023-10-29 21:57:00 25 4
gpt4 key购买 nike

我尝试根据以下公式实现傅立叶级数函数:

enter image description here

...哪里...

enter image description here

...和...

enter image description here

enter image description here

这是我解决问题的方法:

import numpy as np
import pylab as py

# Define "x" range.
x = np.linspace(0, 10, 1000)

# Define "T", i.e functions' period.
T = 2
L = T / 2

# "f(x)" function definition.
def f(x):
return np.sin(np.pi * 1000 * x)

# "a" coefficient calculation.
def a(n, L, accuracy = 1000):
a, b = -L, L
dx = (b - a) / accuracy
integration = 0
for i in np.linspace(a, b, accuracy):
x = a + i * dx
integration += f(x) * np.cos((n * np.pi * x) / L)
integration *= dx
return (1 / L) * integration

# "b" coefficient calculation.
def b(n, L, accuracy = 1000):
a, b = -L, L
dx = (b - a) / accuracy
integration = 0
for i in np.linspace(a, b, accuracy):
x = a + i * dx
integration += f(x) * np.sin((n * np.pi * x) / L)
integration *= dx
return (1 / L) * integration

# Fourier series.
def Sf(x, L, n = 10):
a0 = a(0, L)
sum = 0
for i in np.arange(1, n + 1):
sum += ((a(i, L) * np.cos(n * np.pi * x)) + (b(i, L) * np.sin(n * np.pi * x)))
return (a0 / 2) + sum

# x axis.
py.plot(x, np.zeros(np.size(x)), color = 'black')

# y axis.
py.plot(np.zeros(np.size(x)), x, color = 'black')

# Original signal.
py.plot(x, f(x), linewidth = 1.5, label = 'Signal')

# Approximation signal (Fourier series coefficients).
py.plot(x, Sf(x, L), color = 'red', linewidth = 1.5, label = 'Fourier series')

# Specify x and y axes limits.
py.xlim([0, 10])
py.ylim([-2, 2])

py.legend(loc = 'upper right', fontsize = '10')

py.show()

...这是绘制结果后得到的:

enter image description here

我读过 How to calculate a Fourier series in Numpy?我已经实现了这种方法。它工作得很好,但它使用指数方法,我想关注三角函数和矩形方法,以防计算 a_{n}b_{n} 系数。

提前谢谢你。

更新(已解决)

最后,这是代码的工作示例。不过,我会花更多的时间在这上面,所以如果有什么可以改进的地方,我会完成的。

from __future__ import division
import numpy as np
import pylab as py

# Define "x" range.
x = np.linspace(0, 10, 1000)

# Define "T", i.e functions' period.
T = 2
L = T / 2

# "f(x)" function definition.
def f(x):
return np.sin((np.pi) * x) + np.sin((2 * np.pi) * x) + np.sin((5 * np.pi) * x)

# "a" coefficient calculation.
def a(n, L, accuracy = 1000):
a, b = -L, L
dx = (b - a) / accuracy
integration = 0
for x in np.linspace(a, b, accuracy):
integration += f(x) * np.cos((n * np.pi * x) / L)
integration *= dx
return (1 / L) * integration

# "b" coefficient calculation.
def b(n, L, accuracy = 1000):
a, b = -L, L
dx = (b - a) / accuracy
integration = 0
for x in np.linspace(a, b, accuracy):
integration += f(x) * np.sin((n * np.pi * x) / L)
integration *= dx
return (1 / L) * integration

# Fourier series.
def Sf(x, L, n = 10):
a0 = a(0, L)
sum = np.zeros(np.size(x))
for i in np.arange(1, n + 1):
sum += ((a(i, L) * np.cos((i * np.pi * x) / L)) + (b(i, L) * np.sin((i * np.pi * x) / L)))
return (a0 / 2) + sum

# x axis.
py.plot(x, np.zeros(np.size(x)), color = 'black')

# y axis.
py.plot(np.zeros(np.size(x)), x, color = 'black')

# Original signal.
py.plot(x, f(x), linewidth = 1.5, label = 'Signal')

# Approximation signal (Fourier series coefficients).
py.plot(x, Sf(x, L), '.', color = 'red', linewidth = 1.5, label = 'Fourier series')

# Specify x and y axes limits.
py.xlim([0, 5])
py.ylim([-2.2, 2.2])

py.legend(loc = 'upper right', fontsize = '10')

py.show()

enter image description here

最佳答案

考虑以不同的方式逐 block 开发您的代码。如果像这样的代码在第一次尝试时就可以工作,您应该会感到惊讶。正如@tom10 所说,调试是一种选择。另一种选择是在解释器中逐步对代码进行快速原型(prototype)设计,使用 ipython 会更好。

在上面,您期望 b_1000 是非零的,因为输入 f(x) 是一个 1000 在它。您还期望所有其他系数都为零,对吗?

那么你应该只关注函数 b(n, L, accuracy = 1000)。看着它,有3件事出了问题。这里有一些提示。

  • dx 的乘法在循环内。确定吗?
  • 在循环中,i 应该是一个整数吧?真的是整数吗?通过原型(prototype)设计或调试,您会发现这一点
  • 在编写 (1/L) 或类似表达式时要小心。如果你使用的是 python2.7,你可能做错了。如果没有,至少在源代码顶部使用 from __future__ import division。阅读this PEP 如果你不知道我在说什么。

如果您解决了这 3 点,b() 将起作用。然后以类似的方式思考 a

关于python - 用三角方法计算傅里叶级数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27708002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com