K i!ddlmZddlmZddlmZddlmZmZddl m Z ddl m Z gdZ dZd Zd Zd Zd Zd ZdZy))diff)S) integrate)Vectorexpress) _check_frame) _check_vector)curl divergencegradientis_conservative is_solenoidalscalar_potentialscalar_potential_differencec*t||dk(r tdSt||d}|j|j}|j|j }|j|j }td}|t||dt||dz |jzz }|t||dt||dz |j zz }|t||dt||dz |j zz }|S)aP Returns the curl of a vector field computed wrt the coordinate symbols of the given frame. Parameters ========== vect : Vector The vector operand frame : ReferenceFrame The reference frame to calculate the curl in Examples ======== >>> from sympy.physics.vector import ReferenceFrame >>> from sympy.physics.vector import curl >>> R = ReferenceFrame('R') >>> v1 = R[1]*R[2]*R.x + R[0]*R[2]*R.y + R[0]*R[1]*R.z >>> curl(v1, R) 0 >>> v2 = R[0]*R[1]*R[2]*R.x >>> curl(v2, R) R_x*R_y*R.y - R_x*R_z*R.z rT variables)r rrdotxyzr)vectframevectxvectyvectzoutvecs i/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/sympy/physics/vector/fieldfunctions.pyr r s:$ qyay 4$ /D HHUWW E HHUWW E HHUWW E AYF tE58$tE58'<<GGF tE58$tE58'<<GGF tE58$tE58'<<GGF Mct||dk(rtjSt||d}|j |j }|j |j }|j |j}tj}|t||dz }|t||dz }|t||dz }|S)ab Returns the divergence of a vector field computed wrt the coordinate symbols of the given frame. Parameters ========== vect : Vector The vector operand frame : ReferenceFrame The reference frame to calculate the divergence in Examples ======== >>> from sympy.physics.vector import ReferenceFrame >>> from sympy.physics.vector import divergence >>> R = ReferenceFrame('R') >>> v1 = R[0]*R[1]*R[2] * (R.x+R.y+R.z) >>> divergence(v1, R) R_x*R_y + R_x*R_z + R_y*R_z >>> v2 = 2*R[1]*R[2]*R.y >>> divergence(v2, R) 2*R_z rTrrr) r rZerorrrrrr)rrrrrouts r r r :s:$ qyvv 4$ /D HHUWW E HHUWW E HHUWW E &&C4uQx  C4uQx  C4uQx  C Jr!ct|td}t||d}t|D]\}}|t ||||zz }|S)a Returns the vector gradient of a scalar field computed wrt the coordinate symbols of the given frame. Parameters ========== scalar : sympifiable The scalar field to take the gradient of frame : ReferenceFrame The frame to calculate the gradient in Examples ======== >>> from sympy.physics.vector import ReferenceFrame >>> from sympy.physics.vector import gradient >>> R = ReferenceFrame('R') >>> s1 = R[0]*R[1]*R[2] >>> gradient(s1, R) R_y*R_z*R.x + R_x*R_z*R.y + R_x*R_y*R.z >>> s2 = 5*R[0]**2*R[2] >>> gradient(s2, R) 10*R_x*R_z*R.x + 5*R_x**2*R.z rTr)rrr enumerater)scalarrrirs r r r esZ: AYF VUd 3F% -1$vuQx(1,,- Mr!c|tdk(ryt|jd}t||j tdk(S)a Checks if a field is conservative. Parameters ========== field : Vector The field to check for conservative property Examples ======== >>> from sympy.physics.vector import ReferenceFrame >>> from sympy.physics.vector import is_conservative >>> R = ReferenceFrame('R') >>> is_conservative(R[1]*R[2]*R.x + R[0]*R[2]*R.y + R[0]*R[1]*R.z) True >>> is_conservative(R[2] * R.y) False rT)rlistseparater simplifyfieldrs r r r sH2 q  ! "1 %E u  & & (F1I 55r!c|tdk(ryt|jd}t||j t j uS)a Checks if a field is solenoidal. Parameters ========== field : Vector The field to check for solenoidal property Examples ======== >>> from sympy.physics.vector import ReferenceFrame >>> from sympy.physics.vector import is_solenoidal >>> R = ReferenceFrame('R') >>> is_solenoidal(R[1]*R[2]*R.x + R[0]*R[2]*R.y + R[0]*R[1]*R.z) True >>> is_solenoidal(R[1] * R.y) False rT)rr*r+r r,rr#r-s r rrsH2 q  ! "1 %E eU # , , .!&& 88r!ct|s td|tdk(rtjSt |t ||d}t|}t|j|d|d}t|ddD]@\}}t|||dz}|j||z }|t|||dzz }B|S)a Returns the scalar potential function of a field in a given frame (without the added integration constant). Parameters ========== field : Vector The vector field whose scalar potential function is to be calculated frame : ReferenceFrame The frame to do the calculation in Examples ======== >>> from sympy.physics.vector import ReferenceFrame >>> from sympy.physics.vector import scalar_potential, gradient >>> R = ReferenceFrame('R') >>> scalar_potential(R.z, R) == R[2] True >>> scalar_field = 2*R[0]**2*R[1]*R[2] >>> grad_field = gradient(scalar_field, R) >>> scalar_potential(grad_field, R) 2*R_x**2*R_y*R_z zField is not conservativerTrrN) r ValueErrorrrr#rrr*rrr&r)r.r dimensions temp_functionr(dim partial_diffs r rrs> 5 !455 q vv  E5D 1EeJeii 1 6aAMJqrN+?3M5Q<8 yy~ 4 <q1u>> ? r!ct|t|tr t||}n|}t |j ||d}t |j ||d}i}i} t |D]3\} } | j|||| <| j|| || <5|j| |j|z S)a* Returns the scalar potential difference between two points in a certain frame, 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 position 2) - (potential at position 1) Parameters ========== field : Vector/sympyfiable The field to calculate wrt frame : ReferenceFrame The frame to do the calculations in point1 : Point The initial Point in given frame position2 : Point The second Point in the given frame origin : Point The Point to use as reference point for position vector calculation Examples ======== >>> from sympy.physics.vector import ReferenceFrame, Point >>> from sympy.physics.vector import scalar_potential_difference >>> R = ReferenceFrame('R') >>> O = Point('O') >>> P = O.locatenew('P', R[0]*R.x + R[1]*R.y + R[2]*R.z) >>> vectfield = 4*R[0]*R[1]*R.x + 2*R[0]**2*R.y >>> scalar_potential_difference(vectfield, R, O, P, O) 2*R_x**2*R_y >>> Q = O.locatenew('O', 3*R.x + R.y + 2*R.z) >>> scalar_potential_difference(vectfield, R, P, Q, O) -2*R_x**2*R_y + 18 Tr) r isinstancerrrpos_fromr&rsubs) r.rpoint1point2origin scalar_fn position1 position2 subs_dict1 subs_dict2r(rs r rrs^% $UE2  /$GI/$GIJJ% 01 uuY/ 58 uuY/ 580 >>* % z(B BBr!N)sympy.core.functionrsympy.core.singletonrsympy.integrals.integralsrsympy.physics.vectorrrsympy.physics.vector.framersympy.physics.vector.vectorr __all__r r r r rrrr!r rJsF$"/035 * )X(V"J6>9>/d?Cr!