
    Ed<                         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
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 ddZd Zd Zd Zd Zd Zd Zd Z d Z!dddZ"dS )    )
CoordSys3D)Del)
BaseScalar)Vector
BaseVector)gradientcurl
divergence)diff)S)	integrate)simplify)sympify)DyadicNFc           	         | dt           j        fv r| S t          |t                    st	          d          t          | t                     r|t          d          |rrd |                     t          t                    D             |hz
  }i }|D ]*}|	                    |
                    |                     +|                     |          } t           j        }|                                 }|D ]X}	|	|k    rE|                    |	          ||	                             |	          z  }
|t          |
|          z  }M|||	         z  }Y|S t          | t                     r||}t          |t                    st	          d          t           j        }|}| j                                        D ]V\  }}|t'          |||          t'          |j        d         ||          t'          |j        d         ||          z  z  z  }W|S |t          d          |rt+                      }t-          |           } |                     t                    D ]'}	|	j        |k    r|                    |	j                   (i }|D ]*}|	                    |
                    |                     +|                     |          S | S )	aK  
    Global function for 'express' functionality.

    Re-expresses a Vector, Dyadic or scalar(sympyfiable) in the given
    coordinate system.

    If 'variables' is True, then the coordinate variables (base scalars)
    of other coordinate systems present in the vector/scalar field or
    dyadic are also substituted in terms of the base scalars of the
    given system.

    Parameters
    ==========

    expr : Vector/Dyadic/scalar(sympyfiable)
        The expression to re-express in CoordSys3D 'system'

    system: CoordSys3D
        The coordinate system the expr is to be expressed in

    system2: CoordSys3D
        The other coordinate system required for re-expression
        (only for a Dyadic Expr)

    variables : boolean
        Specifies whether to substitute the coordinate variables present
        in expr, in terms of those of parameter system

    Examples
    ========

    >>> from sympy.vector import CoordSys3D
    >>> from sympy import Symbol, cos, sin
    >>> N = CoordSys3D('N')
    >>> q = Symbol('q')
    >>> B = N.orient_new_axis('B', q, N.k)
    >>> from sympy.vector import express
    >>> express(B.i, N)
    (cos(q))*N.i + (sin(q))*N.j
    >>> express(N.x, B, variables=True)
    B.x*cos(q) - B.y*sin(q)
    >>> d = N.i.outer(N.i)
    >>> express(d, B, N) == (cos(q))*(B.i|N.i) + (-sin(q))*(B.j|N.i)
    True

    r   z>system should be a CoordSys3D                         instanceNzJsystem2 should not be provided for                                 Vectorsc                     h | ]	}|j         
S  )system).0xs     6lib/python3.11/site-packages/sympy/vector/functions.py	<setcomp>zexpress.<locals>.<setcomp>M   s    PPP18PPP    zCsystem2 should be a CoordSys3D                             instance	variables   )r   zero
isinstancer   	TypeError
ValueErroratomsr   r   update
scalar_mapsubsseparaterotation_matrix	to_matrixmatrix_to_vectorr   
componentsitemsexpressargssetr   r   add)exprr   system2r   system_list	subs_dictfoutvecpartsr   tempoutdyadvarkv
system_sets                   r   r+   r+      s    ` 6; fj)) # " # # 	# $ 7 	* ) * * *  	( QPTZZ
J-O-OPPPTZS[[KI  7 7  f!5!5666699Y''D 	# 	#AF{ #--a00583E3Ea3H3HH*4888%("	D&	!	!  	G':.. 	' & ' ' '+O))++ 	F 	FDAq6S999 FcBBB GsCCCDE FGG   	* ) * * * 	(J4==DZZ
++ - -8v% -NN18,,,I 7 7  f!5!5666699Y'''r   c                    ddl m}  ||           }t          |          dk    rt          t	          |                    }t          | |d          } |                                \  }}}|                                \  }}}	t          j	        ||          t          | |          z  }
|
t          j	        ||          t          | |          z  z  }
|
t          j	        ||          t          | |	          z  z  }
|
dk    r!t          | t                    rt          j        }
|
S t          | t                    rt          j        S t          j        S )a  
    Returns the directional derivative of a scalar or vector field computed
    along a given vector in coordinate system which parameters are expressed.

    Parameters
    ==========

    field : Vector or Scalar
        The scalar or vector field to compute the directional derivative of

    direction_vector : Vector
        The vector to calculated directional derivative along them.


    Examples
    ========

    >>> from sympy.vector import CoordSys3D, directional_derivative
    >>> R = CoordSys3D('R')
    >>> f1 = R.x*R.y*R.z
    >>> v1 = 3*R.i + 4*R.j + R.k
    >>> directional_derivative(f1, v1)
    R.x*R.y + 4*R.x*R.z + 3*R.y*R.z
    >>> f2 = 5*R.x**2*R.z
    >>> directional_derivative(f2, v1)
    5*R.x**2 + 30*R.x*R.z

    r   )_get_coord_systemsTr   )sympy.vector.operatorsr=   lennextiterr+   base_vectorsbase_scalarsr   dotr   r   r   r   Zero)fielddirection_vectorr=   	coord_sysijr9   r   yzouts              r   directional_derivativerN      s?   : :99999""5))I
9~~ i))	yD999((**1a((**1aj)1--UA>vz*A..eQ??vz*A..eQ??!8 	
5&11 	+C
	E6	"	" {vr   c                 "   t                      }| j        rKt          t          |                     t	          t	          |                     z
                                  S |                     ||                                                     S )a!  
    Return the laplacian of the given field computed in terms of
    the base scalars of the given coordinate system.

    Parameters
    ==========

    expr : SymPy Expr or Vector
        expr denotes a scalar or vector field.

    Examples
    ========

    >>> from sympy.vector import CoordSys3D, laplacian
    >>> R = CoordSys3D('R')
    >>> f = R.x**2*R.y**5*R.z
    >>> laplacian(f)
    20*R.x**2*R.y**3*R.z + 2*R.y**5*R.z
    >>> f = R.x**2*R.i + R.y**3*R.j + R.z**4*R.k
    >>> laplacian(f)
    2*R.i + 6*R.y*R.j + 12*R.z**2*R.k

    )r   	is_Vectorr   r
   r	   doitrD   )r/   delops     r   	laplacianrS      ss    2 EEE~ FD))**T$t**-=-==CCEEE99UU4[[!!&&(((r   c                     t          | t                    st          d          | t          j        k    rdS t	          |                                           t          j        k    S )a  
    Checks if a field is conservative.

    Parameters
    ==========

    field : Vector
        The field to check for conservative property

    Examples
    ========

    >>> from sympy.vector import CoordSys3D
    >>> from sympy.vector import is_conservative
    >>> R = CoordSys3D('R')
    >>> is_conservative(R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k)
    True
    >>> is_conservative(R.z*R.j)
    False

    field should be a VectorT)r   r   r   r   r	   r   rF   s    r   is_conservativerW      sX    4 eV$$ 42333 t;;!!V[00r   c                     t          | t                    st          d          | t          j        k    rdS t	          |                                           t          j        u S )a  
    Checks if a field is solenoidal.

    Parameters
    ==========

    field : Vector
        The field to check for solenoidal property

    Examples
    ========

    >>> from sympy.vector import CoordSys3D
    >>> from sympy.vector import is_solenoidal
    >>> R = CoordSys3D('R')
    >>> is_solenoidal(R.y*R.z*R.i + R.x*R.z*R.j + R.x*R.y*R.k)
    True
    >>> is_solenoidal(R.y * R.j)
    False

    rU   T)r   r   r   r   r
   r   r   rE   rV   s    r   is_solenoidalrY      sZ    4 eV$$ 42333 te%%''1611r   c                 h   t          |           st          d          | t          j        k    rt          j        S t          |t                    st          d          t          | |d          } |
                                }|                                }t          |                     |d                   |d                   }t          |dd                   D ]R\  }}t          |||dz                      }|                     |          |z
  }|t          |||dz                      z  }S|S )a  
    Returns the scalar potential function of a field in a given
    coordinate system (without the added integration constant).

    Parameters
    ==========

    field : Vector
        The vector field whose scalar potential function is to be
        calculated

    coord_sys : CoordSys3D
        The coordinate system to do the calculation in

    Examples
    ========

    >>> from sympy.vector import CoordSys3D
    >>> from sympy.vector import scalar_potential, gradient
    >>> R = CoordSys3D('R')
    >>> scalar_potential(R.k, R) == R.z
    True
    >>> scalar_field = 2*R.x**2*R.y*R.z
    >>> grad_field = gradient(scalar_field)
    >>> scalar_potential(grad_field, R)
    2*R.x**2*R.y*R.z

    zField is not conservativecoord_sys must be a CoordSys3DTr   r   r   N)rW   r    r   r   r   rE   r   r   r   r+   rB   rC   r   rD   	enumerater   )rF   rH   
dimensionsscalarstemp_functionrI   dimpartial_diffs           r   scalar_potentialrb     s)   > 5!! 64555 v i,, :8999E9555E''))J$$&&Geii
166
CCMJqrrN++ A A3M71q5>::yy~~4<Q@@@r   c                    t          |t                    st          d          t          | t                    rt	          | |          }n| }|j        }t          |                    |          |d          }t          |                    |          |d          }i }i }	|                                }
t          |
                                          D ]A\  }}|                    |          ||
|         <   |                    |          |	|
|         <   B|                    |	          |                    |          z
  S )a)  
    Returns the scalar potential difference between two points in a
    certain coordinate system, wrt a given field.

    If a scalar field is provided, its values at the two points are
    considered. If a conservative vector field is provided, the values
    of its scalar potential function at the two points are used.

    Returns (potential at point2) - (potential at point1)

    The position vectors of the two Points are calculated wrt the
    origin of the coordinate system provided.

    Parameters
    ==========

    field : Vector/Expr
        The field to calculate wrt

    coord_sys : CoordSys3D
        The coordinate system to do the calculations in

    point1 : Point
        The initial Point in given coordinate system

    position2 : Point
        The second Point in the given coordinate system

    Examples
    ========

    >>> from sympy.vector import CoordSys3D
    >>> from sympy.vector import scalar_potential_difference
    >>> R = CoordSys3D('R')
    >>> P = R.origin.locate_new('P', R.x*R.i + R.y*R.j + R.z*R.k)
    >>> vectfield = 4*R.x*R.y*R.i + 2*R.x**2*R.j
    >>> scalar_potential_difference(vectfield, R, R.origin, P)
    2*R.x**2*R.y
    >>> Q = R.origin.locate_new('O', 3*R.i + R.j + 2*R.k)
    >>> scalar_potential_difference(vectfield, R, P, Q)
    -2*R.x**2*R.y + 18

    r[   Tr   )r   r   r   r   rb   originr+   position_wrtrC   r\   rB   rD   r$   )rF   rH   point1point2	scalar_fnrd   	position1	position2
subs_dict1
subs_dict2r^   rI   r   s                r   scalar_potential_differencerm   D  sH   Z i,, :8999%   $UI66		 	F++F33Y"&( ( (I++F33Y"&( ( (I JJ$$&&G)002233 2 21!"y!1!1
71:!"y!1!1
71:>>*%%	z(B(BBBr   c                     t           j        }|                                }t          |           D ]\  }}||||         z  z  }|S )a  
    Converts a vector in matrix form to a Vector instance.

    It is assumed that the elements of the Matrix represent the
    measure numbers of the components of the vector along basis
    vectors of 'system'.

    Parameters
    ==========

    matrix : SymPy Matrix, Dimensions: (3, 1)
        The matrix to be converted to a vector

    system : CoordSys3D
        The coordinate system the vector is to be defined in

    Examples
    ========

    >>> from sympy import ImmutableMatrix as Matrix
    >>> m = Matrix([1, 2, 3])
    >>> from sympy.vector import CoordSys3D, matrix_to_vector
    >>> C = CoordSys3D('C')
    >>> v = matrix_to_vector(m, C)
    >>> v
    C.i + 2*C.j + 3*C.k
    >>> v.to_matrix(C) == m
    True

    )r   r   rB   r\   )matrixr   r4   vectsrI   r   s         r   r(   r(     sQ    @ [F!!E&!!  1!eAh,Mr   c                 "   | j         |j         k    r2t          dt          |           z   dz   t          |          z             g }|}|j        #|                    |           |j        }|j        #|                    |           t          |          }g }| }||vr |                    |           |j        }||v t          |          }|                    |          }|dk    r&|                    ||                    |dz  }|dk    &||fS )z
    Calculates the 'path' of objects starting from 'from_object'
    to 'to_object', along with the index of the first common
    ancestor in the tree.

    Returns (index, list) tuple.
    z!No connecting path found between z and Nr   r   )_rootr    str_parentappendr-   r?   index)from_object	to_object
other_pathobj
object_set	from_pathrv   rI   s           r   _pathr}     s]    IO+ F<[))*,3469)nnE F F 	F J
C
+ #k +  cZJI
C
Z
 k Z
  	NNEA
q& A'''	Q q&  )r   )orthonormalc                    t          d |D                       st          d          g }t          |          D ]\  }}t          |          D ]&}|||                             ||                   z  }'t          |                              t          j                  rt          d          |
                    |           | rd |D             }|S )aO  
    Takes a sequence of independent vectors and orthogonalizes them
    using the Gram - Schmidt process. Returns a list of
    orthogonal or orthonormal vectors.

    Parameters
    ==========

    vlist : sequence of independent vectors to be made orthogonal.

    orthonormal : Optional parameter
                  Set to True if the vectors returned should be
                  orthonormal.
                  Default: False

    Examples
    ========

    >>> from sympy.vector.coordsysrect import CoordSys3D
    >>> from sympy.vector.functions import orthogonalize
    >>> C = CoordSys3D('C')
    >>> i, j, k = C.base_vectors()
    >>> v1 = i + 2*j
    >>> v2 = 2*i + 3*j
    >>> orthogonalize(v1, v2)
    [C.i + 2*C.j, 2/5*C.i + (-1/5)*C.j]

    References
    ==========

    .. [1] https://en.wikipedia.org/wiki/Gram-Schmidt_process

    c              3   @   K   | ]}t          |t                    V  d S )N)r   r   r   vecs     r   	<genexpr>z orthogonalize.<locals>.<genexpr>  s,      883z#v&&888888r   z#Each element must be of Type Vectorz#Vector set not linearly independentc                 6    g | ]}|                                 S r   )	normalizer   s     r   
<listcomp>z!orthogonalize.<locals>.<listcomp>  s     >>>3s}}>>>r   )allr   r\   range
projectionr   equalsr   r   r    ru   )r~   vlistortho_vlistrI   termrJ   s         r   orthogonalizer     s    F 88%88888 ?=>>>KU## ! !4q 	8 	8AKN--eAh777DD D>>  -- 	DBCCC4     ?>>+>>>r   )NF)#sympy.vector.coordsysrectr   sympy.vector.deloperatorr   sympy.vector.scalarr   sympy.vector.vectorr   r   r>   r   r	   r
   sympy.core.functionr   sympy.core.singletonr   sympy.integrals.integralsr   sympy.simplify.simplifyr   
sympy.corer   sympy.vector.dyadicr   r+   rN   rS   rW   rY   rb   rm   r(   r}   r   r   r   r   <module>r      s   0 0 0 0 0 0 ( ( ( ( ( ( * * * * * * 2 2 2 2 2 2 2 2 = = = = = = = = = = $ $ $ $ $ $ " " " " " " / / / / / / , , , , , ,       & & & & & &n n n nb. . .b) ) )>1 1 1B2 2 2B0 0 0fBC BC BCJ$ $ $N  B ', 4 4 4 4 4 4 4r   