Hi,
I have written 2 functions to support Fourier sine and cosine series. See
code below.
I have these questions:
1. Do you think is worth to add it to Sympy?
2. Should it be a part of series/series.py or a new file
series/series_fourier.py ?
3. When testing it I tried to add it to series_py. The import for integrate
causes an Import Error. Any hints how to avoid it?
from .series import series
File "/home/pape/sympy/sympy/series/series.py", line 15, in <module>
from sympy.integrals import integrate
File "/home/pape/sympy/sympy/integrals/__init__.py", line 12, in <module>
from .integrals import integrate, Integral, line_integrate
File "/home/pape/sympy/sympy/integrals/integrals.py", line 3, in <module>
from sympy.concrete.expr_with_limits import AddWithLimits
File "/home/pape/sympy/sympy/concrete/__init__.py", line 1, in <module>
from .products import product, Product
File "/home/pape/sympy/sympy/concrete/products.py", line 11, in <module>
from sympy.polys import quo, roots
ImportError: cannot import name roots
Thanks,
Pablo
-----
x = symbols('x', real=True)
L= symbols('L', real=True, positive=True)
pprint(series_fourier(x, x, -L, L))
∞
_____
╲
╲ n ⎛π⋅n⋅x⎞
╲ -2⋅(-1) ⋅L⋅sin⎜─────⎟
╲ ⎝ L ⎠
╱ ──────────────────────
╱ π⋅n
╱
╱
‾‾‾‾‾
n = 1
pprint(series_fourier_expansion(x/(2*L), x, 4, 0, 2*L))
⎛π⋅x⎞ ⎛2⋅π⋅x⎞ ⎛3⋅π⋅x⎞ ⎛4⋅π⋅x⎞
sin⎜───⎟ sin⎜─────⎟ sin⎜─────⎟ sin⎜─────⎟
⎝ L ⎠ ⎝ L ⎠ ⎝ L ⎠ ⎝ L ⎠ 1
- ──────── - ────────── - ────────── - ────────── + ─
π 2⋅π 3⋅π 4⋅π 2
-----
from __future__ import print_function, division
from sympy.core.add import Add
from sympy.integrals import integrate
from sympy.core.singleton import S
from sympy.core.compatibility import xrange
from sympy.functions.elementary.trigonometric import cos, sin
from sympy.core.symbol import Symbol
from sympy.concrete.summations import Sum
def series_fourier_expansion(expr, x, n, interval_inf, interval_sup):
""" Returns a truncated Fourier sine and cosine series expansion
up to n+1 terms (sin(nx)/cos(nx)) over the indicated interval
"""
# http://mathworld.wolfram.com/FourierSeries.html
if interval_sup < interval_inf:
raise Exception('interval_sup cannot be less than interval_inf')
L = interval_sup - interval_inf
l = list()
integrate_tuple = (x, interval_inf, interval_sup)
l.append(integrate(expr, integrate_tuple)/L) # A0/2
for m in xrange(1, n+1):
cos_expr = cos(2*m*S.Pi*x/L)
sin_expr = sin(2*m*S.Pi*x/L)
An = 2*integrate(expr*cos_expr, integrate_tuple)/L
Bn = 2*integrate(expr*sin_expr, integrate_tuple)/L
l.append(An*cos_expr)
l.append(Bn*sin_expr)
return Add(*l)
def series_fourier(expr, x, interval_inf, interval_sup):
""" Returns the unevaluated Fourier sine and cosine series calculated
over the indicated interval
"""
# http://mathworld.wolfram.com/FourierSeries.html
if interval_sup < interval_inf:
raise Exception('interval_sup cannot be less than interval_inf')
n = Symbol('n', integer=True, positive=True)
L = interval_sup - interval_inf
integrate_tuple = (x, interval_inf, interval_sup)
result = integrate(expr, integrate_tuple)/L # A0/2
cos_expr = cos(2*n*S.Pi*x/L)
sin_expr = sin(2*n*S.Pi*x/L)
An = (2*integrate(expr*cos_expr, integrate_tuple)/L).simplify()
Bn = (2*integrate(expr*sin_expr, integrate_tuple)/L).simplify()
if An != S.Zero:
result += Sum(An*cos_expr, (n, 1, S.Infinity))
if Bn != S.Zero:
result += Sum(Bn*sin_expr, (n, 1, S.Infinity))
return result
--
You received this message because you are subscribed to the Google Groups
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.