2

我正在尝试在 Python 中绘制傅里叶级数求和图。到目前为止,我有这个:

#! /usr/bin/env python

from sympy import *
import numpy
import matplotlib.pyplot as plt

n = Symbol('n')
x = Symbol('x')

L_1 = -1
L_2 = 1
f = -x

a_0 = (1 / L_2) * integrate(f, (x, L_1, L_2))
a_n = (1 / L_2) * integrate(f * cos(n * pi * x / L_2), (x, L_1, L_2))
b_n = (1 / L_2) * integrate(f * sin(n * pi * x / L_2), (x, L_1, L_2))

F = (a_0 / 2) + mpmath.fsum((a_n * cos(n * pi * x / L_2)) + (b_n * sin(n * pi * x / L_2)), [0, 20])
print(F)

但是, fsum 抛出一个错误:

F = (a_0 / 2) + mpmath.fsum((a_n * cos(n * pi * x / L_2)) + (b_n * sin(n * pi * x / L_2)), [0, 20])
File "C:\Program Files\Python\lib\site-packages\sympy\mpmath\ctx_mp_python.py", line 831, in fsum
for term in terms:
TypeError: 'Mul' object is not iterable

我不清楚 Mul 对象是什么,或者我的问题实际上是什么。有人有什么建议可以让这个总和工作吗?就像我说的那样,最终目标是为 x 插入一些值并在 n 次迭代中求和,在本例中为 20。

4

2 回答 2

0

我不确定为什么它会抛出 Mul 对象错误,该错误意味着该对象是单个项目并且不可迭代。

关于您尝试使用 mpmath.fsum 的方法,签名与文档不匹配。

mpmath.fsum(terms, absolute=False, squared=False)

您使用的方法似乎与nsum匹配。

mpmath.nsum(ctx, f, *intervals, **options)

如果你想在 python 中实现傅立叶变换,你可以在这里使用 python 和 numpy 检查实现。

于 2014-01-12T02:54:37.073 回答
0

SymPy 1.0 已包含fourier_series让您计算函数的傅立叶级数的函数。文档可以在这里找到。

例如。

>>> f = fourier_series(-x, (x, -1, 1))
>>> f.truncate(5)
-2*sin(pi*x)/pi + sin(2*pi*x)/pi - 2*sin(3*pi*x)/(3*pi)
于 2016-04-12T21:05:00.883 回答