
    wgY                     
   d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZmZ dd	lmZ dd
lmZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ ddgiZd Zd Z d Z!d Z" G d de      Z# G d de#      Z$ddZ%y)zFourier Series    )oopi)Wild)Expr)Add)Tuple)S)DummySymbol)sympify)sincossinc)
SeriesBase)
SeqFormula)Interval)is_sequence)fourier_series
matplotlibc                 $   ddl m} |d   |d   |d   z
  }}t        d|z  t        z  |z  |z        }d|z   || |z  |      z  |z  }|j	                  |t
        j                        dz  }|t        d|z   || |z  |      z  |z  |dt        f      fS )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	            Y/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/sympy/series/fourier.pyfourier_cos_seqr'      s    )!9fQi&)+qA1Q3r6!8a< H(lYth??!CG	a	 1	$Bz!h,4(?F)KK !1bz+ + +    c                     ddl m} |d   |d   |d   z
  }}t        d|z  t        z  |z  |z        }t	        d|z   || |z  |      z  |z  |dt
        f      S )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+       sm    )!9fQi&)+qA1Q3r6!8a< Ha(lYth%GGq":' 'r(   c                    d }d\  }}}| ||       t          t         }}}t        |t              r0t        |      dk(  r|\  }}}nt        |      dk(  r ||       }|\  }}t	        |t
              r||t        dt        |      z        t        j                  t        j                  g}||v s||v rt        d      t        |||f      S )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                     | j                   }t        |      dk(  r|j                         S |st        d      S t	        d| z        )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_xz _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    . &NAud~ R$565!v;!#NAud[AA KE4a EMT\3c&kABB##QZZ0I	TY.IJJAud#$$r(   c                 B   d }fd}ddl m}m}m}  | | ||                   }|j	                         }	t        dd d g      t        d	fd
g      |	d   D ]8  }
|
j                         d   }|D ]  } ||      r |||      rd| fc c S  : d|fS )Nc                     || j                   vS Nr/   )exprsr!   s     r&   check_fxzfinite_check.<locals>.check_fxc   s    ****r(   c                     t        | t        t        f      r2| j                  d   }|j	                  t
        |z  z  |z  z         yyy )Nr   TF)r6   r   r   argsmatchr   )_exprr!   r"   sincos_argsabs       r&   check_sincosz"finite_check.<locals>.check_sincosf   sJ    ec3Z(**Q-K  BqD!a0< )r(   r   )TR2TR1sincos_to_sumrI   c                     | j                   S r@   
is_Integerr.   s    r&   <lambda>zfinite_check.<locals>.<lambda>s   s
     r(   c                 (    | t         j                  k7  S r@   r	   r   rR   s    r&   rS   zfinite_check.<locals>.<lambda>s   s    QVV r(   
propertiesrJ   c                      | j                   vS r@   rA   r.   r!   s    r&   rS   zfinite_check.<locals>.<lambda>t   s    (? r(   r   FT)sympy.simplify.furL   rM   rN   as_coeff_addr   as_coeff_mul)fr!   r"   rC   rK   rL   rM   rN   rG   	add_coeffs
mul_coeffstrI   rJ   s    `           @@r&   finite_checkrb   a   s    + :9#c!f+&E""$IS46KNOAS?BCAq\  ^^%a(
 	 AQNl1a&;ax	   ;r(   c                      e Zd ZdZd Zed        Zed        Zed        Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        Zed        Zd ZddZddZd Zd Zd Zd ZddZd Zd Zd Zd Zy)FourierSeriesa9  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                 N    t        t        |      }t        j                  | g| S r@   )mapr   r   __new__)clsrE   s     r&   rg   zFourierSeries.__new__   s"    7D!||C'$''r(   c                      | j                   d   S Nr   rE   selfs    r&   functionzFourierSeries.function   s    yy|r(   c                 &    | j                   d   d   S Nr   r   rk   rl   s    r&   r!   zFourierSeries.x       yy|Ar(   c                 J    | j                   d   d   | j                   d   d   fS )Nr   r   rk   rl   s    r&   periodzFourierSeries.period   s%    		!Q1a11r(   c                 &    | j                   d   d   S )Nr   r   rk   rl   s    r&   r%   zFourierSeries.a0   rq   r(   c                 &    | j                   d   d   S )Nr   r   rk   rl   s    r&   anzFourierSeries.an   rq   r(   c                 &    | j                   d   d   S )Nr   rk   rl   s    r&   bnzFourierSeries.bn   rq   r(   c                 "    t        dt              S rj   )r   r   rl   s    r&   intervalzFourierSeries.interval   s    2r(   c                 .    | j                   j                  S r@   )rz   infrl   s    r&   r:   zFourierSeries.start       }}   r(   c                 .    | j                   j                  S r@   )rz   suprl   s    r&   r;   zFourierSeries.stop   r}   r(   c                     t         S r@   )r   rl   s    r&   lengthzFourierSeries.length   s    	r(   c                 X    t        | j                  d   | j                  d   z
        dz  S )Nr   r   r   )absrs   rl   s    r&   r"   zFourierSeries.L   s'    4;;q>DKKN23a77r(   c                 B    | j                   }|j                  |      r| S y r@   )r!   has)rm   oldnewr!   s       r&   
_eval_subszFourierSeries._eval_subs   s     FF771:K r(   c                     |t        |       S g }| D ]=  }t        |      |k(  r	 t        | S |t        j                  us-|j	                  |       ? t        | S )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   )rm   r    termsra   s       r&   truncatezFourierSeries.truncate   sf    @ 9: 	 A5zQ E{ Q		  E{r(   c                     t        | d|       D cg c]/  \  }}|t        j                  urt        t        |z  |z        |z  1 }}}t        | S c c}}w )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   )rm   r    ira   r   s        r&   sigma_approximationz!FourierSeries.sigma_approximation   s\    D 3<D!H2E %$!QQVVO b1fqj!A% % %E{%s   4Ac                    t        |      | j                  }}||j                  v rt        d|d|      | j                  |z   }| j
                  |z   }| j                  || j                  d   || j                  | j                  f      S )a  
        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%   rn   r   rE   rv   rx   )rm   r_   r!   r%   sfuncs        r&   shiftzFourierSeries.shift7  sv    * qz46611aHIIWWq[!yy		!r477DGG.DEEr(   c                    t        |      | j                  }}||j                  v rt        d|d|      | j                  j                  |||z         }| j                  j                  |||z         }| j                  j                  |||z         }| j                  || j                  d   | j                  ||f      S )a  
        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   rv   r   rx   rn   r   rE   r%   rm   r_   r!   rv   rx   r   s         r&   shiftxzFourierSeries.shiftxV      * qz46611aHIIWW\\!QU#WW\\!QU#""1a!e,yy		!twwB.?@@r(   c                 b   t        |      | j                  }}||j                  v rt        d|d|      | j                  j                  |      }| j                  j                  |      }| j                  |z  }| j                  d   |z  }| j                  || j                  d   |||f      S )a  
        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   rv   	coeff_mulrx   r%   rE   r   )rm   r_   r!   rv   rx   r%   r   s          r&   scalezFourierSeries.scalev  s    * qz46611aHIIWWq!WWq!WWq[		!q yy		!r2rl;;r(   c                    t        |      | j                  }}||j                  v rt        d|d|      | j                  j                  |||z        }| j                  j                  |||z        }| j                  j                  |||z        }| j                  || j                  d   | j                  ||f      S )a  
        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&   scalexzFourierSeries.scalex  r   r(   Nc                 >    | D ]  }|t         j                  us|c S  y r@   rU   )rm   r!   logxcdirra   s        r&   _eval_as_leading_termz#FourierSeries._eval_as_leading_term  s!     	A	r(   c                     |dk(  r| j                   S | j                  j                  |      | j                  j                  |      z   S rj   )r%   rv   coeffrx   )rm   pts     r&   
_eval_termzFourierSeries._eval_term  s7    777Nww}}R 477==#444r(   c                 $    | j                  d      S )N)r   rl   s    r&   __neg__zFourierSeries.__neg__  s    zz"~r(   c                    t        |t              r| j                  |j                  k7  rt        d      | j                  |j                  }}| j
                  |j
                  j                  ||      z   }| j                  |j                  vr|S | j                  |j                  z   }| j                  |j                  z   }| j                  |j                  z   }| j                  || j                  d   |||f      S t        | |      S )N(Both the series should have same periodsr   )r6   rd   rs   r2   r!   rn   r   r/   rv   rx   r%   r   rE   r   )rm   otherr!   yrn   rv   rx   r%   s           r&   __add__zFourierSeries.__add__  s    e]+{{ell* !KLL66577qA}}u~~':':1a'@@HvvX222588#B588#B588#B99Xtyy|b"b\BB4r(   c                 &    | j                  |       S r@   )r   )rm   r   s     r&   __sub__zFourierSeries.__sub__  s    ||UF##r(   )r5   rj   )__name__
__module____qualname____doc__rg   propertyrn   r!   rs   r%   rv   rx   rz   r:   r;   r   r"   r   r   r   r   r   r   r   r   r   r   r   r    r(   r&   rd   rd      s-    (     2 2         ! ! ! !   8 8
*XDLF>A@<BA@
5
 &$r(   rd   c                   T    e Zd ZdZd Zed        Zed        Zd Zd Z	d Z
d Zd	 Zy
)FiniteFourierSeriesa  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           	         t        |      }t        |      }t        |      }t        |t              rt        |      dk(  sq|j	                         \  }}ddlm} |t        |D cg c]
  } ||       c} z   }|j                  dddd      j	                         \  }	}
|d   t        |d   |d   z
        dz  }t        dd	 d
 g      }t        dfdg      }i }i }|
D ]  }|j                  |t        |t        |z  z  z        z        }|j                  |t        |t        |z  z  z        z        }|r0||   |j                  ||   t         j"                        z   |||   <   |r0||   |j                  ||   t         j"                        z   |||   <   |	|z  }	 t        |	||      }t%        j&                  | |||      S c c}w )Nr5   r   )TR10F)trig
power_base	power_explogr   r   rI   c                     | j                   S r@   rP   rR   s    r&   rS   z-FiniteFourierSeries.__new__.<locals>.<lambda>  s
     r(   c                 &    | t         j                  uS r@   rU   rR   s    r&   rS   z-FiniteFourierSeries.__new__.<locals>.<lambda>  s    QRQWQW r(   rV   rJ   c                      | j                   vS r@   rA   rY   s    r&   rS   z-FiniteFourierSeries.__new__.<locals>.<lambda>  s    0G r(   )r   r6   r   r0   r[   rZ   r   r   expandr   r   rF   r   r   r   getr	   r   r   rg   )rh   r]   r   rB   cer   r   rexprr%   exp_lsr"   rI   rJ   rv   rx   pra   qr!   s                      @r&   rg   zFiniteFourierSeries.__new__  s   AJ5%(SZ1_%%'DAq.q1!d1g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 "b"%E||CFE223 2s   %G
c           	          | j                   rdnd}|t        t        | j                  j	                               j                  t        | j                  j	                                           dz   z  }t        d|      S rp   )r%   maxsetrv   keysunionrx   r   )rm   _lengths     r&   rz   zFiniteFourierSeries.interval&  sY    ww!A3s477<<>*00TWW\\^1DEFJJ7##r(   c                 4    | j                   | j                  z
  S r@   )r;   r:   rl   s    r&   r   zFiniteFourierSeries.length,  s    yy4::%%r(   c                 2   t        |      | j                  }}||j                  v rt        d|d|      | j	                         j                  |||z         }| j                  j                  |||z         }| j                  || j                  d   |      S Nr   r   r   	r   r!   r/   r2   r   r   rn   r   rE   rm   r_   r!   rG   r   s        r&   r   zFiniteFourierSeries.shiftx0      qz46611aHII$$QA.""1a!e,yy		!e44r(   c                     t        |      | j                  }}||j                  v rt        d|d|      | j	                         |z  }| j
                  |z  }| j                  || j                  d   |      S r   )r   r!   r/   r2   r   rn   r   rE   r   s        r&   r   zFiniteFourierSeries.scale;  sh    qz46611aHII!#!yy		!e44r(   c                 2   t        |      | j                  }}||j                  v rt        d|d|      | j	                         j                  |||z        }| j                  j                  |||z        }| j                  || j                  d   |      S r   r   r   s        r&   r   zFiniteFourierSeries.scalexF  r   r(   c                    |dk(  r| j                   S | j                  j                  |t        j                        t        |t        | j                  z  z  | j                  z        z  | j                  j                  |t        j                        t        |t        | j                  z  z  | j                  z        z  z   }|S rj   )r%   rv   r   r	   r   r   r   r"   r!   rx   r   )rm   r   _terms      r&   r   zFiniteFourierSeries._eval_termQ  s    777NB'#bBK.@466.I*JJ''++b!&&)Cb466k0BTVV0K,LLMr(   c                    t        |t              r4|j                  t        | j                  | j
                  d   d            S t        |t              r| j                  |j                  k7  rt        d      | j                  |j                  }}| j                  |j                  j                  ||      z   }| j                  |j                  vr|S t        || j
                  d         S y )Nr   F)finiter   )r   )r6   rd   r   r   rn   rE   r   rs   r2   r!   r   r/   )rm   r   r!   r   rn   s        r&   r   zFiniteFourierSeries.__add__Y  s    e]+==tyy|7<"> ? ?23{{ell* !KLL66577qA}}u~~':':1a'@@HvvX222!(499Q<@@ 4r(   N)r   r   r   r   rg   r   rz   r   r   r   r   r   r   r   r(   r&   r   r     sP    $L"3H $ $
 & &	5	5	5Ar(   r   Nc                    t        |       } t        | |      }|d   }|| j                  vr| S |r6t        |d   |d   z
        dz  }t	        | ||      \  }}|rt        | ||      S t        d      }|d   |d   z   dz  }|j                  r| j                  ||       }	| |	k(  r2t        | ||      \  }
}t        ddt        f      }t        | ||
||f      S | |	 k(  r?t        j                  }
t        ddt        f      }t        | ||      }t        | ||
||f      S t        | ||      \  }
}t        | ||      }t        | ||
||f      S )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   rb   r   r
   is_zeror   r'   r   r   rd   r	   r   r+   )r]   r   r   r!   r"   	is_finiteres_fr    centerneg_fr%   rv   rx   s                r&   r   r   j  sh   H 	
AQ'Fq	Aq	F1I%&*'1a0	5&q&%88c
AQi&)#q(F~~q1":$Q2FBA2w'B FRRL995&[BA2w'B FA.B FRRL99Q*FB	FA	&BFRRL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=   rb   rd   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(   