
    gY                        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%dS )zFourier Series    )oopi)Wild)Expr)Add)Tuple)S)DummySymbol)sympify)sincossinc)
SeriesBase)
SeqFormula)Interval)is_sequence)fourier_series
matplotlibc                 V   ddl m} |d         |d         |d         z
  }}t          d|z  t          z  |z  |z            }d|z   || |z  |          z  |z  }|                    |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	            P/var/www/html/ai-engine/env/lib/python3.11/site-packages/sympy/series/fourier.pyfourier_cos_seqr'      s    ))))))!9fQi&)+qA1Q3r6!8a<  H(lYYth???!CG	a	 	 1	$Bz!h,4(?F)K)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+       s    ))))))!9fQi&)+qA1Q3r6!8a<  Ha(lYYth%G%GGq":' ' 'r(   c                    d }d\  }}}| ||           t            t           }}}t          |t                    r=t          |          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|                                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@   s]     t99>>88:: 	::P   r(   )NNNN   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;;!#NAudd[[AA KE4a   CEMT\3c&kkABBB#QZ0I	TY..IJJJAud#$$$r(   c                    d }fd}ddl m}m}m}  | | ||                               }|                                }	t          dd d g          t          d	fd
g          |	d         D ]B}
|
                                d         }|D ]#} ||          s |||          sd| fc c S $Cd|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          r7| j        d         }|                    t
          |z  z  |z  z             dS dS d S )Nr   TF)r6   r   r   argsmatchr   )_exprr!   r"   sincos_argsabs       r&   check_sincosz"finite_check.<locals>.check_sincosf   s\    ec3Z(( 	*Q-K  BqD!a00<tu	 	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        k    S r@   r	   r   rR   s    r&   rS   zfinite_check.<locals>.<lambda>s   s    QV 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99999999M##cc!ff++&&E""$$IS446K6KNOOOAS????BCCCAq\    ^^%%a(
 	  	 AHQNN  ll1a&;&;  ax	  ;r(   c                   X   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dS )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                 P    t          t          |          }t          j        | g|R  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    y|r(   c                 (    | j         d         d         S Nr   r   rk   rl   s    r&   r!   zFourierSeries.x       y|Ar(   c                 N    | 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>DKN233a77r(   c                 B    | j         }|                    |          r| S d S r@   )r!   has)rm   oldnewr!   s       r&   
_eval_subszFourierSeries._eval_subs   s*    F771:: 	K	 	r(   r5   c                     |t          |           S g }| D ]:}t          |          |k    r n$|t          j        ur|                    |           ;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   sc    @ 9:: 	  	 A5zzQQE{r(   c                 \    fdt          | d                   D             }t          | S )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
        c                 l    g | ]0\  }}|t           j        ut          t          |z  z            |z  1S  )r	   r   r   r   ).0ira   r    s      r&   
<listcomp>z5FourierSeries.sigma_approximation.<locals>.<listcomp>3  sD     % % %$!QQVOO b1fqj!!A%#OOr(   N)	enumerater   )rm   r    r   s    ` r&   sigma_approximationz!FourierSeries.sigma_approximation   sE    D% % % %)D!H2E2E % % %E{r(   c                     t          |          | j        }}||j        v rt          d|d|          | j        |z   }| j        |z   }|                     || 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  s{    * qzz461*111aaHIIIWq[!yy	!r47DG.DEEEr(   c                 r   t          |          | j        }}||j        v rt          d|d|          | j                            |||z             }| j                            |||z             }| j                            |||z             }|                     || 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      * qzz461*111aaHIIIW\\!QU##W\\!QU##""1a!e,,yy	!twB.?@@@r(   c                 P   t          |          | j        }}||j        v rt          d|d|          | j                            |          }| j                            |          }| j        |z  }| j        d         |z  }| 	                    || 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    * qzz461*111aaHIIIWq!!Wq!!Wq[	!q yy	!r2rl;;;r(   c                 r   t          |          | j        }}||j        v rt          d|d|          | j                            |||z            }| j                            |||z            }| j                            |||z            }|                     || 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(   Nr   c                 4    | D ]}|t           j        ur|c S d S r@   rU   )rm   r!   logxcdirra   s        r&   _eval_as_leading_termz#FourierSeries._eval_as_leading_term  s4     	 	A 	 	r(   c                     |dk    r| j         S | j                            |          | j                            |          z   S rj   )r%   rv   coeffrx   )rm   pts     r&   
_eval_termzFourierSeries._eval_term  s9    777Nw}}R  47==#4#444r(   c                 ,    |                      d          S )N)r   rl   s    r&   __neg__zFourierSeries.__neg__  s    zz"~~r(   c                    t          |t                    r| j        |j        k    rt          d          | j        |j        }}| j        |j                            ||          z   }| j        |j        vr|S | j        |j        z   }| j	        |j	        z   }| j
        |j
        z   }|                     || 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]++ 	C{el** !KLLL657qA}u~':':1a'@'@@HvX22258#B58#B58#B99Xty|b"b\BBB4r(   c                 .    |                      |           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(   r&   rd   rd      s+         ( ( (   X   X 2 2 X2   X   X   X   X ! ! X! ! ! X!   X 8 8 X8  
* * * *XD D D DLF F F>A A A@< < <BA A A@   
5 5 5
       &$ $ $ $ $r(   rd   c                   b    e Zd ZdZd Zed             Zed             Zd Zd Z	d Z
d Zd	 Zd
S )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           	      B   t          |          }t          |          }t          |          }t          |t                    rt          |          dk    s|                                \  }}ddlm |t          fd|D              z   }|                    dddd                                          \  }}|d         t          |d         |d         z
            dz  }	t          d	d
 d g          }
t          dfdg          }i }i }|D ]}|                    |t          |
t          |	z  z  z            z            }|                    |t          |
t          |	z  z  z            z            }|r9||         |                    ||
         t           j                  z   |||
         <   |r9||         |                    ||
         t           j                  z   |||
         <   ||z  }t          |||          }t%          j        | |||          S )Nr5   r   )TR10c                 &    g | ]} |          S r   r   )r   r   r   s     r&   r   z/FiniteFourierSeries.__new__.<locals>.<listcomp>  s!    111!dd1gg111r(   F)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    QRQW 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erexprr%   exp_lsr"   rI   rJ   rv   rx   pra   qr   r!   s                    @@r&   rg   zFiniteFourierSeries.__new__  s+   AJJ5%(( 	&SZZ1__%%''DAq......1111q11122E5UeY^__llnnJBq	AF1Iq	)**Q.AS&<&<>W>W%Z[[[AS&G&G&G&G%JKKKABB   GGAAaL1$4 5 5566GGAAaL1$4 5 5566  tbffQqT16&:&::BqtHH  tbffQqT16&:&::BqtHH!GBB"b"%%E|CFE222r(   c           	         | j         rdnd}|t          t          | j                                                                      t          | j                                                                      dz   z  }t          d|          S rp   )r%   maxsetrv   keysunionrx   r   )rm   _lengths     r&   rz   zFiniteFourierSeries.interval&  sk    w%!!A3s47<<>>**00TW\\^^1D1DEEFFJJ7###r(   c                      | j         | j        z
  S r@   )r;   r:   rl   s    r&   r   zFiniteFourierSeries.length,  s    y4:%%r(   c                 @   t          |          | j        }}||j        v rt          d|d|          |                                                     |||z             }| j                            |||z             }|                     || 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      qzz461*111aaHIII$$QA..""1a!e,,yy	!e444r(   c                     t          |          | j        }}||j        v rt          d|d|          |                                 |z  }| j        |z  }|                     || j        d         |          S r   )r   r!   r/   r2   r   rn   r   rE   r   s        r&   r   zFiniteFourierSeries.scale;  su    qzz461*111aaHIII!#!yy	!e444r(   c                 @   t          |          | j        }}||j        v rt          d|d|          |                                                     |||z            }| j                            |||z            }|                     || j        d         |          S r   r   r   s        r&   r   zFiniteFourierSeries.scalexF  r   r(   c                 V   |dk    r| j         S | j                            |t          j                  t          |t          | j        z  z  | j        z            z  | 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    777NB''#bBK.@46.I*J*JJ'++b!&))Cb46k0BTV0K,L,LLMr(   c                    t          |t                    r5|                    t          | j        | j        d         d                    S t          |t                    r|| j        |j        k    rt          d          | j	        |j	        }}| j        |j        
                    ||          z   }| j	        |j        vr|S t          || j        d                   S d S )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]++ 	A==ty|7<"> "> "> ? ? ?233 
	A{el** !KLLL657qA}u~':':1a'@'@@HvX222!(49Q<@@@@
	A 
	Ar(   N)r   r   r   r   rg   r   rz   r   r   r   r   r   r   r   r(   r&   r   r     s        $ $L"3 "3 "3H $ $ X$
 & & X&	5 	5 	5	5 	5 	5	5 	5 	5  A A A A Ar(   r   NTc                    t          |           } t          | |          }|d         }|| j        vr| S |rHt          |d         |d         z
            dz  }t	          | ||          \  }}|rt          | ||          S t          d          }|d         |d         z   dz  }|j        r|                     ||           }	| |	k    r?t          | ||          \  }
}t          ddt          f          }t          | ||
||f          S | |	 k    rHt          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  s   H 	

AQ''Fq	A 9q	F1I%&&*'1a00	5 	9&q&%888c

AQi&)#q(F~ 
:q1"::$Q22FBA2w''B FRRL9995&[[BA2w''B FA..B FRRL999Q**FB	FA	&	&BFRRL1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 C C C C C C C C 0 0 0 0 0 0 - - - - - - $ $ $ $ $ $ 1 1 1 1 1 1 ,l^< + + +' ' '5% 5% 5%p  <Y$ Y$ Y$ Y$ Y$J Y$ Y$ Y$x
LA LA LA LA LA- LA LA LA^A2 A2 A2 A2 A2 A2r(   