
    MZd
                     @    d Z ddlmZ ddlmZ ddlmZ d	dZd Zd Z	y)
z)Numerical Methods for Holonomic Functions    )sympify)DMFsubs)mpc           
         | j                   }|j                  }|j                  j                  }|j	                         }|dk(  rt
        }nt        }g }	|j                  D ],  }
|	j                  |j                  |
j                               . t        |      D cg c]  }|	|    |	|   z   }}| j                  }t        |      |k  rt        d      | j                  } ||||d   ||      g}t!        |dd       D ]&  \  }}
|j                   ||||   |
|d   |             ( |s|D cg c]  }t#        |d          c}S t#        |      S c c}w c c}w )zk
    Numerical methods for numerical integration along a given set of
    points in the complex plane.
    EulerzNot Enough Initial Conditionsr      N)annihilatororderparentbase	get_field_euler_rk4
listofpolyappendnewreprangey0len	TypeErrorx0	enumerater   )funcpointsderivativesmethodannaRKmethdmfjiredr   r   sols                   ;/usr/lib/python3/dist-packages/sympy/holonomic/numerical.py_evalfr*   	   sM    

C		A

A	A
C^^ !

155< ! &+1X
.CF7SV
.C
.	B
2w{788	BRB*
+C&*% 81

4VAY3r7A678 '*+!!++s| / ,s   E.Ec           	      R   t        |      j                  t        j                        }t        |      j                  t        j                        }|D cg c]*  }t        |      j                  t        j                        , }}||z
  }	|dd }
d}t	        |      D ]B  }|t        t        | |   |d            j                  t        j                        ||   z  z  }D |
j                  |       g }t	        |      D ]  }|j                  ||   |	|
|   z  z          ! |S c c}w )zs
    Euler's method for numerical integration.
    From x0 to x1 with initial values given at x0 as vector y0.
    r   Nr   Tmpmr   
_to_mpmathr   precr   r   r   )r'   r   x1r   r    ABr&   y_0hf_0f_0_nr(   s                r)   r   r   .   s
    	rww'Arww'A35
6a71:  )
6C
6	AA
ab'CE1X TQ56AA"''JSQRVSSTJJu
C1X (

3q6AAJ&'( J 7s   /D$c           
      B   t        |      j                  t        j                        }t        |      j                  t        j                        }|D cg c]*  }t        |      j                  t        j                        , }}||z
  }	d}
d}d}d}|dd }t	        |      D ]B  }|
t        t        | |   |d            j                  t        j                        ||   z  z  }
D |j                  |
       t	        d|      D cg c]  }||   ||   |	z  dz  z    }}t	        |      D ]T  }|t        t        | |   ||	dz  z   d            j                  t        j                        ||   ||   |	z  dz  z   z  z  }V |j                  |       t	        d|      D cg c]  }||   ||   |	z  dz  z    }}t	        |      D ]T  }|t        t        | |   ||	dz  z   d            j                  t        j                        ||   ||   |	z  dz  z   z  z  }V |j                  |       t	        d|      D cg c]  }||   ||   |	z  z    }}t	        |      D ]N  }|t        t        | |   ||	z   d            j                  t        j                        ||   ||   |	z  z   z  z  }P |j                  |       g }t	        |      D ]:  }|j                  ||   |	||   d||   z  z   d||   z  z   ||   z   z  dz  z          < |S c c}w c c}w c c}w c c}w )z1
    Runge-Kutta 4th order numerical method.
    r   r   NTr,         r.   )r'   r   r1   r   r    r2   r3   r&   r4   r5   r7   f_1_nf_2_nf_3_nr6   f_1f_2f_3r(   s                      r)   r   r   F   s7   
 	rww'Arww'A35
6a71:  )
6C
6	AAEEEE
ab'C1X TQ56AA"''JSQRVSSTJJu(-a
413q6CF1HQJ
4C
41X iQQqSd;<GGPTWXYTZ]`ab]cde]efg]gTghhiJJu(-a
413q6CF1HQJ
4C
41X iQQqSd;<GGPTWXYTZ]`ab]cde]efg]gTghhiJJu&+Aqk
23q6CF1H
2C
21X eQQD9:EEbggNRUVWRX[^_`[abc[cRcddeJJu
C1X E

3q6AQ#a&3q6!9#a&!@A!CCDE JA 7 5
 5
 3s   /LL"L=LN)FRK4)
__doc__sympy.core.sympifyr   sympy.holonomic.holonomicr   mpmathr   r*   r   r        r)   <module>rH      s!    / & - "J0'rG   