K ivddlmZddlZddlmZddlmZddlmZddl m Z ddl m Z m Z ddlmZdd lmZdd lmZd d lmZd d lmZmZd dlmZd dlmZmZd dlmZm Z ddgiZ!dZ"GddeZ#dZ$Gdde#eZ%e%xZ&Z'e(fdZ)e(fdZ*d3dZ+dZ,dZ-dZ.dZ/d Z0d!Z1ed"#d$Z2d4d&Z3d'Z4d%d(d)d*Z5d5d+Z6d6d,Z7d-Z8d.Z9d/Z: d7d0Z;d8d1Ztddd|jS)Nzy The private _mat attribute of Matrix is deprecated. Use the .flat() method instead. z1.9z$deprecated-private-matrix-attributes)deprecated_since_versionactive_deprecations_target)r flatselfs r_matzDenseMatrix._mat*s%! &+'M  yy{rc |j|jdd|jdt|jddS)NmethodGE iszerofunctry_block_diagF)r+r-r.)invgetr)r(kwargss r _eval_inversezDenseMatrix._eval_inverse7sDxxvzz(D9#)::lG#D'-zz2BE'JL Lrc`ddlm}|j|jj S)z4Returns an Immutable version of this Matrix r )ImmutableDenseMatrix) immutabler4_fromrep_repcopy)r(clss r as_immutablezDenseMatrix.as_immutable<s! ;||DIINN,--rct|S)aBReturns 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's r as_mutablezDenseMatrix.as_mutableBsd|rct||SN) hermitian)rr(r@s rcholeskyzDenseMatrix.choleskySs33rct||Sr?)rrAs rLDLdecompositionzDenseMatrix.LDLdecompositionVs ;;rct||SN)rr(rhss rlower_triangular_solvez"DenseMatrix.lower_triangular_solveY&tS11rct||SrF)rrGs rupper_triangular_solvez"DenseMatrix.upper_triangular_solve\rJrNT)__name__ __module__ __qualname____doc__r!__annotations__ _op_priority_class_prioritypropertyr)r2r:r=rBrDrIrLrrrrrrrrsT M4LO   L . "4<22&/%6%6H%6%>%>%<%D%D"%<%D%D"rrct|ddr|jSt|tr|St |dr>|j }t |jdk(r t|St|S|S)z0Return a matrix as a Matrix, otherwise return x. is_MatrixF __array__r) getattrr= isinstancerhasattrrYlenshaperr<)ras r_force_mutabler`esgq+u%||~ Au  K KKM qww<1 1: ay HrceZdZdZy)MutableDenseMatrixc ~ddlm}|jjD]\\}}}||fi||||f<y)zApplies 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)sympy.simplify.simplifyrdtodokitems)r(r1 _simplifyijelements rrdzMutableDenseMatrix.simplifyusE B#zz|113 6OFQG"75f5DAJ 6rN)rNrOrPrdrVrrrbrbss 6rrbcfddlm}|t||}t|D] \}}|||< |S)zmConverts Python list of SymPy expressions to a NumPy array. See Also ======== matrix2numpy rempty)rrnr] enumerate)ldtypernr_riss r list2numpyrss< c!feA! 1! Hrcddlm}||j|}t|jD](}t|j D]}|||f|||f<*|S)zYConverts SymPy's matrix to a NumPy array. See Also ======== list2numpy rrm)rrnr^rangerowscols)mrqrnr_rirjs r matrix2numpyrysa agguA 166]qvv A1gAadG  Hrct|tr|dkrtdj|||k(rtdj||||fD]>}t|tr|dks ||dz kDs!tdj|dz ||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 dimensions. 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 ({}, {})rr z=i and j must be integers between 0 and {}, got i={} and j={}.)r[int ValueErrorformatrrr eye)rirjthetadimijcrrMs r rot_givensrs~ c3 37##)6#;0 0 Av((.q! 6 6!fK"c"b1fS1W 66>> 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) rr rrrs r rot_axis3r(h aEq ))rc tdd|dS)aReturns 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) r{rrrrrs r rot_axis2r_rrc tdd|dS)azReturns 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 r{rrrrs r rot_axis1rrrc tdd|dS)aReturns 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 rrrrrs r rot_ccw_axis3rrrc tdd|dS)aReturns 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) rr{rrrrs r rot_ccw_axis2rrrc tdd|dS)aReturns 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) r{r rrrrs r rot_ccw_axis1r;rr)r)modulesc ddlm}m}||t}||D]3}t |ddj t t|fi|||<5|S)aICreate 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]] [[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)rnndindex)rq_)rrnrobjectrjoinmapstr)prefixr^r1rnrarrindexs rrrrsZB% V $C&vsxxC/HI&$&E & JrTcttt|sfd}nfd}t}t |||j S)aYGiven 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 c4|j|zSrFsubsrirjnseqss rzcasoratian..saaQ/rc.|j|SrFrrs rrzcasoratian..saa+r)listrrr]r<det)rrzerofks`` r casoratianrsC> GT" #D  / + D A !Q?    rc,tj|i|S)z`Create square identity matrix n x n See Also ======== diag zeros ones )r<rargsr1s rrrs ::t &v &&rFstrictunpackc2tj|||d|S)aKReturns 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)rrvaluesr1s rrrsD ;;vf G GGrc.tj||ddS)aApply 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) normalize rankcheck)rb orthogonalize)vlist orthonormals r GramSchmidtrsH  + + + rc0t|trGd|jvr td|jdk(r |j }|j d}t|rt|}|stdtdt|dstd|zt|}||z}t|}t|D]K\}}t|dstd|zt|D]} |j|| ||| |zf< Mt|D]D} t| |D]3} |j|| j|| || |z| |zf<5Ft|D]"} t| dz|D]} || | f|| | f<$|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.rz `len(varlist)` must not be zero.z*Improper variable list in hessian functiondiffz'Function `f` (%s) is not differentiable)r[rr^rrwTtolistr r]r}rZzerosrorur) rvarlist constraintsrrxNoutrgrirjs rhessianrFsX':& GMM !HI I <<1 iiG.."1%7 L?@ @EFF 1f BQFGG KA AA (C+&/1q&!FJK Kq /AFF71:.C1q5M / / 1XDq! DA !wqz 2 7 7 CCAq1u  DD1X"q1ua "AAqD C1I "" Jrc0tj||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]]) )size eigenvalue)r< jordan_block)eigenvalrs r jordan_cellrs"   A(  ;;rc$|j|S)aReturn 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__ )multiply_elementwise)ABs rmatrix_multiply_elementwisers ! !! $$rc\d|vr|jd|d<tj|i|S)zReturns 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 rrw)popr<onesrs rrrs0 f}Cv ;; ' ''rc|xstj|}||}|r||k7rtd||fzt||z}|dk7r*|j |t t ||zdz}t||} |s/|D](} t| |\} } |j||| | | f<*| S|D]5} t| |\} } | | ks|j||x| | | f<| | | f<7| S)aCreate 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] z4For symmetric matrices, r must equal c, but %i != %id) randomRandomr}rusampler|r]rdivmodrandint) rrminmaxseed symmetricpercentprngrrxijkrirjs r randMatrixrsb  &6==&Dy Q!VOSTVWRXXYY q1uB#~ [[SRC!78 9 a A  -C#q>DAqll3,AadG - H  ;C#q>DAqAv$(LLc$::!Q$!AqD' ; HrcDcgc] }t|c}t}|dk(rtjSt ||fd}|j |Scc}w)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 rc.|j|SrF)r)rirj functionsvars rrzwronskian..3s)A,"3"3C";r)rr]rOner<r)rrr+rrWs`` r wronskianrsT.&///I IAAvuu q!; __future__rrsympy.core.basicrsympy.core.singletonrsympy.core.symbolrsympy.core.sympifyr(sympy.functions.elementary.trigonometricrr sympy.utilities.decoratorr sympy.utilities.exceptionsr sympy.utilities.iterablesr exceptionsrdecompositionsrr matrixbaser repmatrixrrsolversrr__doctest_requires__rrr`rb MutableMatrixr<rrsryrrrrrrrrrrrrrrrrrrrrVrrrs!" ""$&=8@1"8"2E&y1 FE)FER  6&66",+   !  ,t n4*n4*n4*n4*n4*n4*nJ'E(EX(!V 'e"HJ&RJZ<(%&($?D!%I X>)r