
    \hY                        S r SSKJrJr  SSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJr  SSKJrJr  SS	KJr  SS
KJrJrJr  SSKJr  SSKJr  SSKJr  SSKJr  SS/0rS rS r S r!S r" " S S\5      r# " S S\#5      r$SS jr%g)zFourier Series    )oopi)Wild)Expr)Add)Tuple)S)DummySymbol)sympify)sincossinc)
SeriesBase)
SeqFormula)Interval)is_sequence)fourier_series
matplotlibc                    SSK Jn  US   US   US   -
  pT[        SU-  [        -  U-  U-  5      nSU-  U" X-  U5      -  U-  nUR	                  U[
        R                  5      S-  nU[        SU-  U" X-  U5      -  U-  US[        45      4$ )z,Returns the cos sequence in a Fourier seriesr   	integrate      )	sympy.integralsr   r   r   subsr	   Zeror   r   )	funclimitsnr   xLcos_termformulaa0s	            L/var/www/auris/envauris/lib/python3.13/site-packages/sympy/series/fourier.pyfourier_cos_seqr'      s    )!9fQi&)+q1Q3r6!8a< H(lYt??!CG	a	 1	$Bz!h,4?F)KK !1bz+ + +    c                     SSK Jn  US   US   US   -
  pT[        SU-  [        -  U-  U-  5      n[	        SU-  U" X-  U5      -  U-  US[
        45      $ )z,Returns the sin sequence in a Fourier seriesr   r   r   r   )r   r   r   r   r   r   )r   r   r    r   r!   r"   sin_terms          r&   fourier_sin_seqr+       si    )!9fQi&)+q1Q3r6!8a< Ha(lYt%GGq":' 'r(   c                    S nSu  p4nUc  U" U 5      [         * [         pTn[        U[        5      (       a0  [        U5      S:X  a  Uu  p4nO[        U5      S:X  a  U" U 5      nUu  pE[	        U[
        5      (       a  Ub  Uc  [        S[        U5      -  5      e[        R                  [        R                  /nXF;   d  XV;   a  [        S5      e[        X4U45      $ )a  
Limits should be of the form (x, start, stop).
x should be a symbol. Both start and stop should be bounded.

Explanation
===========

* If x is not given, x is determined from func.
* If limits is None. Limit of the form (x, -pi, pi) is returned.

Examples
========

>>> from sympy.series.fourier import _process_limits as pari
>>> from sympy.abc import x
>>> pari(x**2, (x, -2, 2))
(x, -2, 2)
>>> pari(x**2, (-2, 2))
(x, -2, 2)
>>> pari(x**2, None)
(x, -pi, pi)
c                     U R                   n[        U5      S:X  a  UR                  5       $ U(       d  [        S5      $ [	        SU -  5      e)Nr   kz specify dummy variables for %s. If the function contains more than one free symbol, a dummy variable should be supplied explicitly e.g. FourierSeries(m*n**2, (n, -pi, pi)))free_symbolslenpopr
   
ValueError)r   frees     r&   _find_x _process_limits.<locals>._find_x@   sN      t9>88::P  r(   )NNN   r   zInvalid limits given: %sz.Both the start and end value should be bounded)r   r   r   r0   
isinstancer   r2   strr	   NegativeInfinityInfinityr   )r   r   r4   r!   startstop	unboundeds          r&   _process_limitsr>   )   s    . &NAd~ R$65!!v;!#NAd[AA KEa  EMT\3c&kABB##QZZ0IT.IJJAd#$$r(   c                 X  ^^^ S nUU4S jnSSK JnJnJn  U" U" U" U 5      5      5      nUR	                  5       n	[        SS S /S9m[        S	U4S
 j/S9mU	S    HF  n
U
R                  5       S   nU H*  nU" UT5      (       a  M  U" UTU5      (       a  M$  SU 4s  s  $    MH     SU4$ )Nc                     XR                   ;  $ Nr/   )exprsr!   s     r&   check_fxfinite_check.<locals>.check_fxc   s    ****r(   c                    > [        U [        [        45      (       a3  U R                  S   nUR	                  T[
        U-  -  U-  T-   5      b  ggg )Nr   TF)r7   r   r   argsmatchr   )_exprr!   r"   sincos_argsabs       r&   check_sincos"finite_check.<locals>.check_sincosf   sM    ec3Z((**Q-K  BqD!a0< )r(   r   )TR2TR1sincos_to_sumrK   c                     U R                   $ rA   
is_Integerr.   s    r&   <lambda>finite_check.<locals>.<lambda>s   s    r(   c                 (    U [         R                  :g  $ rA   r	   r   rU   s    r&   rV   rW   s   s    QVVr(   
propertiesrL   c                 "   > TU R                   ;  $ rA   rB   r.   r!   s    r&   rV   rW   t   s    (?r(   r   FT)sympy.simplify.furO   rP   rQ   as_coeff_addr   as_coeff_mul)fr!   r"   rD   rM   rO   rP   rQ   rI   	add_coeffs
mul_coeffstrK   rL   s    `           @@r&   finite_checkrf   a   s    + :9#c!f+&E""$IS46KNOAS?BCAq\^^%a(
AQNNl1a&;&;ax   ;r(   c                      \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	\S 5       r
\S 5       r\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       r\S 5       rS rSS jrSS jrS rS rS rS rS rS rS rS rS rSrg)FourierSeries   a  Represents Fourier sine/cosine series.

Explanation
===========

This class only represents a fourier series.
No computation is performed.

For how to compute Fourier series, see the :func:`fourier_series`
docstring.

See Also
========

sympy.series.fourier.fourier_series
c                 P    [        [        U5      n[        R                  " U /UQ76 $ rA   )mapr   r   __new__)clsrG   s     r&   rl   FourierSeries.__new__   s"    7D!||C'$''r(   c                      U R                   S   $ Nr   rG   selfs    r&   functionFourierSeries.function   s    yy|r(   c                 &    U R                   S   S   $ Nr   r   rq   rr   s    r&   r!   FourierSeries.x       yy|Ar(   c                 J    U R                   S   S   U R                   S   S   4$ )Nr   r   rq   rr   s    r&   periodFourierSeries.period   s%    		!Q1a11r(   c                 &    U R                   S   S   $ )Nr   r   rq   rr   s    r&   r%   FourierSeries.a0   ry   r(   c                 &    U R                   S   S   $ )Nr   r   rq   rr   s    r&   anFourierSeries.an   ry   r(   c                 &    U R                   S   S   $ )Nr   rq   rr   s    r&   bnFourierSeries.bn   ry   r(   c                 "    [        S[        5      $ rp   )r   r   rr   s    r&   intervalFourierSeries.interval   s    2r(   c                 .    U R                   R                  $ rA   )r   infrr   s    r&   r;   FourierSeries.start       }}   r(   c                 .    U R                   R                  $ rA   )r   suprr   s    r&   r<   FourierSeries.stop   r   r(   c                     [         $ rA   )r   rr   s    r&   lengthFourierSeries.length   s    	r(   c                 X    [        U R                  S   U R                  S   -
  5      S-  $ )Nr   r   r   )absr{   rr   s    r&   r"   FourierSeries.L   s'    4;;q>DKKN23a77r(   c                 L    U R                   nUR                  U5      (       a  U $ g rA   )r!   has)rs   oldnewr!   s       r&   
_eval_subsFourierSeries._eval_subs   s"    FF771::K r(   c                     Uc  [        U 5      $ / nU  H:  n[        U5      U:X  a    O*U[        R                  Ld  M)  UR	                  U5        M<     [        U6 $ )a%  
Return the first n nonzero terms of the series.

If ``n`` is None return an iterator.

Parameters
==========

n : int or None
    Amount of non-zero terms in approximation or None.

Returns
=======

Expr or iterator :
    Approximation of function expanded into Fourier series.

Examples
========

>>> from sympy import fourier_series, pi
>>> from sympy.abc import x
>>> s = fourier_series(x, (x, -pi, pi))
>>> s.truncate(4)
2*sin(x) - sin(2*x) + 2*sin(3*x)/3 - sin(4*x)/2

See Also
========

sympy.series.fourier.FourierSeries.sigma_approximation
)iterr0   r	   r   appendr   )rs   r    termsre   s       r&   truncateFourierSeries.truncate   sS    @ 9:A5zQQ	  E{r(   c                     [        U SU 5       VVs/ s H2  u  p#U[        R                  Ld  M  [        [        U-  U-  5      U-  PM4     nnn[        U6 $ s  snnf )a  
Return :math:`\sigma`-approximation of Fourier series with respect
to order n.

Explanation
===========

Sigma approximation adjusts a Fourier summation to eliminate the Gibbs
phenomenon which would otherwise occur at discontinuities.
A sigma-approximated summation for a Fourier series of a T-periodical
function can be written as

.. math::
    s(\theta) = \frac{1}{2} a_0 + \sum _{k=1}^{m-1}
    \operatorname{sinc} \Bigl( \frac{k}{m} \Bigr) \cdot
    \left[ a_k \cos \Bigl( \frac{2\pi k}{T} \theta \Bigr)
    + b_k \sin \Bigl( \frac{2\pi k}{T} \theta \Bigr) \right],

where :math:`a_0, a_k, b_k, k=1,\ldots,{m-1}` are standard Fourier
series coefficients and
:math:`\operatorname{sinc} \Bigl( \frac{k}{m} \Bigr)` is a Lanczos
:math:`\sigma` factor (expressed in terms of normalized
:math:`\operatorname{sinc}` function).

Parameters
==========

n : int
    Highest order of the terms taken into account in approximation.

Returns
=======

Expr :
    Sigma approximation of function expanded into Fourier series.

Examples
========

>>> from sympy import fourier_series, pi
>>> from sympy.abc import x
>>> s = fourier_series(x, (x, -pi, pi))
>>> s.sigma_approximation(4)
2*sin(x)*sinc(pi/4) - 2*sin(2*x)/pi + 2*sin(3*x)*sinc(3*pi/4)/3

See Also
========

sympy.series.fourier.FourierSeries.truncate

Notes
=====

The behaviour of
:meth:`~sympy.series.fourier.FourierSeries.sigma_approximation`
is different from :meth:`~sympy.series.fourier.FourierSeries.truncate`
- it takes all nonzero terms of degree smaller than n, rather than
first n nonzero ones.

References
==========

.. [1] https://en.wikipedia.org/wiki/Gibbs_phenomenon
.. [2] https://en.wikipedia.org/wiki/Sigma_approximation
N)	enumerater	   r   r   r   r   )rs   r    ire   r   s        r&   sigma_approximation!FourierSeries.sigma_approximation   s]    D 3<D!H2E %2E$!QVVO &b1fqj!A%2E %E{%s
   AAc                    [        U5      U R                  p!X!R                  ;   a  [        SU< SU< 35      eU R                  U-   nU R
                  U-   nU R                  X@R                  S   X0R                  U R                  45      $ )aZ  
Shift the function by a term independent of x.

Explanation
===========

f(x) -> f(x) + s

This is fast, if Fourier series of f(x) is already
computed.

Examples
========

>>> from sympy import fourier_series, pi
>>> from sympy.abc import x
>>> s = fourier_series(x**2, (x, -pi, pi))
>>> s.shift(1).truncate()
-4*cos(x) + cos(2*x) + 1 + pi**2/3
'' should be independent of r   )
r   r!   r/   r2   r%   rt   r   rG   r   r   )rs   rc   r!   r%   sfuncs        r&   shiftFourierSeries.shift7  sn    * qz46611aHIIWWq[!yy		!r77DGG.DEEr(   c                 |   [        U5      U R                  p!X!R                  ;   a  [        SU< SU< 35      eU R                  R                  X"U-   5      nU R                  R                  X"U-   5      nU R                  R                  X"U-   5      nU R                  XPR                  S   U R                  X445      $ )aT  
Shift x by a term independent of x.

Explanation
===========

f(x) -> f(x + s)

This is fast, if Fourier series of f(x) is already
computed.

Examples
========

>>> from sympy import fourier_series, pi
>>> from sympy.abc import x
>>> s = fourier_series(x**2, (x, -pi, pi))
>>> s.shiftx(1).truncate()
-4*cos(x + 1) + cos(2*x + 2) + pi**2/3
r   r   r   r   r!   r/   r2   r   r   r   rt   r   rG   r%   rs   rc   r!   r   r   r   s         r&   shiftxFourierSeries.shiftxV      * qz46611aHIIWW\\!U#WW\\!U#""1!e,yy		!tww.?@@r(   c                 b   [        U5      U R                  p!X!R                  ;   a  [        SU< SU< 35      eU R                  R                  U5      nU R                  R                  U5      nU R                  U-  nU R                  S   U-  nU R                  X`R                  S   XSU45      $ )aZ  
Scale the function by a term independent of x.

Explanation
===========

f(x) -> s * f(x)

This is fast, if Fourier series of f(x) is already
computed.

Examples
========

>>> from sympy import fourier_series, pi
>>> from sympy.abc import x
>>> s = fourier_series(x**2, (x, -pi, pi))
>>> s.scale(2).truncate()
-8*cos(x) + 2*cos(2*x) + 2*pi**2/3
r   r   r   r   )
r   r!   r/   r2   r   	coeff_mulr   r%   rG   r   )rs   rc   r!   r   r   r%   r   s          r&   scaleFourierSeries.scalev  s    * qz46611aHIIWWq!WWq!WWq[		!q yy		!rrl;;r(   c                 |   [        U5      U R                  p!X!R                  ;   a  [        SU< SU< 35      eU R                  R                  X"U-  5      nU R                  R                  X"U-  5      nU R                  R                  X"U-  5      nU R                  XPR                  S   U R                  X445      $ )aL  
Scale x by a term independent of x.

Explanation
===========

f(x) -> f(s*x)

This is fast, if Fourier series of f(x) is already
computed.

Examples
========

>>> from sympy import fourier_series, pi
>>> from sympy.abc import x
>>> s = fourier_series(x**2, (x, -pi, pi))
>>> s.scalex(2).truncate()
-4*cos(2*x) + cos(4*x) + pi**2/3
r   r   r   r   r   s         r&   scalexFourierSeries.scalex  r   r(   c                 D    U  H  nU[         R                  Ld  M  Us  $    g rA   rY   )rs   r!   logxcdirre   s        r&   _eval_as_leading_term#FourierSeries._eval_as_leading_term  s    A r(   c                     US:X  a  U R                   $ U R                  R                  U5      U R                  R                  U5      -   $ rp   )r%   r   coeffr   )rs   pts     r&   
_eval_termFourierSeries._eval_term  s7    777Nww}}R 477==#444r(   c                 $    U R                  S5      $ )N)r   rr   s    r&   __neg__FourierSeries.__neg__  s    zz"~r(   c                    [        U[        5      (       a  U R                  UR                  :w  a  [        S5      eU R                  UR                  p2U R
                  UR
                  R                  X25      -   nU R                  UR                  ;  a  U$ U R                  UR                  -   nU R                  UR                  -   nU R                  UR                  -   nU R                  X@R                  S   XuU45      $ [        X5      $ )N(Both the series should have same periodsr   )r7   rh   r{   r2   r!   rt   r   r/   r   r   r%   r   rG   r   )rs   otherr!   yrt   r   r   r%   s           r&   __add__FourierSeries.__add__  s    e]++{{ell* !KLL66577q}}u~~':':1'@@HvvX222588#B588#B588#B99Xyy|bb\BB4r(   c                 &    U R                  U* 5      $ rA   )r   )rs   r   s     r&   __sub__FourierSeries.__sub__  s    ||UF##r(    N)r6   )__name__
__module____qualname____firstlineno____doc__rl   propertyrt   r!   r{   r%   r   r   r   r;   r<   r   r"   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes__r   r(   r&   rh   rh      s-    (     2 2         ! ! ! !   8 8
*XDLF>A@<BA@
5
 &$r(   rh   c                   \    \ rS rSrSrS r\S 5       r\S 5       rS r	S r
S rS	 rS
 rSrg)FiniteFourierSeriesi  a  Represents Finite Fourier sine/cosine series.

For how to compute Fourier series, see the :func:`fourier_series`
docstring.

Parameters
==========

f : Expr
    Expression for finding fourier_series

limits : ( x, start, stop)
    x is the independent variable for the expression f
    (start, stop) is the period of the fourier series

exprs: (a0, an, bn) or Expr
    a0 is the constant term a0 of the fourier series
    an is a dictionary of coefficients of cos terms
     an[k] = coefficient of cos(pi*(k/L)*x)
    bn is a dictionary of coefficients of sin terms
     bn[k] = coefficient of sin(pi*(k/L)*x)

    or exprs can be an expression to be converted to fourier form

Methods
=======

This class is an extension of FourierSeries class.
Please refer to sympy.series.fourier.FourierSeries for
further information.

See Also
========

sympy.series.fourier.FourierSeries
sympy.series.fourier.fourier_series
c           	        ^ [        U5      n[        U5      n[        U5      n[        U[        5      (       a  [        U5      S:X  Gdv  UR	                  5       u  pESSKJn  U[        U Vs/ s H
  ov" U5      PM     sn6 -   nUR                  SSSSS9R	                  5       u  pUS   m[        US   US   -
  5      S-  n[        SS	 S
 /S9n[        SU4S j/S9n0 n0 nU
 H  nUR                  U[        U[        U-  -  T-  5      -  5      nUR                  U[        U[        U-  -  T-  5      -  5      nU(       a1  UU   UR                  UU   [         R"                  5      -   UUU   '   M  U(       a1  UU   UR                  UU   [         R"                  5      -   UUU   '   M  U	U-  n	M     [        XU5      n[$        R&                  " XX#5      $ s  snf )Nr6   r   )TR10F)trig
power_base	power_explogr   r   rK   c                     U R                   $ rA   rS   rU   s    r&   rV   -FiniteFourierSeries.__new__.<locals>.<lambda>  s    r(   c                 &    U [         R                  L$ rA   rY   rU   s    r&   rV   r     s    QRQWQWr(   rZ   rL   c                 "   > TU R                   ;  $ rA   rB   r]   s    r&   rV   r     s    0Gr(   )r   r7   r   r0   r_   r^   r   r   expandr   r   rH   r   r   r   getr	   r   r   rl   )rm   ra   r   rC   cer   r   rexprr%   exp_lsr"   rK   rL   r   r   pre   qr!   s                      @r&   rl   FiniteFourierSeries.__new__  s   AJ5%((SZ1_%%'DA.q1q!d1gq122E5UeY^_llnJBq	AF1Iq	)*Q.AS&<>W%Z[AS&G%JKABB GGAAaL1$4 556GGAAaL1$4 556 tbffQqT166&::BqtH tbffQqT166&::BqtH!GB  ""%E||CF223 2s   *G
c           	         U R                   (       a  SOSnU[        [        U R                  R	                  5       5      R                  [        U R                  R	                  5       5      5      5      S-   -  n[        SU5      $ rw   )r%   maxsetr   keysunionr   r   )rs   _lengths     r&   r   FiniteFourierSeries.interval&  sY    ww!A3s477<<>*00TWW\\^1DEFJJ7##r(   c                 4    U R                   U R                  -
  $ rA   )r<   r;   rr   s    r&   r   FiniteFourierSeries.length,  s    yy4::%%r(   c                 0   [        U5      U R                  p!X!R                  ;   a  [        SU< SU< 35      eU R	                  5       R                  X"U-   5      nU R                  R                  X"U-   5      nU R                  X@R                  S   U5      $ Nr   r   r   	r   r!   r/   r2   r   r   rt   r   rG   rs   rc   r!   rI   r   s        r&   r   FiniteFourierSeries.shiftx0  v    qz46611aHII$$QA.""1!e,yy		!e44r(   c                     [        U5      U R                  p!X!R                  ;   a  [        SU< SU< 35      eU R	                  5       U-  nU R
                  U-  nU R                  X@R                  S   U5      $ r   )r   r!   r/   r2   r   rt   r   rG   r   s        r&   r   FiniteFourierSeries.scale;  sb    qz46611aHII!#!yy		!e44r(   c                 0   [        U5      U R                  p!X!R                  ;   a  [        SU< SU< 35      eU R	                  5       R                  X"U-  5      nU R                  R                  X"U-  5      nU R                  X@R                  S   U5      $ r   r   r   s        r&   r   FiniteFourierSeries.scalexF  r   r(   c                    US:X  a  U R                   $ U R                  R                  U[        R                  5      [        U[        U R                  -  -  U R                  -  5      -  U R                  R                  U[        R                  5      [        U[        U R                  -  -  U R                  -  5      -  -   nU$ rp   )r%   r   r   r	   r   r   r   r"   r!   r   r   )rs   r   _terms      r&   r   FiniteFourierSeries._eval_termQ  s    777NB'#bBK.@466.I*JJ''++b!&&)Cb466k0BTVV0K,LLMr(   c                    [        U[        5      (       a1  UR                  [        U R                  U R
                  S   SS95      $ [        U[        5      (       a  U R                  UR                  :w  a  [        S5      eU R                  UR                  p2U R                  UR                  R                  X25      -   nU R                  UR                  ;  a  U$ [        X@R
                  S   S9$ g )Nr   F)finiter   )r   )r7   rh   r   r   rt   rG   r   r{   r2   r!   r   r/   )rs   r   r!   r   rt   s        r&   r   FiniteFourierSeries.__add__Y  s    e]++==tyy|7<"> ? ?233{{ell* !KLL66577q}}u~~':':1'@@HvvX222!(99Q<@@ 4r(   r   N)r   r   r   r   r   rl   r   r   r   r   r   r   r   r   r   r   r(   r&   r   r     sP    $L"3H $ $
 & &	5	5	5Ar(   r   Nc                    [        U 5      n [        X5      nUS   nX0R                  ;  a  U $ U(       a8  [        US   US   -
  5      S-  n[	        XU5      u  pVU(       a  [        XU5      $ [        S5      nUS   US   -   S-  nUR                  (       a  U R                  X3* 5      n	X	:X  a.  [        XU5      u  p[        SS[        45      n[        XXU45      $ X	* :X  a<  [        R                  n
[        SS[        45      n[        XU5      n[        XXU45      $ [        XU5      u  p[        XU5      n[        XXU45      $ )a  Computes the Fourier trigonometric series expansion.

Explanation
===========

Fourier trigonometric series of $f(x)$ over the interval $(a, b)$
is defined as:

.. math::
    \frac{a_0}{2} + \sum_{n=1}^{\infty}
    (a_n \cos(\frac{2n \pi x}{L}) + b_n \sin(\frac{2n \pi x}{L}))

where the coefficients are:

.. math::
    L = b - a

.. math::
    a_0 = \frac{2}{L} \int_{a}^{b}{f(x) dx}

.. math::
    a_n = \frac{2}{L} \int_{a}^{b}{f(x) \cos(\frac{2n \pi x}{L}) dx}

.. math::
    b_n = \frac{2}{L} \int_{a}^{b}{f(x) \sin(\frac{2n \pi x}{L}) dx}

The condition whether the function $f(x)$ given should be periodic
or not is more than necessary, because it is sufficient to consider
the series to be converging to $f(x)$ only in the given interval,
not throughout the whole real line.

This also brings a lot of ease for the computation because
you do not have to make $f(x)$ artificially periodic by
wrapping it with piecewise, modulo operations,
but you can shape the function to look like the desired periodic
function only in the interval $(a, b)$, and the computed series will
automatically become the series of the periodic version of $f(x)$.

This property is illustrated in the examples section below.

Parameters
==========

limits : (sym, start, end), optional
    *sym* denotes the symbol the series is computed with respect to.

    *start* and *end* denotes the start and the end of the interval
    where the fourier series converges to the given function.

    Default range is specified as $-\pi$ and $\pi$.

Returns
=======

FourierSeries
    A symbolic object representing the Fourier trigonometric series.

Examples
========

Computing the Fourier series of $f(x) = x^2$:

>>> from sympy import fourier_series, pi
>>> from sympy.abc import x
>>> f = x**2
>>> s = fourier_series(f, (x, -pi, pi))
>>> s1 = s.truncate(n=3)
>>> s1
-4*cos(x) + cos(2*x) + pi**2/3

Shifting of the Fourier series:

>>> s.shift(1).truncate()
-4*cos(x) + cos(2*x) + 1 + pi**2/3
>>> s.shiftx(1).truncate()
-4*cos(x + 1) + cos(2*x + 2) + pi**2/3

Scaling of the Fourier series:

>>> s.scale(2).truncate()
-8*cos(x) + 2*cos(2*x) + 2*pi**2/3
>>> s.scalex(2).truncate()
-4*cos(2*x) + cos(4*x) + pi**2/3

Computing the Fourier series of $f(x) = x$:

This illustrates how truncating to the higher order gives better
convergence.

.. plot::
    :context: reset
    :format: doctest
    :include-source: True

    >>> from sympy import fourier_series, pi, plot
    >>> from sympy.abc import x
    >>> f = x
    >>> s = fourier_series(f, (x, -pi, pi))
    >>> s1 = s.truncate(n = 3)
    >>> s2 = s.truncate(n = 5)
    >>> s3 = s.truncate(n = 7)
    >>> p = plot(f, s1, s2, s3, (x, -pi, pi), show=False, legend=True)

    >>> p[0].line_color = (0, 0, 0)
    >>> p[0].label = 'x'
    >>> p[1].line_color = (0.7, 0.7, 0.7)
    >>> p[1].label = 'n=3'
    >>> p[2].line_color = (0.5, 0.5, 0.5)
    >>> p[2].label = 'n=5'
    >>> p[3].line_color = (0.3, 0.3, 0.3)
    >>> p[3].label = 'n=7'

    >>> p.show()

This illustrates how the series converges to different sawtooth
waves if the different ranges are specified.

.. plot::
    :context: close-figs
    :format: doctest
    :include-source: True

    >>> s1 = fourier_series(x, (x, -1, 1)).truncate(10)
    >>> s2 = fourier_series(x, (x, -pi, pi)).truncate(10)
    >>> s3 = fourier_series(x, (x, 0, 1)).truncate(10)
    >>> p = plot(x, s1, s2, s3, (x, -5, 5), show=False, legend=True)

    >>> p[0].line_color = (0, 0, 0)
    >>> p[0].label = 'x'
    >>> p[1].line_color = (0.7, 0.7, 0.7)
    >>> p[1].label = '[-1, 1]'
    >>> p[2].line_color = (0.5, 0.5, 0.5)
    >>> p[2].label = '[-pi, pi]'
    >>> p[3].line_color = (0.3, 0.3, 0.3)
    >>> p[3].label = '[0, 1]'

    >>> p.show()

Notes
=====

Computing Fourier series can be slow
due to the integration required in computing
an, bn.

It is faster to compute Fourier series of a function
by using shifting and scaling on an already
computed Fourier series rather than computing
again.

e.g. If the Fourier series of ``x**2`` is known
the Fourier series of ``x**2 - 1`` can be found by shifting by ``-1``.

See Also
========

sympy.series.fourier.FourierSeries

References
==========

.. [1] https://mathworld.wolfram.com/FourierSeries.html
r   r   r   r    )r   r>   r/   r   rf   r   r
   is_zeror   r'   r   r   rh   r	   r   r+   )ra   r   r  r!   r"   	is_finiteres_fr    centerneg_fr%   r   r   s                r&   r   r   j  s@   H 	
AQ'Fq	Aq	F1I%&*'a0	&q%88c
AQi&)#q(F~~q":$Q2FBA2w'B RRL99&[BA2w'B A.B RRL99Q*FB	A	&BRRL11r(   )NT)&r   sympy.core.numbersr   r   sympy.core.symbolr   sympy.core.exprr   sympy.core.addr   sympy.core.containersr   sympy.core.singletonr	   r
   r   sympy.core.sympifyr   (sympy.functions.elementary.trigonometricr   r   r   sympy.series.series_classr   sympy.series.sequencesr   sympy.sets.setsr   sympy.utilities.iterablesr   __doctest_requires__r'   r+   r>   rf   rh   r   r   r   r(   r&   <module>r     s|     ' "    ' " + & C C 0 - $ 1 ,l^< +'5%p<Y$J Y$x
LA- LA^A2r(   