ó
    Š*£h�Y  ã                   ó  • 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	            ÚQ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/sympy/series/fourier.pyÚfourier_cos_seqr'      s¥   € å)Ø�!‰9�f˜Q‘i &¨¡)Ñ+€qÜ�1�Q‘3”r‘6˜!‘8˜a‘<Ó €HØ�(‰l™Y t¡¸Ó?Ñ?À!ÑC€GØ	�‰�aœŸ™Ó	  1Ñ	$€BØŒz˜!˜h™,©°4±?ÀFÓ)KÑKØñØ ! 1¤b˜zó+ð +ð +ó    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   € å)Ø�!‰9�f˜Q‘i &¨¡)Ñ+€qÜ�1�Q‘3”r‘6˜!‘8˜a‘<Ó €HÜ�a˜(‘l¡Y¨t©ÀÓ%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   € Ø× Ñ ˆÜˆt‹9˜‹>Ø—8‘8“:ÐÞÜ˜“:Ðäð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Ë   € ò.ð &�N€AˆdØ�~Ù  ›¬¨¬R�$ˆÜ�6œ5×!Ñ!Üˆv‹;˜!ÓØ#‰NˆA‘dÜ�‹[˜AÓÙ˜“ˆAØ ‰KˆEä�aœ× Ñ  E¡M°T±\ÜÐ3´c¸&³kÑAÓBÐBä×#Ñ#¤Q§Z¡ZÐ0€IØÓ˜TÓ.ÜÐIÓJÐJä�A˜dÐ#Ó$Ð$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   ø€ Ü�eœc¤3˜Z×(Ñ(ØŸ*™* Q™-ˆKà× Ñ  ¤B q¡D¡¨!¡¨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   € ÀÄQÇVÁVÂ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Ñ4Ñ6KÐNÑO€AÜˆSÔ?ÐBÑC€Aà�qŒ\ˆØ—^‘^Ó% aÑ(ˆ
ÛˆAÙ˜Q —N“N¡l°1°a¸×&;Ó&;Ø˜a�x”ó ñ ð �ˆ;Ð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"   € Ü”7˜DÓ!ˆÜ�|Š|˜CÐ' $Ò'Ð'r(   c                 ó    • U R                   S   $ ©Nr   ©rG   ©Úselfs    r&   ÚfunctionÚFourierSeries.function”   s   € à�y‰y˜‰|Ðr(   c                 ó&   • U R                   S   S   $ ©Nr   r   rq   rr   s    r&   r!   ÚFourierSeries.x˜   ó   € à�y‰y˜‰|˜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‘> D§K¡K°¡NÑ2Ó3°aÑ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"   € Ø�F‰FˆØ�7‰7�1�:‰:Øˆ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Ü�5‹z˜Q‹ÙØœŸ™ŒØ—‘˜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ÀÀ!¸HÔ2Eô %Ò2E©$¨!ØœQŸV™V�Oó &””b˜1‘f˜q‘jÓ! 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   € ô* �q‹z˜4Ÿ6™6ˆ1à—‘ÓÝÃ1ÂaÐHÓIÐIà�W‰W�q‰[ˆØ—‘ Ñ!ˆà�y‰y˜§	¡	¨!¡¨r·7±7¸D¿G¹GÐ.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  ó“   € ô* �q‹z˜4Ÿ6™6ˆ1à—‘ÓÝÃ1ÂaÐHÓIÐIà�W‰W�\‰\˜! ™UÓ#ˆØ�W‰W�\‰\˜! ™UÓ#ˆØ—‘×"Ñ" 1¨!¡eÓ,ˆà�y‰y˜§	¡	¨!¡¨t¯w©w¸Ð.?Ó@Ð@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‘   € ô* �q‹z˜4Ÿ6™6ˆ1à—‘ÓÝÃ1ÂaÐHÓIÐIà�W‰W×Ñ˜qÓ!ˆØ�W‰W×Ñ˜qÓ!ˆØ�W‰W�q‰[ˆØ—	‘	˜!‘˜qÑ ˆà�y‰y˜§	¡	¨!¡¨r°r¨lÓ;Ð;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Ø—7‘7ˆNØ�w‰w�}‰}˜RÓ  4§7¡7§=¡=°Ó#4Ñ4Ð4r(   c                 ó$   • U R                  S5      $ )Néÿÿÿÿ)r´   rr   s    r&   Ú__neg__ÚFourierSeries.__neg__Á  s   € Ø�z‰z˜"‹~Ð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œ]×+Ñ+Ø�{‰{˜eŸl™lÓ*Ü Ð!KÓLÐLà—6‘6˜5Ÿ7™7ˆqØ—}‘} u§~¡~×':Ñ':¸1Ó'@Ñ@ˆHà�v‰v˜X×2Ñ2Ó2Ø�à—‘˜5Ÿ8™8Ñ#ˆBØ—‘˜5Ÿ8™8Ñ#ˆBØ—‘˜5Ÿ8™8Ñ#ˆBà—9‘9˜X§y¡y°¡|°b¸b°\ÓBÐBä�4ÓÐr(   c                 ó&   • U R                  U* 5      $ rA   )rË   )rs   rÉ   s     r&   Ú__sub__ÚFourierSeries.__sub__×  s   € Ø�|‰|˜U˜FÓ#Ð#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  pšU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Î     [        XžU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   € ÈÔQR×QWÑQWÉ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¹  ø€ Ü�A‹JˆÜ˜“ˆÜ˜“ˆä˜5¤%×(Ñ(¬S°«Z¸1¬_à×%Ñ%Ó'‰DˆAÝ.Øœ©qÓ1ªq¨!˜d 1žg©qÑ1Ð2Ñ2ˆEØŸ™¨5¸UÈeÐY^˜Ð_×lÑlÓn‰JˆBà�q‘	ˆAÜ�F˜1‘I  q¡	Ñ)Ó*¨QÑ.ˆAä�SÑ&<Ñ>WÐ%ZÑ[ˆAÜ�SÔ&GÐ%JÑKˆAàˆBØˆBó �Ø—G‘G˜A¤ A¬¨a©¡L°1Ñ$4Ó 5Ñ5Ó6�Ø—G‘G˜A¤ A¬¨a©¡L°1Ñ$4Ó 5Ñ5Ó6�ÞØ  ™t b§f¡f¨Q¨q©T´1·6±6Ó&:Ñ:�B�q˜‘t“HÞØ  ™t b§f¡f¨Q¨q©T´1·6±6Ó&:Ñ:�B�q˜‘t“Hà˜!‘G’Bñ ô ˜" "Ó%ˆEä�|Š|˜C FÓ2Ð2ùò3 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   € à—w—w‘! AˆØ”3”s˜4Ÿ7™7Ÿ<™<›>Ó*×0Ñ0´°T·W±W·\±\³^Ó1DÓEÓFÈÑJÑJˆÜ˜˜7Ó#Ð#r(   c                 ó4   • U R                   U R                  -
  $ rA   )r<   r;   rr   s    r&   r�   ÚFiniteFourierSeries.length,  s   € à�y‰y˜4Ÿ:™:Ñ%Ð%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   € Ü�q‹z˜4Ÿ6™6ˆ1à—‘ÓÝÃ1ÂaÐHÓIÐIà—‘“×$Ñ$ Q¨A©Ó.ˆØ—‘×"Ñ" 1¨!¡eÓ,ˆà�y‰y˜§	¡	¨!¡¨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   € Ü�q‹z˜4Ÿ6™6ˆ1à—‘ÓÝÃ1ÂaÐHÓIÐIà—‘“ !Ñ#ˆØ—‘ Ñ!ˆà�y‰y˜§	¡	¨!¡¨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Ø—7‘7ˆNà—‘—‘˜B¤§¡Ó'¬#¨b´B¸¿¹±KÑ.@À4Ç6Á6Ñ.IÓ*JÑJØ—'‘'—+‘+˜b¤!§&¡&Ó)¬C°´b¸4¿6¹6±kÑ0BÀTÇVÁVÑ0KÓ,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œ]×+Ñ+Ø—=‘=¤°·±¸t¿y¹yÈ¹|Ø7<ñ">ó ?ð ?ä˜Ô2×3Ñ3Ø�{‰{˜eŸl™lÓ*Ü Ð!KÓLÐLà—6‘6˜5Ÿ7™7ˆqØ—}‘} u§~¡~×':Ñ':¸1Ó'@Ñ@ˆHà�v‰v˜X×2Ñ2Ó2Ø�ä! (·9±9¸Q±<Ñ@Ð@ð 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"3ðH ñ$ó ð$ð
 ñ&ó ð&ò	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X«U45      $ X	* :X  a<  [        R                  n
[        SS[        45      n[        XU5      n[        XX«U45      $ [        XU5      u  p«[        XU5      n[        XX«U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‘	˜F 1™IÑ%Ó&¨Ñ*ˆÜ'¨¨aÓ0Ñˆ	ÞÜ& q°%Ó8Ð8äˆc‹
€AØ�Q‰i˜& ™)Ñ# qÑ(€FØ‡~‡~Ø—‘�q˜"“ˆØ‹:Ü$ Q°Ó2‰FˆBÜ˜A ¤2˜wÓ'ˆBÜ  ¨R°R¨LÓ9Ð9Ø�&‹[Ü—‘ˆBÜ˜A ¤2˜wÓ'ˆBÜ  ¨AÓ.ˆBÜ  ¨R°R¨LÓ9Ð9Ü˜Q¨Ó*�F€BÜ	˜ AÓ	&€BÜ˜ R¨R LÓ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(   