U
    ZÊ¹jâv  ã                   @   sÊ  d dl 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 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 d
dlmZmZ ddgiZdd„ Z G dd„ deƒZ!dd„ Z"G dd„ de!eƒZ#e# Z$Z%e&fdd„Z'e&fdd„Z(dNdd „Z)d!d"„ Z*d#d$„ Z+d%d&„ Z,d'd(„ Z-d)d*„ Z.d+d,„ Z/ed-d.�d/d0„ ƒZ0dOd2d3„Z1d4d5„ Z2d1d6d7œd8d9„Z3dPd:d;„Z4dQd=d>„Z5d?d@„ Z6dAdB„ Z7dCdD„ Z8dRdGdH„Z9dSdJdK„Z:dLdM„ Z;dS )Té    N)ÚBasic)ÚS)ÚSymbol©Úsympify)ÚcosÚsin)Údoctest_depends_on)Úsympy_deprecation_warning)Úis_sequenceé   )Ú
ShapeError)Ú	_choleskyÚ_LDLdecomposition)Ú
MatrixBase)ÚMutableRepMatrixÚ	RepMatrix)Ú_lower_triangular_solveÚ_upper_triangular_solve)ÚsymarrayÚnumpyc                 C   s   | j S )zReturns True if x is zero.)Úis_zero)Úx© r   úS/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sympy/matrices/dense.pyÚ_iszero   s    r   c                   @   s„   e Zd ZdZdZdZdZedd„ ƒZdd„ Z	d	d
„ Z
dd„ Zddd„Zddd„Zdd„ Zdd„ Zeje_eje_eje_eje_dS )ÚDenseMatrixzJMatrix implementation based on DomainMatrix as the internal representationFg…ëQ¸$@é   c                 C   s   t dddd� |  ¡ S )Nzy
            The private _mat attribute of Matrix is deprecated. Use the
            .flat() method instead.
            z1.9z$deprecated-private-matrix-attributes)Zdeprecated_since_versionZactive_deprecations_target)r
   Zflat©Úselfr   r   r   Ú_mat)   s    ú	zDenseMatrix._matc                 K   s(   | j | dd¡| dt¡| dd¡d�S )NÚmethodZGEÚ
iszerofuncÚtry_block_diagF)r!   r"   r#   )ÚinvÚgetr   )r   Úkwargsr   r   r   Ú_eval_inverse6   s    

þzDenseMatrix._eval_inversec                 C   s   ddl m} | | j ¡ ¡S )z4Returns an Immutable version of this Matrix
        r   )ÚImmutableDenseMatrix)Z	immutabler(   Z_fromrepZ_repÚcopy)r   Úclsr   r   r   Úas_immutable;   s    zDenseMatrix.as_immutablec                 C   s   t | ƒS )aB  Returns a mutable version of this matrix

        Examples
        ========

        >>> from sympy import ImmutableMatrix
        >>> X = ImmutableMatrix([[1, 2], [3, 4]])
        >>> Y = X.as_mutable()
        >>> Y[1, 1] = 5 # Can set values in Y
        >>> Y
        Matrix([
        [1, 2],
        [3, 5]])
        )ÚMatrixr   r   r   r   Ú
as_mutableA   s    zDenseMatrix.as_mutableTc                 C   s   t | |d�S ©N)Ú	hermitian)r   ©r   r/   r   r   r   ÚcholeskyR   s    zDenseMatrix.choleskyc                 C   s   t | |d�S r.   )r   r0   r   r   r   ÚLDLdecompositionU   s    zDenseMatrix.LDLdecompositionc                 C   s
   t | |ƒS ©N)r   ©r   Úrhsr   r   r   Úlower_triangular_solveX   s    z"DenseMatrix.lower_triangular_solvec                 C   s
   t | |ƒS r3   )r   r4   r   r   r   Úupper_triangular_solve[   s    z"DenseMatrix.upper_triangular_solveN)T)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Zis_MatrixExprZ_op_priorityZ_class_priorityÚpropertyr    r'   r+   r-   r1   r2   r6   r7   r   r   r   r   r   r   r   r   r      s"   


r   c                 C   sV   t | ddƒr|  ¡ S t| tƒr"| S t| dƒrR|  ¡ }t|jƒdkrJt|ƒS t	| ƒS | S )z0Return a matrix as a Matrix, otherwise return x.Z	is_MatrixFÚ	__array__r   )
Úgetattrr-   Ú
isinstancer   Úhasattrr=   ÚlenÚshaper   r,   )r   Úar   r   r   Ú_force_mutabled   s    

rD   c                   @   s   e Zd Zdd„ ZdS )ÚMutableDenseMatrixc                 K   s>   ddl m} |  ¡  ¡ D ] \\}}}||f|Ž| ||f< qdS )zßApplies simplify to the elements of a matrix in place.

        This is a shortcut for M.applyfunc(lambda x: simplify(x, ratio, measure))

        See Also
        ========

        sympy.simplify.simplify.simplify
        r   )ÚsimplifyN)Zsympy.simplify.simplifyrF   ZtodokÚitems)r   r&   Z	_simplifyÚiÚjÚelementr   r   r   rF   t   s    
zMutableDenseMatrix.simplifyN)r8   r9   r:   rF   r   r   r   r   rE   r   s   rE   c                 C   s8   ddl m} |t| ƒ|ƒ}t| ƒD ]\}}|||< q"|S )zmConverts Python list of SymPy expressions to a NumPy array.

    See Also
    ========

    matrix2numpy
    r   ©Úempty)r   rL   rA   Ú	enumerate)ÚlÚdtyperL   rC   rH   Úsr   r   r   Ú
list2numpy‹   s
    
rQ   c                 C   sP   ddl m} || j|ƒ}t| jƒD ](}t| jƒD ]}| ||f |||f< q0q"|S )zYConverts SymPy's matrix to a NumPy array.

    See Also
    ========

    list2numpy
    r   rK   )r   rL   rB   ÚrangeÚrowsÚcols)ÚmrO   rL   rC   rH   rI   r   r   r   Úmatrix2numpyš   s    rV   é   c                 C   sÐ   t |tƒr|dk r td |¡ƒ‚| |kr8td | |¡ƒ‚| |fD ]8}t |tƒrb|dk sb||d kr@td |d | |¡ƒ‚q@t|ƒ}t|ƒ}t|ƒ}t|ƒ}||| | f< ||||f< ||| |f< | ||| f< |S )aÙ  Returns a a Givens rotation matrix, a a rotation in the
    plane spanned by two coordinates axes.

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

    The Givens rotation corresponds to a generalization of rotation
    matrices to any number of dimensions, given by:

    .. math::
        G(i, j, \theta) =
            \begin{bmatrix}
                1   & \cdots &    0   & \cdots &    0   & \cdots &    0   \\
                \vdots & \ddots & \vdots &        & \vdots &        & \vdots \\
                0   & \cdots &    c   & \cdots &   -s   & \cdots &    0   \\
                \vdots &        & \vdots & \ddots & \vdots &        & \vdots \\
                0   & \cdots &    s   & \cdots &    c   & \cdots &    0   \\
                \vdots &        & \vdots &        & \vdots & \ddots & \vdots \\
                0   & \cdots &    0   & \cdots &    0   & \cdots &    1
            \end{bmatrix}

    Where $c = \cos(\theta)$ and $s = \sin(\theta)$ appear at the intersections
    ``i``\th and ``j``\th rows and columns.

    For fixed ``i > j``\, the non-zero elements of a Givens matrix are
    given by:

    - $g_{kk} = 1$ for $k \ne i,\,j$
    - $g_{kk} = c$ for $k = i,\,j$
    - $g_{ji} = -g_{ij} = -s$

    Parameters
    ==========

    i : int between ``0`` and ``dim - 1``
        Represents first axis
    j : int between ``0`` and ``dim - 1``
        Represents second axis
    dim : int bigger than 1
        Number of dimentions. Defaults to 3.

    Examples
    ========

    >>> from sympy import pi, rot_givens

    A counterclockwise rotation of pi/3 (60 degrees) around
    the third axis (z-axis):

    >>> rot_givens(1, 0, pi/3)
    Matrix([
    [      1/2, -sqrt(3)/2, 0],
    [sqrt(3)/2,        1/2, 0],
    [        0,          0, 1]])

    If we rotate by pi/2 (90 degrees):

    >>> rot_givens(1, 0, pi/2)
    Matrix([
    [0, -1, 0],
    [1,  0, 0],
    [0,  0, 1]])

    This can be generalized to any number
    of dimensions:

    >>> rot_givens(1, 0, pi/2, dim=4)
    Matrix([
    [0, -1, 0, 0],
    [1,  0, 0, 0],
    [0,  0, 1, 0],
    [0,  0, 0, 1]])

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Givens_rotation

    See Also
    ========

    rot_axis1: Returns a rotation matrix for a rotation of theta (in radians)
        about the 1-axis (clockwise around the x axis)
    rot_axis2: Returns a rotation matrix for a rotation of theta (in radians)
        about the 2-axis (clockwise around the y axis)
    rot_axis3: Returns a rotation matrix for a rotation of theta (in radians)
        about the 3-axis (clockwise around the z axis)
    rot_ccw_axis1: Returns a rotation matrix for a rotation of theta (in radians)
        about the 1-axis (counterclockwise around the x axis)
    rot_ccw_axis2: Returns a rotation matrix for a rotation of theta (in radians)
        about the 2-axis (counterclockwise around the y axis)
    rot_ccw_axis3: Returns a rotation matrix for a rotation of theta (in radians)
        about the 3-axis (counterclockwise around the z axis)
    é   z/dim must be an integer biggen than one, got {}.z'i and j must be different, got ({}, {})r   r   z=i and j must be integers between 0 and {}, got i={} and j={}.)r?   ÚintÚ
ValueErrorÚformatr   r   r   Úeye)rH   rI   ÚthetaÚdimÚijÚcrP   ÚMr   r   r   Ú
rot_givens°   s2    _ÿ ÿ  ÿrb   c                 C   s   t dd| dd�S )az  Returns a rotation matrix for a rotation of theta (in radians)
    about the 3-axis.

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

    For a right-handed coordinate system, this corresponds to a
    clockwise rotation around the `z`-axis, given by:

    .. math::

        R  = \begin{bmatrix}
                 \cos(\theta) & \sin(\theta) & 0 \\
                -\sin(\theta) & \cos(\theta) & 0 \\
                            0 &            0 & 1
            \end{bmatrix}

    Examples
    ========

    >>> from sympy import pi, rot_axis3

    A rotation of pi/3 (60 degrees):

    >>> theta = pi/3
    >>> rot_axis3(theta)
    Matrix([
    [       1/2, sqrt(3)/2, 0],
    [-sqrt(3)/2,       1/2, 0],
    [         0,         0, 1]])

    If we rotate by pi/2 (90 degrees):

    >>> rot_axis3(pi/2)
    Matrix([
    [ 0, 1, 0],
    [-1, 0, 0],
    [ 0, 0, 1]])

    See Also
    ========

    rot_givens: Returns a Givens rotation matrix (generalized rotation for
        any number of dimensions)
    rot_ccw_axis3: Returns a rotation matrix for a rotation of theta (in radians)
        about the 3-axis (counterclockwise around the z axis)
    rot_axis1: Returns a rotation matrix for a rotation of theta (in radians)
        about the 1-axis (clockwise around the x axis)
    rot_axis2: Returns a rotation matrix for a rotation of theta (in radians)
        about the 2-axis (clockwise around the y axis)
    r   r   rW   ©r^   ©rb   ©r]   r   r   r   Ú	rot_axis3'  s    4rf   c                 C   s   t dd| dd�S )a�  Returns a rotation matrix for a rotation of theta (in radians)
    about the 2-axis.

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

    For a right-handed coordinate system, this corresponds to a
    clockwise rotation around the `y`-axis, given by:

    .. math::

        R  = \begin{bmatrix}
                \cos(\theta) & 0 & -\sin(\theta) \\
                           0 & 1 &             0 \\
                \sin(\theta) & 0 &  \cos(\theta)
            \end{bmatrix}

    Examples
    ========

    >>> from sympy import pi, rot_axis2

    A rotation of pi/3 (60 degrees):

    >>> theta = pi/3
    >>> rot_axis2(theta)
    Matrix([
    [      1/2, 0, -sqrt(3)/2],
    [        0, 1,          0],
    [sqrt(3)/2, 0,        1/2]])

    If we rotate by pi/2 (90 degrees):

    >>> rot_axis2(pi/2)
    Matrix([
    [0, 0, -1],
    [0, 1,  0],
    [1, 0,  0]])

    See Also
    ========

    rot_givens: Returns a Givens rotation matrix (generalized rotation for
        any number of dimensions)
    rot_ccw_axis2: Returns a rotation matrix for a rotation of theta (in radians)
        about the 2-axis (clockwise around the y axis)
    rot_axis1: Returns a rotation matrix for a rotation of theta (in radians)
        about the 1-axis (counterclockwise around the x axis)
    rot_axis3: Returns a rotation matrix for a rotation of theta (in radians)
        about the 3-axis (counterclockwise around the z axis)
    rX   r   rW   rc   rd   re   r   r   r   Ú	rot_axis2^  s    4rg   c                 C   s   t dd| dd�S )az  Returns a rotation matrix for a rotation of theta (in radians)
    about the 1-axis.

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

    For a right-handed coordinate system, this corresponds to a
    clockwise rotation around the `x`-axis, given by:

    .. math::

        R  = \begin{bmatrix}
                1 &             0 &            0 \\
                0 &  \cos(\theta) & \sin(\theta) \\
                0 & -\sin(\theta) & \cos(\theta)
            \end{bmatrix}

    Examples
    ========

    >>> from sympy import pi, rot_axis1

    A rotation of pi/3 (60 degrees):

    >>> theta = pi/3
    >>> rot_axis1(theta)
    Matrix([
    [1,          0,         0],
    [0,        1/2, sqrt(3)/2],
    [0, -sqrt(3)/2,       1/2]])

    If we rotate by pi/2 (90 degrees):

    >>> rot_axis1(pi/2)
    Matrix([
    [1,  0, 0],
    [0,  0, 1],
    [0, -1, 0]])

    See Also
    ========

    rot_givens: Returns a Givens rotation matrix (generalized rotation for
        any number of dimensions)
    rot_ccw_axis1: Returns a rotation matrix for a rotation of theta (in radians)
        about the 1-axis (counterclockwise around the x axis)
    rot_axis2: Returns a rotation matrix for a rotation of theta (in radians)
        about the 2-axis (clockwise around the y axis)
    rot_axis3: Returns a rotation matrix for a rotation of theta (in radians)
        about the 3-axis (clockwise around the z axis)
    r   rX   rW   rc   rd   re   r   r   r   Ú	rot_axis1•  s    4rh   c                 C   s   t dd| dd�S )a˜  Returns a rotation matrix for a rotation of theta (in radians)
    about the 3-axis.

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

    For a right-handed coordinate system, this corresponds to a
    counterclockwise rotation around the `z`-axis, given by:

    .. math::

        R  = \begin{bmatrix}
                \cos(\theta) & -\sin(\theta) & 0 \\
                \sin(\theta) &  \cos(\theta) & 0 \\
                           0 &             0 & 1
            \end{bmatrix}

    Examples
    ========

    >>> from sympy import pi, rot_ccw_axis3

    A rotation of pi/3 (60 degrees):

    >>> theta = pi/3
    >>> rot_ccw_axis3(theta)
    Matrix([
    [      1/2, -sqrt(3)/2, 0],
    [sqrt(3)/2,        1/2, 0],
    [        0,          0, 1]])

    If we rotate by pi/2 (90 degrees):

    >>> rot_ccw_axis3(pi/2)
    Matrix([
    [0, -1, 0],
    [1,  0, 0],
    [0,  0, 1]])

    See Also
    ========

    rot_givens: Returns a Givens rotation matrix (generalized rotation for
        any number of dimensions)
    rot_axis3: Returns a rotation matrix for a rotation of theta (in radians)
        about the 3-axis (clockwise around the z axis)
    rot_ccw_axis1: Returns a rotation matrix for a rotation of theta (in radians)
        about the 1-axis (counterclockwise around the x axis)
    rot_ccw_axis2: Returns a rotation matrix for a rotation of theta (in radians)
        about the 2-axis (counterclockwise around the y axis)
    r   r   rW   rc   rd   re   r   r   r   Úrot_ccw_axis3Ì  s    4ri   c                 C   s   t dd| dd�S )až  Returns a rotation matrix for a rotation of theta (in radians)
    about the 2-axis.

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

    For a right-handed coordinate system, this corresponds to a
    counterclockwise rotation around the `y`-axis, given by:

    .. math::

        R  = \begin{bmatrix}
                 \cos(\theta) & 0 & \sin(\theta) \\
                            0 & 1 &            0 \\
                -\sin(\theta) & 0 & \cos(\theta)
            \end{bmatrix}

    Examples
    ========

    >>> from sympy import pi, rot_ccw_axis2

    A rotation of pi/3 (60 degrees):

    >>> theta = pi/3
    >>> rot_ccw_axis2(theta)
    Matrix([
    [       1/2, 0, sqrt(3)/2],
    [         0, 1,         0],
    [-sqrt(3)/2, 0,       1/2]])

    If we rotate by pi/2 (90 degrees):

    >>> rot_ccw_axis2(pi/2)
    Matrix([
    [ 0,  0,  1],
    [ 0,  1,  0],
    [-1,  0,  0]])

    See Also
    ========

    rot_givens: Returns a Givens rotation matrix (generalized rotation for
        any number of dimensions)
    rot_axis2: Returns a rotation matrix for a rotation of theta (in radians)
        about the 2-axis (clockwise around the y axis)
    rot_ccw_axis1: Returns a rotation matrix for a rotation of theta (in radians)
        about the 1-axis (counterclockwise around the x axis)
    rot_ccw_axis3: Returns a rotation matrix for a rotation of theta (in radians)
        about the 3-axis (counterclockwise around the z axis)
    r   rX   rW   rc   rd   re   r   r   r   Úrot_ccw_axis2  s    4rj   c                 C   s   t dd| dd�S )a˜  Returns a rotation matrix for a rotation of theta (in radians)
    about the 1-axis.

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

    For a right-handed coordinate system, this corresponds to a
    counterclockwise rotation around the `x`-axis, given by:

    .. math::

        R  = \begin{bmatrix}
                1 &            0 &             0 \\
                0 & \cos(\theta) & -\sin(\theta) \\
                0 & \sin(\theta) &  \cos(\theta)
            \end{bmatrix}

    Examples
    ========

    >>> from sympy import pi, rot_ccw_axis1

    A rotation of pi/3 (60 degrees):

    >>> theta = pi/3
    >>> rot_ccw_axis1(theta)
    Matrix([
    [1,         0,          0],
    [0,       1/2, -sqrt(3)/2],
    [0, sqrt(3)/2,        1/2]])

    If we rotate by pi/2 (90 degrees):

    >>> rot_ccw_axis1(pi/2)
    Matrix([
    [1, 0,  0],
    [0, 0, -1],
    [0, 1,  0]])

    See Also
    ========

    rot_givens: Returns a Givens rotation matrix (generalized rotation for
        any number of dimensions)
    rot_axis1: Returns a rotation matrix for a rotation of theta (in radians)
        about the 1-axis (clockwise around the x axis)
    rot_ccw_axis2: Returns a rotation matrix for a rotation of theta (in radians)
        about the 2-axis (counterclockwise around the y axis)
    rot_ccw_axis3: Returns a rotation matrix for a rotation of theta (in radians)
        about the 3-axis (counterclockwise around the z axis)
    rX   r   rW   rc   rd   re   r   r   r   Úrot_ccw_axis1:  s    4rk   )r   )Úmodulesc              	   K   sR   ddl m}m} ||td�}||ƒD ](}td| d tt|ƒ¡f f|Ž||< q$|S )aI  Create a numpy ndarray of symbols (as an object array).

    The created symbols are named ``prefix_i1_i2_``...  You should thus provide a
    non-empty prefix if you want your symbols to be unique for different output
    arrays, as SymPy symbols with identical names are the same object.

    Parameters
    ----------

    prefix : string
      A prefix prepended to the name of every symbol.

    shape : int or tuple
      Shape of the created array.  If an int, the array is one-dimensional; for
      more than one dimension the shape must be a tuple.

    \*\*kwargs : dict
      keyword arguments passed on to Symbol

    Examples
    ========
    These doctests require numpy.

    >>> from sympy import symarray
    >>> symarray('', 3)
    [_0 _1 _2]

    If you want multiple symarrays to contain distinct symbols, you *must*
    provide unique prefixes:

    >>> a = symarray('', 3)
    >>> b = symarray('', 3)
    >>> a[0] == b[0]
    True
    >>> a = symarray('a', 3)
    >>> b = symarray('b', 3)
    >>> a[0] == b[0]
    False

    Creating symarrays with a prefix:

    >>> symarray('a', 3)
    [a_0 a_1 a_2]

    For more than one dimension, the shape must be given as a tuple:

    >>> symarray('a', (2, 3))
    [[a_0_0 a_0_1 a_0_2]
     [a_1_0 a_1_1 a_1_2]]
    >>> symarray('a', (2, 3, 2))
    [[[a_0_0_0 a_0_0_1]
      [a_0_1_0 a_0_1_1]
      [a_0_2_0 a_0_2_1]]
    <BLANKLINE>
     [[a_1_0_0 a_1_0_1]
      [a_1_1_0 a_1_1_1]
      [a_1_2_0 a_1_2_1]]]

    For setting assumptions of the underlying Symbols:

    >>> [s.is_real for s in symarray('a', 2, real=True)]
    [True, True]
    r   )rL   Úndindex)rO   z%s_%sÚ_)r   rL   rm   Úobjectr   ÚjoinÚmapÚstr)ÚprefixrB   r&   rL   rm   ZarrÚindexr   r   r   r   q  s    Aÿ
r   Tc                    sH   t ttˆƒƒ‰|s"‡ ‡fdd„}n‡ ‡fdd„}tˆƒ}t|||ƒ ¡ S )aY  Given linear difference operator L of order 'k' and homogeneous
       equation Ly = 0 we want to compute kernel of L, which is a set
       of 'k' sequences: a(n), b(n), ... z(n).

       Solutions of L are linearly independent iff their Casoratian,
       denoted as C(a, b, ..., z), do not vanish for n = 0.

       Casoratian is defined by k x k determinant::

                  +  a(n)     b(n)     . . . z(n)     +
                  |  a(n+1)   b(n+1)   . . . z(n+1)   |
                  |    .         .     .        .     |
                  |    .         .       .      .     |
                  |    .         .         .    .     |
                  +  a(n+k-1) b(n+k-1) . . . z(n+k-1) +

       It proves very useful in rsolve_hyper() where it is applied
       to a generating set of a recurrence to factor out linearly
       dependent solutions and return a basis:

       >>> from sympy import Symbol, casoratian, factorial
       >>> n = Symbol('n', integer=True)

       Exponential and factorial are linearly independent:

       >>> casoratian([2**n, factorial(n)], n) != 0
       True

    c                    s   ˆ|   ˆ ˆ |  ¡S r3   ©Úsubs©rH   rI   ©ÚnÚseqsr   r   Ú<lambda>à  ó    zcasoratian.<locals>.<lambda>c                    s   ˆ|   ˆ | ¡S r3   ru   rw   rx   r   r   r{   â  r|   )Úlistrq   r   rA   r,   Údet)rz   ry   ÚzeroÚfÚkr   rx   r   Ú
casoratian¾  s    r‚   c                  O   s   t j| |ŽS )z`Create square identity matrix n x n

    See Also
    ========

    diag
    zeros
    ones
    )r,   r\   ©Úargsr&   r   r   r   r\   é  s    r\   F©ÚstrictÚunpackc                 O   s   t j|| |dœ|—ŽS )aK  Returns a matrix with the provided values placed on the
    diagonal. If non-square matrices are included, they will
    produce a block-diagonal matrix.

    Examples
    ========

    This version of diag is a thin wrapper to Matrix.diag that differs
    in that it treats all lists like matrices -- even when a single list
    is given. If this is not desired, either put a `*` before the list or
    set `unpack=True`.

    >>> from sympy import diag

    >>> diag([1, 2, 3], unpack=True)  # = diag(1,2,3) or diag(*[1,2,3])
    Matrix([
    [1, 0, 0],
    [0, 2, 0],
    [0, 0, 3]])

    >>> diag([1, 2, 3])  # a column vector
    Matrix([
    [1],
    [2],
    [3]])

    See Also
    ========
    .matrixbase.MatrixBase.eye
    .matrixbase.MatrixBase.diagonal
    .matrixbase.MatrixBase.diag
    .expressions.blockmatrix.BlockMatrix
    r…   )r,   Údiag)r†   r‡   Úvaluesr&   r   r   r   rˆ   ÷  s    "rˆ   c                 C   s   t j| |ddœŽS )a  Apply the Gram-Schmidt process to a set of vectors.

    Parameters
    ==========

    vlist : List of Matrix
        Vectors to be orthogonalized for.

    orthonormal : Bool, optional
        If true, return an orthonormal basis.

    Returns
    =======

    vlist : List of Matrix
        Orthogonalized vectors

    Notes
    =====

    This routine is mostly duplicate from ``Matrix.orthogonalize``,
    except for some difference that this always raises error when
    linearly dependent vectors are found, and the keyword ``normalize``
    has been named as ``orthonormal`` in this function.

    See Also
    ========

    .matrixbase.MatrixBase.orthogonalize

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process
    T)Ú	normalizeZ	rankcheck)rE   Zorthogonalize)ZvlistZorthonormalr   r   r   ÚGramSchmidt  s
    $  ÿr‹   r   c                 C   s`  t |tƒr8d|jkrtdƒ‚|jdkr,|j}| ¡ d }t|ƒrVt|ƒ}|s^tdƒ‚nt	dƒ‚t
| dƒstt	d|  ƒ‚t|ƒ}|| }t|ƒ}t|ƒD ]F\}}t
|dƒs²t	d|  ƒ‚t|ƒD ]}	| ||	 ¡|||	| f< qºq”t|ƒD ]<}	t|	|ƒD ],}
|  ||	 ¡ ||
 ¡||	| |
| f< qòqät|ƒD ]0}	t|	d |ƒD ]}
||	|
f ||
|	f< �q<�q*|S )a
  Compute Hessian matrix for a function f wrt parameters in varlist
    which may be given as a sequence or a row/column vector. A list of
    constraints may optionally be given.

    Examples
    ========

    >>> from sympy import Function, hessian, pprint
    >>> from sympy.abc import x, y
    >>> f = Function('f')(x, y)
    >>> g1 = Function('g')(x, y)
    >>> g2 = x**2 + 3*y
    >>> pprint(hessian(f, (x, y), [g1, g2]))
    [                   d               d            ]
    [     0        0    --(g(x, y))     --(g(x, y))  ]
    [                   dx              dy           ]
    [                                                ]
    [     0        0        2*x              3       ]
    [                                                ]
    [                     2               2          ]
    [d                   d               d           ]
    [--(g(x, y))  2*x   ---(f(x, y))   -----(f(x, y))]
    [dx                   2            dy dx         ]
    [                   dx                           ]
    [                                                ]
    [                     2               2          ]
    [d                   d               d           ]
    [--(g(x, y))   3   -----(f(x, y))   ---(f(x, y)) ]
    [dy                dy dx              2          ]
    [                                   dy           ]

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Hessian_matrix

    See Also
    ========

    sympy.matrices.matrixbase.MatrixBase.jacobian
    wronskian
    r   z)`varlist` must be a column or row vector.r   z `len(varlist)` must not be zero.z*Improper variable list in hessian functionÚdiffz'Function `f` (%s) is not differentiable)r?   r   rB   r   rT   ÚTÚtolistr   rA   rZ   r>   ÚzerosrM   rR   rŒ   )r€   ZvarlistÚconstraintsry   rU   ÚNÚoutr�   ÚgrH   rI   r   r   r   ÚhessianE  s8    ,





,r”   c                 C   s   t j|| d�S )zò
    Create a Jordan block:

    Examples
    ========

    >>> from sympy import jordan_cell
    >>> from sympy.abc import x
    >>> jordan_cell(x, 4)
    Matrix([
    [x, 1, 0, 0],
    [0, x, 1, 0],
    [0, 0, x, 1],
    [0, 0, 0, x]])
    )ÚsizeZ
eigenvalue)r,   Zjordan_block)Zeigenvalry   r   r   r   Újordan_cell’  s    r–   c                 C   s
   |   |¡S )a‰  Return the Hadamard product (elementwise product) of A and B

    >>> from sympy import Matrix, matrix_multiply_elementwise
    >>> A = Matrix([[0, 1, 2], [3, 4, 5]])
    >>> B = Matrix([[1, 10, 100], [100, 10, 1]])
    >>> matrix_multiply_elementwise(A, B)
    Matrix([
    [  0, 10, 200],
    [300, 40,   5]])

    See Also
    ========

    sympy.matrices.matrixbase.MatrixBase.__mul__
    )Zmultiply_elementwise)ÚAÚBr   r   r   Úmatrix_multiply_elementwise¦  s    r™   c                  O   s"   d|kr|  d¡|d< tj| |ŽS )zºReturns a matrix of ones with ``rows`` rows and ``cols`` columns;
    if ``cols`` is omitted a square matrix will be returned.

    See Also
    ========

    zeros
    eye
    diag
    r`   rT   )Úpopr,   Úonesrƒ   r   r   r   r›   ¹  s    r›   éc   éd   c                 C   sæ   |pt  |¡}|dkr| }|r6| |kr6td| |f ƒ‚t| | ƒ}|dkrf| |tt|ƒ| d ƒ¡}t| |ƒ}	|s¢|D ]&}
t|
|ƒ\}}| 	||¡|	||f< qxn@|D ]:}
t|
|ƒ\}}||kr¦| 	||¡ |	||f< |	||f< q¦|	S )a¿  Create random matrix with dimensions ``r`` x ``c``. If ``c`` is omitted
    the matrix will be square. If ``symmetric`` is True the matrix must be
    square. If ``percent`` is less than 100 then only approximately the given
    percentage of elements will be non-zero.

    The pseudo-random number generator used to generate matrix is chosen in the
    following way.

    * If ``prng`` is supplied, it will be used as random number generator.
      It should be an instance of ``random.Random``, or at least have
      ``randint`` and ``shuffle`` methods with same signatures.
    * if ``prng`` is not supplied but ``seed`` is supplied, then new
      ``random.Random`` with given ``seed`` will be created;
    * otherwise, a new ``random.Random`` with default seed will be used.

    Examples
    ========

    >>> from sympy import randMatrix
    >>> randMatrix(3) # doctest:+SKIP
    [25, 45, 27]
    [44, 54,  9]
    [23, 96, 46]
    >>> randMatrix(3, 2) # doctest:+SKIP
    [87, 29]
    [23, 37]
    [90, 26]
    >>> randMatrix(3, 3, 0, 2) # doctest:+SKIP
    [0, 2, 0]
    [2, 0, 1]
    [0, 0, 1]
    >>> randMatrix(3, symmetric=True) # doctest:+SKIP
    [85, 26, 29]
    [26, 71, 43]
    [29, 43, 57]
    >>> A = randMatrix(3, seed=1)
    >>> B = randMatrix(3, seed=2)
    >>> A == B
    False
    >>> A == randMatrix(3, seed=1)
    True
    >>> randMatrix(3, symmetric=True, percent=50) # doctest:+SKIP
    [77, 70,  0],
    [70,  0,  0],
    [ 0,  0, 88]
    Nz4For symmetric matrices, r must equal c, but %i != %ir�   )
ÚrandomÚRandomrZ   rR   ÚsamplerY   rA   r�   ÚdivmodÚrandint)Úrr`   ÚminÚmaxÚseedZ	symmetricÚpercentZprngr_   rU   ZijkrH   rI   r   r   r   Ú
randMatrixË  s$    1
"r¨   Úbareissc                    sD   dd„ ˆ D ƒ‰ t ˆ ƒ}|dkr$tjS t||‡ ‡fdd„ƒ}| |¡S )av  
    Compute Wronskian for [] of functions

    ::

                         | f1       f2        ...   fn      |
                         | f1'      f2'       ...   fn'     |
                         |  .        .        .      .      |
        W(f1, ..., fn) = |  .        .         .     .      |
                         |  .        .          .    .      |
                         |  (n)      (n)            (n)     |
                         | D   (f1) D   (f2)  ...  D   (fn) |

    see: https://en.wikipedia.org/wiki/Wronskian

    See Also
    ========

    sympy.matrices.matrixbase.MatrixBase.jacobian
    hessian
    c                 S   s   g | ]}t |ƒ‘qS r   r   )Ú.0r€   r   r   r   Ú
<listcomp>.  s     zwronskian.<locals>.<listcomp>r   c                    s   ˆ |    ˆ|¡S r3   )rŒ   rw   ©Ú	functionsÚvarr   r   r{   2  r|   zwronskian.<locals>.<lambda>)rA   r   ZOner,   r~   )r­   r®   r!   ry   ÚWr   r¬   r   Ú	wronskian  s    r°   c                  O   s"   d|kr|  d¡|d< tj| |ŽS )zºReturns a matrix of zeros with ``rows`` rows and ``cols`` columns;
    if ``cols`` is omitted a square matrix will be returned.

    See Also
    ========

    ones
    eye
    diag
    r`   rT   )rš   r,   r�   rƒ   r   r   r   r�   6  s    r�   )rW   )T)F)r   )Nr   rœ   NFr�   N)r©   )<rž   Zsympy.core.basicr   Zsympy.core.singletonr   Zsympy.core.symbolr   Zsympy.core.sympifyr   Z(sympy.functions.elementary.trigonometricr   r   Zsympy.utilities.decoratorr	   Zsympy.utilities.exceptionsr
   Zsympy.utilities.iterablesr   Ú
exceptionsr   Zdecompositionsr   r   Z
matrixbaser   Z	repmatrixr   r   Zsolversr   r   Z__doctest_requires__r   r   rD   rE   ZMutableMatrixr,   ro   rQ   rV   rb   rf   rg   rh   ri   rj   rk   r   r‚   r\   rˆ   r‹   r”   r–   r™   r›   r¨   r°   r�   r   r   r   r   Ú<module>   sX   
I
w777777
L
+%
)
M    ÿ
L
