
    shy                     T   S r SSKrSSKJrJrJrJrJrJrJ	r	J
r
Jr  SSKJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJr  SSKJr   \" S5      r!\" S5      r" " S S	5      r# " S
 S5      r$ " S S5      r% " S S5      r& " S S5      r' " S S5      r( " S S5      r) " S S5      r*g)z=Tests for the ``sympy.physics.mechanics.actuator.py`` module.    N)	SMatrixSymbolSympifyErrorsqrtAbssymbolsexpsign)ActuatorBaseForceForceActuatorKanesMethodLinearDamperLinearPathwayLinearSpringParticlePinJointPointReferenceFrame	RigidBodyTorqueActuatorVectordynamicsymbolsDuffingSpringCoulombKineticFriction)Exprtargetreactionc                   v   \ rS rSr\R
                  " SS9S 5       rS r\R                  R                  SS\
R                  4\
R                  \
R                  4\" S5      \" S5      4\" S5      \" S5      4\" S5      S	-  \" S5      -   \" S5      S	-  \" S5      -   4/5      S
 5       r\R                  R                  SSS/5      S 5       r\R                  R                  S\" \" S5      \" S5      5      /5      S 5       rS r\R                  R                  SSS/5      S 5       rS rS rS rS rSrg)TestForceActuator*   Tautousec                    [        S5      U l        [        S5      U l        [        S5      U l        [        U R                  U R                  5      U l        [        S5      U l        [        S5      U l	        [        S5      U l
        [        SS5      U l        [        SS5      U l        [        SS5      U l        [        S5      U l        g )	NFpApBq1q2q3   N)r   forcer   r'   r(   r   pathwayr   r)   r*   r+   q1dq2dq3dr   r-   selfs    /Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/sympy/physics/mechanics/tests/test_actuator.py_linear_pathway_fixture)TestForceActuator._linear_pathway_fixture,   s    C[
++$TWWdgg6 & & &!$*!$*!$*$    c                 :    [        [        [        5      (       d   eg N)
issubclassr   r   r3   s    r5   test_is_actuator_base_subclass0TestForceActuator.test_is_actuator_base_subclass:       -6666r8   zforce, expected_forcer,   r&      c                     [        XR                  5      n[        U[         5      (       d   e[        US5      (       d   e[        UR                  [
        5      (       d   eUR                  U:X  d   eg )Nr.   )r   r/   
isinstancehasattrr.   ExprType)r4   r.   expected_forceinstances       r5   test_valid_constructor_force.TestForceActuator.test_valid_constructor_force=   sa     !5(M2222x))))(..(3333~~///r8   r.   Nc                     [         R                  " [        5         [        XR                  5      nS S S 5        g ! , (       d  f       g = fr:   )pytestraisesr   r   r/   )r4   r.   _s      r5   .test_invalid_constructor_force_not_sympifyable@TestForceActuator.test_invalid_constructor_force_not_sympifyableN   s(    ]]<(e\\2A )((	   :
Ar/   r'   r(   c                     [        U R                  U5      n[        U[         5      (       d   e[        US5      (       d   e[        UR                  [
        5      (       d   eUR                  U:X  d   eg )Nr/   )r   r.   rA   rB   r/   r   )r4   r/   rE   s      r5   test_valid_constructor_pathway0TestForceActuator.test_valid_constructor_pathwayS   sg     !W5(M2222x++++(**M::::7***r8   c                     [         R                  " [        5         [        U R                  S 5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   	TypeErrorr   r.   r4   rK   s     r5   1test_invalid_constructor_pathway_not_pathway_baseCTestForceActuator.test_invalid_constructor_pathway_not_pathway_base`   s*    ]]9%djj$/A &%%	   ;
A	 property_name, fixture_attr_name)r.   r.   r/   r/   c                     [        U R                  U R                  5      n[        X5      n[        R
                  " [        5         [        X1U5        S S S 5        g ! , (       d  f       g = fr:   )r   r.   r/   getattrrI   rJ   AttributeErrorsetattr)r4   property_namefixture_attr_namerE   values        r5   test_properties_are_immutable/TestForceActuator.test_properties_are_immutabled   sD     !T\\:0]]>*HU3 +**   A
A*c                 j    [        U R                  U R                  5      nSn[        U5      U:X  d   eg )Nz'ForceActuator(F, LinearPathway(pA, pB)))r   r.   r/   reprr4   actuatorexpecteds      r5   	test_reprTestForceActuator.test_reprq   s-     T\\:<H~)))r8   c                    U R                   R                  U R                  SU R                  R                  -  5        [        U R                  U R                  5      nU R                  U R                  * U R                  R                  -  4U R                   U R                  U R                  R                  -  4/nUR                  5       U:X  d   eg Nr?   )	r(   set_posr'   r-   xr   r.   r/   to_loadsrf   s      r5   test_to_loads_static_pathway.TestForceActuator.test_to_loads_static_pathwayv   s    46688, T\\:WW

l46688+,WWdjj)*
   "h...r8   c                 Z   U R                   R                  U R                  SU R                  -  U R                  R
                  -  5        [        U R                  U R                  5      nU R                  U R                  * U R                  [        U R                  S-  5      -  -  U R                  R
                  -  4U R                   U R                  U R                  [        U R                  S-  5      -  -  U R                  R
                  -  4/nUR                  5       U:X  d   eg rl   )r(   rm   r'   r)   r-   rn   r   r.   r/   r   ro   rf   s      r5   test_to_loads_2D_pathway*TestForceActuator.test_to_loads_2D_pathway   s    47746688!34 T\\:WW

lDGGD!,<$<=dffhhFGWWdjj$''$twwz*:":;DFFHHDE
   "h...r8   c                    U R                   R                  U R                  U R                  U R                  R
                  -  U R                  U R                  R                  -  -
  SU R                  -  U R                  R                  -  -   5        [        U R                  U R                  5      n[        U R                  S-  U R                  S-  -   SU R                  S-  -  -   5      nU R                  * U R                  -  U R                  R
                  -  U-  U R                  U R                  -  U R                  R                  -  U-  -   SU R                  -  U R                  -  U R                  R                  -  U-  -
  nU R                  U R                  -  U R                  R
                  -  U-  U R                  U R                  -  U R                  R                  -  U-  -
  SU R                  -  U R                  -  U R                  R                  -  U-  -   nU R                  U4U R                   U4/nUR                  5       U:X  d   eg )Nr?      )r(   rm   r'   r)   r-   rn   r*   yr+   zr   r.   r/   r   ro   )r4   rg   lengthpO_forcepI_forcerh   s         r5   test_to_loads_3D_pathway*TestForceActuator.test_to_loads_3D_pathway   s   GGGGDFFHHtwwtvvxx//!DGG)DFFHH2DD	
 !T\\:dggqj477A:-$''1*<=jjL )&0jj )&01

l477"46688+F23 	 JJtwwtvvxx'.jj )&01

l477"46688+F23 	 WWhWWh
   "h...r8   )r-   r.   r'   r(   r/   r)   r0   r*   r1   r+   r2   )__name__
__module____qualname____firstlineno__rI   fixturer6   r<   markparametrizer   Oner   r   rF   rL   r   r   rP   rU   ra   ri   rp   rs   r|   __static_attributes__ r8   r5   r!   r!   *   sc   ^^D!% "%7 [[JUUAEENC[&+&C ."56C[!^fSk)6#;>F3K+GH	
	0	0 [[WtSk23 33 [[%+uT{3	
++0 [[*"	
44*
///r8   r!   c                      \ rS rSr\R
                  " SS9S 5       rS rS r\R                  R                  SS\R                  S	\R                  \" \" S
5      S-  5      * 4\" S5      \" S5      S	\R                  \" S5      * \" \" S
5      S-  5      -  4\" S5      \" S5      \R                  \R                  \" S5      * \" \" S
5      S-  5      -  4\" S5      \" S5      \" S5      \" S5      \" S5      * \" \" S
5      S-  5      \" S5      -
  -  4/5      S 5       r\R                  R                  SSS/5      S 5       rS r\R                  R                  SSS/5      S 5       r\R                  R                  S/ SQ5      S 5       r\R                  R                  S\R                  S4\" S5      S4/5      S 5       rS rSrg)TestLinearSpring   Tr#   c                    [        S5      U l        [        S5      U l        [        S5      U l        [        S5      U l        [        U R                  U R
                  5      U l        [        S5      U l	        [        S5      U l        g )Nklr'   r(   qr-   )r   	stiffnessr   r   r'   r(   r   r/   r   r   r   r-   r3   s    r5   _linear_spring_fixture'TestLinearSpring._linear_spring_fixture   s\    ++$TWWdgg6$$r8   c                 :    [        [        [        5      (       d   eg r:   )r;   r   r   r3   s    r5   test_is_force_actuator_subclass0TestLinearSpring.test_is_force_actuator_subclass       ,6666r8   c                 :    [        [        [        5      (       d   eg r:   )r;   r   r   r3   s    r5   r<   /TestLinearSpring.test_is_actuator_base_subclass       ,5555r8   zUstiffness, expected_stiffness, equilibrium_length, expected_equilibrium_length, forcer,   r   r   r?   r   r   c                 0   U R                   R                  U R                  U R                  U R                  R
                  -  5        [        XR                  U5      n[        U[        5      (       d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U:X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U R                  :X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U:X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U:X  d   eg )Nr   r/   equilibrium_lengthr.   )r(   rm   r'   r   r-   rn   r   r/   rA   rB   r   rC   r   r   r.   )r4   r   expected_stiffnessr   expected_equilibrium_lengthr.   springs          r5   test_valid_constructor'TestLinearSpring.test_valid_constructor   sN   ^ 	1i7IJ&,////v{++++&**H5555#5555vy))))&..-8888~~---v34444&33X>>>>((,GGGGvw''''&,,1111||u$$$r8   r   Nc                     [         R                  " [        5         [        XR                  U R
                  5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   r   r   r/   r   )r4   r   rK   s      r5   2test_invalid_constructor_stiffness_not_sympifyableCTestLinearSpring.test_invalid_constructor_stiffness_not_sympifyable   s.    ]]<(Ydff=A )((   !A
Ac                     [         R                  " [        5         [        U R                  S U R
                  5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   rS   r   r   r   rT   s     r5   rU   BTestLinearSpring.test_invalid_constructor_pathway_not_pathway_base   s0    ]]9%T^^T466:A &%%   "A
Ar   c                     [         R                  " [        5         [        U R                  U R
                  U5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   r   r   r   r/   r4   r   rK   s      r5   ;test_invalid_constructor_equilibrium_length_not_sympifyableLTestLinearSpring.test_invalid_constructor_equilibrium_length_not_sympifyable   s3    
 ]]<(T^^T\\;MNA )((r   rX   ))r   r   rY   )r   r   c                     [        U R                  U R                  U R                  5      n[	        X5      n[
        R                  " [        5         [        X1U5        S S S 5        g ! , (       d  f       g = fr:   )	r   r   r/   r   r[   rI   rJ   r\   r]   )r4   r^   r_   r   r`   s        r5   ra   .TestLinearSpring.test_properties_are_immutable  sJ     dnndllDFFC0]]>*F51 +**s   A''
A5equilibrium_length, expectedz&LinearSpring(k, LinearPathway(pA, pB))z<LinearSpring(k, LinearPathway(pA, pB), equilibrium_length=l)c                     U R                   R                  U R                  U R                  U R                  R
                  -  5        [        U R                  U R                  U5      n[        U5      U:X  d   eg r:   )
r(   rm   r'   r   r-   rn   r   r   r/   re   r4   r   rh   r   s       r5   ri   TestLinearSpring.test_repr  sS     	1dnndll<NOF|x'''r8   c                 t   U R                   R                  U R                  U R                  U R                  R
                  -  5        [        U R                  U R                  U R                  5      nU R                  [        U R                  S-  5      -  U R                  R
                  -  nU R                  [        U R                  S-  5      U R                  -
  -  U-  nU R                  * [        U R                  S-  5      U R                  -
  -  U-  n[        U R                  U5      [        U R                   U5      /nUR                  5       n[        Xe5       HT  u  nu  p[        U[        5      (       d   eUR                  U:X  d   eUR                   U	-
  R#                  5       S:X  a  MT   e   g )Nr?   r   )r(   rm   r'   r   r-   rn   r   r   r/   r   r   r   ro   ziprA   pointvectorsimplify)
r4   r   normalpA_forcepB_forcerh   loadsloadr   r   s
             r5   test_to_loadsTestLinearSpring.test_to_loads$  sB   1dnndllDFFCTVVQY'0>>4	?TVV#;<VCNN?DOdff$<=fD$''8,eDGGX.FG!%(%9!D/5dE****::&&&KK&(224999 &:r8   )r-   r   r'   r(   r/   r   r   )r~   r   r   r   rI   r   r   r   r<   r   r   r   r   Zeror   r   r   r   r   rU   r   ra   ri   r   r   r   r8   r5   r   r      s   ^^D!% "%76 [[ nS)1,-- ssT."5q"899 ssT."5q"899 ssssd>##6#9:VC[HI-	
&N%O&N%: [[[4+6> 7>; [[1D#;?O @O [[*	
22 [[&VV=>sN	
	(	(
:r8   r   c                       \ rS rSr\R
                  " SS9S 5       rS rS rS r	S r
\R                  R                  S	S
S/5      S 5       rS r\R                  R                  SSS/5      S 5       rS rS rSrg
)TestLinearDamperi3  Tr#   c                 P   [        S5      U l        [        S5      U l        [        S5      U l        [        S5      U l        [        U R                  U R
                  5      U l        [        S5      U l	        [        SS5      U l
        [        S5      U l        [        S5      U l        g )	Ncr   r'   r(   r   r,   ur-   )r   dampingr   r   r'   r(   r   r/   r   r   dqr   r   r-   r3   s    r5   _linear_damper_fixture'TestLinearDamper._linear_damper_fixture5  sv    c{++$TWWdgg6$ a($$r8   c                 :    [        [        [        5      (       d   eg r:   )r;   r   r   r3   s    r5   r   0TestLinearDamper.test_is_force_actuator_subclassA  r   r8   c                 :    [        [        [        5      (       d   eg r:   )r;   r   r   r3   s    r5   r<   /TestLinearDamper.test_is_actuator_base_subclassD  r   r8   c                 @   U R                   R                  U R                  U R                  U R                  R
                  -  5        [        U R                  U R                  5      n[        U[        5      (       d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U R                  :X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U R                  :X  d   eg )Nr   r/   )r(   rm   r'   r   r-   rn   r   r   r/   rA   rB   rC   r   )r4   dampers     r5   r   'TestLinearDamper.test_valid_constructorG  s    1dllDLL9&,////vy))))&..(3333~~---vy))))&..-8888~~---r8   c                    U R                   R                  U R                  U R                  U R                  R
                  -  5        [        U R                  U R                  5      nU R                  * [        U R                  S-  5      -  U R                  -  U R                  -  n[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U:X  d   eg )Nr?   r.   )r(   rm   r'   r   r-   rn   r   r   r/   r   r   rB   rA   r.   rC   )r4   r   rD   s      r5   rF   -TestLinearDamper.test_valid_constructor_forceU  s    1dllDLL9,,tDFFAI6tww>tvvEvw''''&,,1111||~---r8   r   Nr   c                     [         R                  " [        5         [        XR                  5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   r   r   r/   )r4   r   rK   s      r5   0test_invalid_constructor_damping_not_sympifyableATestLinearDamper.test_invalid_constructor_damping_not_sympifyable^  s(    ]]<(Wll3A )((rN   c                     [         R                  " [        5         [        U R                  S 5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   rS   r   r   rT   s     r5   rU   BTestLinearDamper.test_invalid_constructor_pathway_not_pathway_basec  s*    ]]9%T\\40A &%%rW   rX   )r   r   rY   c                     [        U R                  U R                  5      n[        X5      n[        R
                  " [        5         [        X1U5        S S S 5        g ! , (       d  f       g = fr:   )r   r   r/   r[   rI   rJ   r\   r]   )r4   r^   r_   r   r`   s        r5   ra   .TestLinearDamper.test_properties_are_immutableg  sD     dllDLL90]]>*F51 +**rc   c                     U R                   R                  U R                  U R                  U R                  R
                  -  5        [        U R                  U R                  5      nSn[        U5      U:X  d   eg )Nz&LinearDamper(c, LinearPathway(pA, pB)))
r(   rm   r'   r   r-   rn   r   r   r/   re   )r4   r   rh   s      r5   ri   TestLinearDamper.test_reprt  sS    1dllDLL9;F|x'''r8   c                 4   U R                   R                  U R                  U R                  U R                  R
                  -  5        [        U R                  U R                  5      nU R                  S-  U R                  S-  -  U R                  R
                  -  nU R                  U R                  -  U-  nU R                  * U R                  -  U-  n[        U R                  U5      [        U R                   U5      /nUR                  5       U:X  d   eg rl   )r(   rm   r'   r   r-   rn   r   r   r/   r   r   ro   )r4   r   	directionr   r   rh   s         r5   r   TestLinearDamper.test_to_loadsz  s    1dllDLL9FFAIdffai'0	<<'	1LL=(2$''8,eDGGX.FG H,,,r8   )	r-   r   r   r   r'   r(   r/   r   r   )r~   r   r   r   rI   r   r   r   r<   r   rF   r   r   r   rU   ra   ri   r   r   r   r8   r5   r   r   3  s    ^^D!	% "	%76.. [[Ys44 541 [[*""	
22(-r8   r   c                   P    \ rS rSrSr\R                  " SS9S 5       rS rS r	Sr
g	)
TestForcedMassSpringDamperModeli  a  A single degree of freedom translational forced mass-spring-damper.

Notes
=====

This system is well known to have the governing equation:

.. math::
    m \ddot{x} = F - k x - c \dot{x}

where $F$ is an externally applied force, $m$ is the mass of the particle
to which the spring and damper are attached, $k$ is the spring's stiffness,
$c$ is the dampers damping coefficient, and $x$ is the generalized
coordinate representing the system's single (translational) degree of
freedom.

Tr#   c                 D   [        S5      U l        [        S5      U l        [        S5      U l        [        S5      U l        [        S5      U l        [        SS5      U l        [        S5      U l        [        S5      U l
        [        S	5      U l        U R                  R                  U R                  S
5        [        S5      U l        U R                  R                  U R                  U R                  U R                  R                   -  5        [#        SU R                  U R                  5      U l        ['        U R                  U R                  5      U l        [+        U R                  U R                  /U R                  /U R                  U R                  -
  /S9U l        U R$                  /U l        [1        U R                  //5      U l        [1        U R                  U R                  U R                  -  -
  U R                  U R                  -  -
  //5      U l        g )Nmr   r   r&   r   r,   r   r-   pOr   r'   mass)q_indu_indkd_eqs)r   r   r   r   r&   r   r   r   r   r   framer   originset_vel
attachmentrm   rn   r   r   r   r/   r   kanes_methodbodiesr   mass_matrixforcingr3   s    r5   '_force_mass_spring_damper_model_fixtureGTestForcedMassSpringDamperModel._force_mass_spring_damper_model_fixture  sz   $ a($#C(
DkDJJ*+TVVDJJLL-@AVT__dff=	$T[[$//B'JJ66(66(GGdff$%	
 yyk!DFF8*- 6 FGHIr8   c                 l   U R                   * U R                  R                  -  n[        XR                  5      nU R                  * U R                  R
                  -  n[        X0R                  5      nU R                  U R                  U R                  R                  -  4/UR                  5       QUR                  5       QnU R                  R                  U R                  U5        U R                  R                  U R                  :X  d   eU R                  R                  U R                  :X  d   eg r:   )r   r/   ry   r   r   extension_velocityr   r&   r   rn   ro   r   kanes_equationsr   r   r   )r4   r   r   r   r   r   s         r5   test_force_acuator2TestForcedMassSpringDamperModel.test_force_acuator  s    VVGDLL///	y,,766'$,,999w5 __dffTZZ\\12
__
 __

 	))$++u=  ,,0@0@@@@  ((DLL888r8   c                    [        U R                  U R                  5      n[        U R                  U R                  5      nU R
                  U R                  U R                  R                  -  4/UR                  5       QUR                  5       QnU R                  R                  U R                  U5        U R                  R                  U R                  :X  d   eU R                  R                  U R                  :X  d   eg r:   )r   r   r/   r   r   r   r&   r   rn   ro   r   r   r   r   r   )r4   r   r   r   s       r5    test_linear_spring_linear_damper@TestForcedMassSpringDamperModel.test_linear_spring_linear_damper  s    dffdll3dffdll3 __dffTZZ\\12
__
 __

 	))$++u=  ,,0@0@@@@  ((DLL888r8   )r&   r   r   r   r   r   r   r   r   r   r   r   r   r/   r   r   N)r~   r   r   r   __doc__rI   r   r   r   r   r   r   r8   r5   r   r     s0    $ ^^D!J "J>9 9r8   r   c            	          \ rS rSr\R
                  " SS9S 5       rS r\R                  R                  S\
" S5      \" S5      \
" S5      S-  \
" S5      -   /5      \R                  R                  S	\R                  \R                  4\\R                  4\R                  \4\\4/5      S
 5       5       r\R                  R                  S\
" S5      \" S5      \
" S5      S-  \
" S5      -   /5      \R                  R                  S\R                  \/5      S 5       5       r\R                  R                  SSS/5      S 5       r\R                  R                  S\
" S5      \" S5      /5      S 5       r\R                  R                  SS\" S5      4\" S5      S4S\" S5      4\" S5      S4/5      S 5       r\R                  R                  S/ SQ5      S 5       rS rS rS rS rS rS rSrg) TestTorqueActuatori  Tr#   c                     [        S5      U l        [        S5      U l        [        S5      U l        U R                  R
                  U l        [        SU R                  S9U l        [        SU R                  S9U l	        g )NTr-   Ar   )r   r   )
r   torquer   r-   r   rx   axisr   r   r   r3   s    r5   _torque_actuator_fixture+TestTorqueActuator._torque_actuator_fixture  sX    Sk$$FFHH	7!*DFF;r8   c                 :    [        [        [        5      (       d   eg r:   )r;   r   r   r3   s    r5   r<   1TestTorqueActuator.test_is_actuator_base_subclass  s    .,7777r8   r   r   r?   ztarget_frame, reaction_framec                    [        UU R                  UU5      n[        U[         5      (       d   e[        US5      (       d   e[        UR                  [
        5      (       d   eUR                  U:X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U R                  :X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  [        R                  :X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  [        R                  :X  d   eg Nr   r   target_framereaction_frame)r   r   rA   rB   r   rC   r   r  r   r   r   r  r   )r4   r   r  r  rE   s        r5   $test_valid_constructor_with_reaction7TestTorqueActuator.test_valid_constructor_with_reaction  s8   . "II	
 (N3333x****(//84444&(((x(((((--0000}}		)))x0000(//@@@@$$444x!12222(11>BBBB&&(..888r8   r  c                 v   [        XR                  U5      n[        U[         5      (       d   e[        US5      (       d   e[        UR                  [
        5      (       d   eUR                  U:X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U R                  :X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  [        R                  :X  d   e[        US5      (       d   eUR                  b   eg r  )r   r   rA   rB   r   rC   r   r  r   r   r   r  )r4   r   r  rE   s       r5   'test_valid_constructor_without_reaction:TestTorqueActuator.test_valid_constructor_without_reaction  s    "&))\B(N3333x****(//84444&(((x(((((--0000}}		)))x0000(//@@@@$$444x!12222&&...r8   Nc                     [         R                  " [        5         [        XR                  U R
                  5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   r   r   r   r   )r4   r   rK   s      r5   /test_invalid_constructor_torque_not_sympifyableBTestTorqueActuator.test_invalid_constructor_torque_not_sympifyable/  s.    ]]<(vyy$++>A )((r   r   ac                     [         R                  " [        5         [        U R                  XR
                  U R                  5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   rS   r   r   r   r   )r4   r   rK   s      r5   (test_invalid_constructor_axis_not_vector;TestTorqueActuator.test_invalid_constructor_axis_not_vector4  s4    ]]9%t{{D++t}}MA &%%   ,A
Aframeschildparentc                     [         R                  " [        5         [        U R                  U R
                  /UQ76 nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   rS   r   r   r   )r4   r  rK   s      r5   )test_invalid_constructor_frames_not_frame<TestTorqueActuator.test_invalid_constructor_frames_not_frame9  s5     ]]9%t{{DII??A &%%r   rX   ))r   r   )r   r   )r  r   )r  r   c                    [        U R                  U R                  U R                  U R                  5      n[        X5      n[        R                  " [        5         [        X1U5        S S S 5        g ! , (       d  f       g = fr:   )
r   r   r   r   r   r[   rI   rJ   r\   r]   )r4   r^   r_   rg   r`   s        r5   ra   0TestTorqueActuator.test_properties_are_immutableF  sX     "KKIIKKMM	
 0]]>*HU3 +**s   A22
B c                     [        U R                  U R                  U R                  5      nSn[	        U5      U:X  d   eg )Nz+TorqueActuator(T, axis=N.z, target_frame=N))r   r   r   r   re   rf   s      r5   test_repr_without_reaction-TestTorqueActuator.test_repr_without_reactionZ  s3    !$++tyy$++F@H~)))r8   c                     [        U R                  U R                  U R                  U R                  5      nSn[        U5      U:X  d   eg )Nz=TorqueActuator(T, axis=N.z, target_frame=N, reaction_frame=A))r   r   r   r   r   re   rf   s      r5   test_repr_with_reaction*TestTorqueActuator.test_repr_with_reaction_  sB    !KKIIKKMM	
 SH~)))r8   c           
         [        SU R                  U R                  [        S5      [        S5      U R                  U R
                  S9n[        R                  " U R                  U5      n[        U[        5      (       d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U R                  :X  d   e[        US5      (       d   e[        UR
                  [        5      (       d   eUR
                  U R
                  :X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U R                  :X  d   e[        US5      (       d   e[        UR                   [        5      (       d   eUR                   U R                  :X  d   eg )	Npinr   r   )coordinatesspeedsparent_interframe
joint_axisr   r   r  r  )r   r   r   r   r-   r   r   at_pin_jointr   rA   rB   rC   r   r  r   r   r  )r4   	pin_jointrE   s      r5   test_at_pin_joint_constructor0TestTorqueActuator.test_at_pin_joint_constructori  so   KKMM&s+!#&"ffyy
	 "..t{{IF(N3333x****(//84444$++---x(((((--0000}}		)))x0000(//@@@@$$...x!12222(11>BBBB&&$&&000r8   c                     [         R                  " [        5         [        R                  " U R
                  [        S5      5      nS S S 5        g ! , (       d  f       g = f)Nr#  )rI   rJ   rS   r   r(  r   r   rT   s     r5   1test_at_pin_joint_pin_joint_not_pin_joint_invalidDTestTorqueActuator.test_at_pin_joint_pin_joint_not_pin_joint_invalid  s4    ]]9%++DKKGA &%%s   +A
Ac                     [        U R                  U R                  U R                  5      nU R                  U R                  U R                  -  4/nUR                  5       U:X  d   eg r:   )r   r   r   r   r-   ro   rf   s      r5   test_to_loads_without_reaction1TestTorqueActuator.test_to_loads_without_reaction  sU    !$++tyy$++FVVT[[*+
   "h...r8   c                 2   [        U R                  U R                  U R                  U R                  5      nU R
                  U R                  U R                  -  4U R                  U R                  * U R                  -  4/nUR                  5       U:X  d   eg r:   )r   r   r   r   r   r-   r   ro   rf   s      r5   test_to_loads_with_reaction.TestTorqueActuator.test_to_loads_with_reaction  s~    !KKIIKKMM	
 VVT[[*+VVt{{]499,-
   "h...r8   )r   r-   r   r   r   r   )r~   r   r   r   rI   r   r   r<   r   r   r   r   r   r   r   r  r
  r  r  r   r   r  ra   r  r   r*  r-  r0  r3  r   r   r8   r5   r   r     s>   ^^D!< "<8 [[3K33KNVC[(	
 [[&\\8>>*X^^$\\8$X		
9"9< [[3K33KNVC[(	
 [[^fllF-CD/ E/& [[Xc{3? 4? [[VfSk>#3F%GHN IN [[>'*+H%t,9W%&x $'		
@@ [[*	
	4	4*
*1:H//r8   r   c                       \ rS rSrSrg)NonSympifyablei  r   N)r~   r   r   r   r   r   r8   r5   r6  r6    s    r8   r6  c                   J   \ rS rSr\R
                  " SS9S 5       rS rS r\R                  R                  SS\R                  S\R                  S	\R                  \" \" S
5      S-  5      * \" \" S
5      S-  5      S-  -
  4\" S5      \" S5      \" S5      \" S5      S	\R                  \" S5      * \" \" S
5      S-  5      -  \" S5      \" \" S
5      S-  5      S-  -  -
  4\" S5      \" S5      \" S5      \" S5      \R                  \R                  \" S5      * \" \" S
5      S-  5      -  \" S5      \" \" S
5      S-  5      S-  -  -
  4\" S5      \" S5      \" S5      \" S5      \" S5      \" S5      \" S5      * \" \" S
5      S-  5      \" S5      -
  -  \" S5      \" \" S
5      S-  5      \" S5      -
  S-  -  -
  4/5      S 5       r\R                  R                  SS\" 5       /5      S 5       r\R                  R                  SS\" 5       /5      S 5       rS r\R                  R                  SS\" 5       /5      S 5       r\R                  R                  S/ SQ5      S 5       r\R                  R                  SS\" S5      S4/5      S 5       rS  rS!rg)"TestDuffingSpringi  Tr#   c                 .   [        S5      U l        [        S5      U l        [        S5      U l        [	        S5      U l        [	        S5      U l        [        U R
                  U R                  5      U l        [        S5      U l
        [        S5      U l        g )Nbetaalphar   r'   r(   r   r-   )r   linear_stiffnessnonlinear_stiffnessr   r   r'   r(   r   r/   r   r   r   r-   r3   s    r5   _duffing_spring_fixture)TestDuffingSpring._duffing_spring_fixture  sl     !'v#)'? "(+++$TWWdgg6$$r8   c                 :    [        [        [        5      (       d   eg r:   )r;   r   r   r3   s    r5   r   1TestDuffingSpring.test_is_force_actuator_subclass  s    -7777r8   c                 :    [        [        [        5      (       d   eg r:   )r;   r   r   r3   s    r5   r<   0TestDuffingSpring.test_is_actuator_base_subclass  r>   r8   zlinear_stiffness,  expected_linear_stiffness,  nonlinear_stiffness,   expected_nonlinear_stiffness,  equilibrium_length,    expected_equilibrium_length,   forcer,   r   r   r?      r:  r;  r   c                    U R                   R                  U R                  U R                  U R                  R
                  -  5        [        XU R                  U5      n[        U[        5      (       d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U:X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U:X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U R                  :X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U:X  d   e[        US5      (       d   e[        UR                  [        5      (       d   eUR                  U:X  d   eg )Nr<  r=  r/   r   r.   )r(   rm   r'   r   r-   rn   r   r/   rA   rB   r<  rC   r=  r   r   r.   )	r4   r<  expected_linear_stiffnessr=  expected_nonlinear_stiffnessr   r   r.   r   s	            r5   r   (TestDuffingSpring.test_valid_constructor  s   ~ 	1/dllTfg&-0000v12222&118<<<<&&*CCCCv45555&44h????))-IIIIvy))))&..-8888~~---v34444&33X>>>>((,GGGGvw''''&,,1111||u$$$r8   r<  Nc                     [         R                  " [        5         [        XR                  U R
                  U R                  5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   r   r   r=  r/   r   )r4   r<  rK   s      r5   9test_invalid_constructor_linear_stiffness_not_sympifyableKTestDuffingSpring.test_invalid_constructor_linear_stiffness_not_sympifyable  s:    ]]<(.0H0H$,,X\XoXopA )((r  r=  c                     [         R                  " [        5         [        U R                  XR
                  U R                  5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   r   r   r<  r/   r   )r4   r=  rK   s      r5   <test_invalid_constructor_nonlinear_stiffness_not_sympifyableNTestDuffingSpring.test_invalid_constructor_nonlinear_stiffness_not_sympifyable  s:    ]]<(d335H,,X\XoXopA )((r  c                     [         R                  " [        5         [        U R                  U R
                  [        5       U R                  5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   rS   r   r<  r=  r6  r   rT   s     r5   rU   CTestDuffingSpring.test_invalid_constructor_pathway_not_pathway_base  s@    ]]9%d33T5M5M~O_aeaxaxyA &%%s   5A
A'r   c                     [         R                  " [        5         [        U R                  U R
                  U R                  U5      nS S S 5        g ! , (       d  f       g = fr:   )rI   rJ   r   r   r<  r=  r/   r   s      r5   r   MTestDuffingSpring.test_invalid_constructor_equilibrium_length_not_sympifyable  s;    ]]<(d33T5M5Mt||]opA )((s   -A
ArX   ))r<  r<  )r=  r=  rY   )r   r   c           	         [        U R                  U R                  U R                  U R                  5      n[
        R                  " [        5         [        X1[        X5      5        S S S 5        g ! , (       d  f       g = fr:   )
r   r<  r=  r/   r   rI   rJ   r\   r]   r[   )r4   r^   r_   r   s       r5   ra   /TestDuffingSpring.test_properties_are_immutable"  sU     t44d6N6NPTP\P\^b^u^uv]]>*F74+KL +**s   A00
A>r   )r   zGDuffingSpring(beta, alpha, LinearPathway(pA, pB), equilibrium_length=0)zGDuffingSpring(beta, alpha, LinearPathway(pA, pB), equilibrium_length=l)c                 ~    [        U R                  U R                  U R                  U5      n[	        U5      U:X  d   eg r:   )r   r<  r=  r/   re   r   s       r5   ri   TestDuffingSpring.test_repr2  s:     t44d6N6NPTP\P\^pqF|x'''r8   c                    U R                   R                  U R                  U R                  U R                  R
                  -  5        [        U R                  U R                  U R                  U R                  5      nU R                  U R                  -
  nU R                  * U-  U R                  US-  -  -
  n[        U R                  X0R                  R
                  -  5      [        U R                   U* U R                  R
                  -  5      /nUR                  5       n[        XT5       H  u  pgUR                  UR                  :X  d   eU R                   H  nUR                  R!                  U5      n	UR                  R!                  U5      n
U R                  S[#        S5      S[#        S5      S[#        S5      S0nX-
  R%                  U5      R'                  5       n[)        U5      S:  a  M   SU 35       e   M     g )NrD  r,   r   r;  r:  g&.>z%The forces do not match. Difference: )r(   rm   r'   r   r-   rn   r   r<  r=  r/   r   r   ro   r   r   r   dotr   subsevalfr   )r4   r   displacementr.   expected_loadscalculated_loads
calculatedrh   dimcalculated_componentexpected_componentsubstitutionsdiffs                r5   r   TestDuffingSpring.test_to_loads?  s   1t44d6N6NPTP\P\^b^u^uv vv 7 77 &&&58P8PS_abSb8bb  )9:E$''E6TXTZTZT\T\K\<]^ "??,$'(8$I J##x~~555vv'1'8'8'<'<S'A$%-__%8%8%="!%F3KF7OQPVW]P^`a b,AGGV\\^4y4'W+PQUPV)WW'  %Jr8   )r-   r   r<  r=  r'   r(   r/   r   )r~   r   r   r   rI   r   r>  r   r<   r   r   r   r   r   r   r   r   r   r6  rJ  rM  rU   r   ra   ri   r   r   r   r8   r5   r8  r8    sF   ^^D!% "%87 [[	 nS)1,--tN34G4J/Ka.OO vvww^C%8!%; <<VG_dSabeSfhiSiNjmnMn=nn vvww^C%8!%; <<VG_dSabeSfhiSiNjmnMn=nn vvwwss4s(;Q(>#?&+#MNQWX_Q`dhiwx{i|~i  eA  DJ  KN  DO  eO  RS  dS  RS  S9%
1j!%k1j!%F [[/$8H1IJq Kq [[2T>;K4LMq Nqz [[1D.:J3KLq Mq [[*	
MM
 [[&ZC[cd	
((Xr8   r8  c                   ^    \ rS rSr\R
                  " SS9S 5       rS rS rS r	S r
S	 rS
rg)TestCoulombKineticFrictioniY  Tr#   c                 n    [        SSS9u  U l        U l        U l        U l        U l        U l        U l        g)a  A block sliding on a surface.

Notes
=====
This test validates the correctness of the CoulombKineticFriction by simulating
a block sliding on a surface with the Coulomb kinetic friction force.
The test covers scenarios with both positive and negative velocities.

zm g mu_k mu_s v_s sigma FT)realN)r	   r   gmu_kmu_sv_ssigmar&   r3   s    r5   _block_on_surface,TestCoulombKineticFriction._block_on_surfaceZ  s1     NUUpw{M|J	49dh
DFr8   c                 	   [        S5      n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  U5      n[        X0R                  U R                  -  U R                  -  U-  [        [        US-  5      UR                  5       -  U-  5      -  [        US-  5      -  UR                  -  S9[        X@R                  * U R                  -  U R                  -  U-  [        [        US-  5      UR                  5       -  U-  5      -  [        US-  5      -  UR                  -  S9/nUR                  5       U:X  d   e[        SSS	9n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  U5      n[        X0R                  U R                  -  U R                  -  [        UR                  5       5      -  UR                  -  S9[        X@R                  * U R                  -  U R                  -  [        UR                  5       5      -  UR                  -  S9/nUR                  5       U:X  d   e[        SS
S	9n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  U5      n[        X0R                  U R                  -  U R                  -  U-  [        [        US-  5      UR                  5       -  U-  5      -  [        US-  5      -  UR                  -  S9[        X@R                  * U R                  -  U R                  -  U-  [        [        US-  5      UR                  5       -  U-  5      -  [        US-  5      -  UR                  -  S9/n	UR                  5       U	:X  d   eg )Nr   r-   OPr   r?   r   r.   TpositiveF)r   r   r   	locatenewrn   r   rc  r   r   rj  r   ri  r   r   r   ro   
r4   r   r-   rq  rr  r/   frictionexpected_generalexpected_positiveexpected_negatives
             r5   test_block_on_surface_default8TestCoulombKineticFriction.test_block_on_surface_defaulti  sq   33#JKKQW%			!Q			!VVX^$%)$))TVVdff_gN!$&&4991Lq1PSWX\]^`a]aXbefekekemXmnoXoSp1pquvwyzvzq{1{~  B  B  2B  C!&&4661ADII1MPQ1QTXY]^_ab^bYcfgflflfnYnopYpTq1qrvwxz{w{r|1|  @A  @C  @C  2C  DE   "&6666 3.3#JKKQW%			!Q			!VVX^$%)$))TVVdff_gN"&&466/DII2MPTUVU[U[U]P^2^abadad2de"66'DFF2BTYY2NQUVWV\V\V^Q_2_bcbebe2efh   "&7777 3/3#JKKQW%			!Q			!VVX^$%)$))TVVdff_gN"&&466/DII2MPQ2QTXY]^_ab^bYcfgflflfnYnopYpTq2qrvwxz{w{r|2|}~  ~A  ~A  3A  B"66'DFF2BTYY2NQR2RUYZ^_`bc_cZdghgmgmgoZopqZqUr2rswxy{|x|s}2}~  B  B  3B  CD   "&7777r8   c                    [        S5      n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  XPR                  S9n[        X0R                  U R                  -  U R                  -  [        [        US-  5      UR                  5       -  U-  5      -  U R                  [        US-  5      -  UR                  5       -  U-  -   U-  [        US-  5      -  UR                  -  S9[        X@R                  * U R                  -  U R                  -  [        [        US-  5      UR                  5       -  U-  5      -  U R                  [        US-  5      -  UR                  5       -  U-  -
  U-  [        US-  5      -  UR                  -  S9/nUR!                  5       U:X  d   e[        SS	S
9n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  XPR                  S9n[        X0R                  U R                  -  U R                  -  [        UR                  5       5      -  U R                  UR                  5       -  -   UR                  -  S9[        X@R                  * U R                  -  U R                  -  [        UR                  5       5      -  U R                  UR                  5       -  -
  UR                  -  S9/nUR!                  5       U:X  d   e[        SSS
9n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  XPR                  S9n[        X0R                  U R                  -  U R                  -  [        [        US-  5      UR                  5       -  U-  5      -  U R                  [        US-  5      -  UR                  5       -  U-  -   U-  [        US-  5      -  UR                  -  S9[        X@R                  * U R                  -  U R                  -  [        [        US-  5      UR                  5       -  U-  5      -  U R                  [        US-  5      -  UR                  5       -  U-  -
  U-  [        US-  5      -  UR                  -  S9/n	UR!                  5       U	:X  d   eg )Nr   r-   rq  rr  r   )rm  r?   rs  Trt  F)r   r   r   rv  rn   r   rc  r   r   rj  r   ri  rm  r   r   r   ro   rw  s
             r5   test_block_on_surface_viscous8TestCoulombKineticFriction.test_block_on_surface_viscous  s   33#JKKQW%			!Q			!VVX^$%)$))TVVdff_gU_U_`!&&466/DII2MPTUYZ[]^Z^U_bcbhbhbjUjklUlPm2mptpzpz  ~B  CD  FG  CG  ~H  qH  KL  KQ  KQ  KS  qS  TU  qU  3U  YZ  2Z  [_  `a  cd  `d  [e  2e  hi  hk  hk  2k  l!66'DFF2BTYY2NQUVZ[\^_[_V`cdcicickVklmVmQn2nquq{q{  C  DE  GH  DH  I  rI  LM  LR  LR  LT  rT  UV  rV  3V  Z[  2[  \`  ab  de  ae  \f  2f  ij  il  il  2l  mn   "&6666 3.3#JKKQW%			!Q			!VVX^$%)$))TVVdff_gU_U_`"66DFF?TYY3NQUVWV\V\V^Q_3_bfblblopououowbw3w{|{~{~2~"FF7TVV3Cdii3ORVWXW]W]W_R`3`cgcmcmpqpvpvpxcx3x|}||2  AB   "&7777 3/3#JKKQW%			!Q			!VVX^$%)$))TVVdff_gU_U_`"66DFF?TYY3NQUVZ[\^_[_V`cdcicickVklmVmQn3nquq{q{  C  DE  GH  DH  I  rI  LM  LR  LR  LT  rT  UV  rV  4V  Z[  3[  \`  ab  de  ae  \f  3f  ij  il  il  3l  m"FF7TVV3Cdii3ORVW[\]_`\`WadedjdjdlWlmnWnRo3orvr|r|  @D  EF  HI  EI  @J  sJ  MN  MS  MS  MU  sU  VW  sW  4W  [\  3\  ]a  bc  ef  bf  ]g  3g  jk  jm  jm  3m  no   "&7777r8   c                 ,   [        S5      n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  XPR                  U R                  S9n[        X0R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [        UR                  5       S-  * U R                  S-  -  5      -  -   U-  [!        [#        US-  5      UR                  5       -  U-  5      -  [#        US-  5      -  UR                  -  S9[        X@R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [        UR                  5       S-  * U R                  S-  -  5      -  -   * U-  [!        [#        US-  5      UR                  5       -  U-  5      -  [#        US-  5      -  UR                  -  S9/nUR%                  5       U:X  d   e[        SS	S
9n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  XPR                  U R                  S9n[        X0R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [        UR                  5       S-  * U R                  S-  -  5      -  -   [!        UR                  5       5      -  UR                  -  S9[        X@R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [        UR                  5       S-  * U R                  S-  -  5      -  -   * [!        UR                  5       5      -  UR                  -  S9/nUR%                  5       U:X  d   e[        SSS
9n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  XPR                  U R                  S9n[        X0R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [        UR                  5       S-  * U R                  S-  -  5      -  -   U-  [!        [#        US-  5      UR                  5       -  U-  5      -  [#        US-  5      -  UR                  -  S9[        X@R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [        UR                  5       S-  * U R                  S-  -  5      -  -   * U-  [!        [#        US-  5      UR                  5       -  U-  5      -  [#        US-  5      -  UR                  -  S9/n	UR%                  5       U	:X  d   eg )Nr   r-   rq  rr  r   )rl  rk  r?   rs  Trt  F)r   r   r   rv  rn   r   rc  r   r   rj  r   ri  rl  rk  r   r
   r   r   ro   rw  s
             r5   test_block_on_surface_stribeck9TestCoulombKineticFriction.test_block_on_surface_stribeck  s   33#JKKQW%			!Q			!VVX^$%)$))TVVdff_gS[S[bfbkbkl!&&466/DII2MRVRXRXQX[_[a[aQadhdmdmQmptpvpvy}yyp  CG  CL  CL  qL  RL  PS  UV  U[  U[  U]  _`  U`  T`  ae  ai  ai  kl  al  Tl  Pm  Qm  3m  qr  2r  uy  z~  @  BC  C  zD  GH  GM  GM  GO  zO  PQ  zQ  uR  2R  SW  XY  [\  X\  S]  2]  `a  `c  `c  2c  d!FFTVVOdii4OTXTZTZSZ]a]c]cScfjfofoSorvrxrx{  |B  |B  sB  EI  EN  EN  sN  TN  RU  WX  W]  W]  W_  ab  Wb  Vb  cg  ck  ck  mn  cn  Vn  Ro  So  5o  2p  st  2t  w{  |@  AB  DE  AE  |F  IJ  IO  IO  IQ  |Q  RS  |S  wT  2T  UY  Z[  ]^  Z^  U_  2_  bc  be  be  2e  fg   "&6666 3.3#JKKQW%			!Q			!VVX^$%)$))TVVdff_gS[S[bfbkbkl"66DFF?TYY3NSWSYSYRY\`\b\bRbeienenRnquqwqwz~  {A  {A  rA  DH  DM  DM  rM  SM  QT  VW  V\  V\  V^  `a  Va  Ua  bf  bj  bj  lm  bm  Um  Qn  Rn  4n  rv  wx  w}  w}  w  r@  3@  CD  CF  CF  3F  G"VVdff_tyy5PUYU[U[T[^b^d^dTdgkgpgpTpswsysy  }A  }C  }C  tC  FJ  FO  FO  tO  UO  SV  XY  X^  X^  X`  bc  Xc  Wc  dh  dl  dl  no  do  Wo  Sp  Tp  6p  3q  tx  yz  y  y  yA  tB  3B  EF  EH  EH  3H  IJ   "&7777 3/3#JKKQW%			!Q			!VVX^$%)$))TVVdff_gS[S[bfbkbkl"66DFF?TYY3NSWSYSYRY\`\b\bRbeienenRnquqwqwz~  {A  {A  rA  DH  DM  DM  rM  SM  QT  VW  V\  V\  V^  `a  Va  Ua  bf  bj  bj  lm  bm  Um  Qn  Rn  4n  rs  3s  vz  {  @A  CD  @D  {E  HI  HN  HN  HP  {P  QR  {R  vS  3S  TX  YZ  \]  Y]  T^  3^  ab  ad  ad  3d  e"VVdff_tyy5PUYU[U[T[^b^d^dTdgkgpgpTpswsysy  }A  }C  }C  tC  FJ  FO  FO  tO  UO  SV  XY  X^  X^  X`  bc  Xc  Wc  dh  dl  dl  no  do  Wo  Sp  Tp  6p  3q  tu  3u  x|  }A  BC  EF  BF  }G  JK  JP  JP  JR  }R  ST  }T  xU  3U  VZ  [\  ^_  [_  V`  3`  cd  cf  cf  3f  gh   "&7777r8   c                 f   [        S5      n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  XPR                  U R                  U R                  S9n[        X0R                  [!        US-  5      -  UR                  5       -  U-  U R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [#        UR                  5       S-  * U R                  S-  -  5      -  -   [%        [!        US-  5      UR                  5       -  U-  5      -  -   U-  [!        US-  5      -  UR                  -  S9[        X@R                  * [!        US-  5      -  UR                  5       -  U-  U R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [#        UR                  5       S-  * U R                  S-  -  5      -  -   [%        [!        US-  5      UR                  5       -  U-  5      -  -
  U-  [!        US-  5      -  UR                  -  S9/nUR'                  5       U:X  d   e[        SS	S
9n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  XPR                  U R                  U R                  S9n[        X0R                  UR                  5       -  U R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [#        UR                  5       S-  * U R                  S-  -  5      -  -   [%        UR                  5       5      -  -   UR                  -  S9[        X@R                  * UR                  5       -  U R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [#        UR                  5       S-  * U R                  S-  -  5      -  -   [%        UR                  5       5      -  -
  UR                  -  S9/nUR'                  5       U:X  d   e[        SSS
9n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  U R                  U R                  -  XPR                  U R                  U R                  S9n[        X0R                  [!        US-  5      -  UR                  5       -  U-  U R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [#        UR                  5       S-  * U R                  S-  -  5      -  -   [%        [!        US-  5      UR                  5       -  U-  5      -  -   U-  [!        US-  5      -  UR                  -  S9[        X@R                  * [!        US-  5      -  UR                  5       -  U-  U R                  U R                  -  U R                  -  U R                  * U R                  -  U R                  -  U R                  U R                  -  U R                  -  -   [#        UR                  5       S-  * U R                  S-  -  5      -  -   [%        [!        US-  5      UR                  5       -  U-  5      -  -
  U-  [!        US-  5      -  UR                  -  S9/n	UR'                  5       U	:X  d   eg )Nr   r-   rq  rr  r   )rl  rm  rk  r?   rs  Trt  F)r   r   r   rv  rn   r   rc  r   r   rj  r   ri  rl  rm  rk  r   r   r
   r   ro   rw  s
             r5   test_block_on_surface_all4TestCoulombKineticFriction.test_block_on_surface_all  s   33#JKKQW%			!Q			!VVX^$%)$))TVVdff_gS[S[cgcmcmtxt}t}~!**tAqDz2IAFFH2TUV2VZ^Z`Z`cgciciZilpluluZuz~  {A  {A  zA  DH  DJ  DJ  zJ  MQ  MV  MV  zV  Y]  Y_  Y_  bf  bh  bh  Yh  ko  kt  kt  Yt  zt  x{  }~  }C  }C  }E  GH  }H  |H  IM  IQ  IQ  ST  IT  |T  xU  yU  [U  Y]  ^b  cd  fg  cg  ^h  kl  kq  kq  ks  ^s  tu  ^u  Yv  Zv  3v  z{  2{  |@  AB  DE  AE  |F  2F  IJ  IL  IL  2L  M!::+QT
2JQVVX2UVW2W[_[a[adhdjdj[jmqmvmv[v{  |B  |B  {B  EI  EK  EK  {K  NR  NW  NW  {W  Z^  Z`  Z`  cg  ci  ci  Zi  lp  lu  lu  Zu  {u  y|  ~  ~D  ~D  ~F  HI  ~I  }I  JN  JR  JR  TU  JU  }U  yV  zV  \V  Z^  _c  de  gh  dh  _i  lm  lr  lr  lt  _t  uv  _v  Zw  [w  3w  {|  2|  }A  BC  EF  BF  }G  2G  JK  JM  JM  2M  NO   "&6666 3.3#JKKQW%			!Q			!VVX^$%)$))TVVdff_gS[S[cgcmcmtxt}t}~"::3HDFFUYU[U[O^b^g^gLglplrlrkruyu{u{k{  C  H  H  lH  KO  KQ  KQ  TX  TZ  TZ  KZ  ]a  ]f  ]f  Kf  lf  jm  op  ou  ou  ow  yz  oz  nz  {  {C  {C  EF  {F  nF  jG  kG  MG  KO  PQ  PV  PV  PX  KY  LY  4Y  ]^  ]`  ]`  3`  a"JJ;3ITVVVZV\V\__c_h_hMhmqmsmslsvzv|v|l|  @D  @I  @I  mI  LP  LR  LR  UY  U[  U[  L[  ^b  ^g  ^g  Lg  mg  kn  pq  pv  pv  px  z{  p{  o{  |@  |D  |D  FG  |G  oG  kH  lH  NH  LP  QR  QW  QW  QY  LZ  MZ  4Z  ^_  ^a  ^a  3a  bc   "&7777 3/3#JKKQW%			!Q			!VVX^$%)$))TVVdff_gS[S[cgcmcmtxt}t}~"::QT
3JQVVX3UVW3W[_[a[adhdjdj[jmqmvmv[v{  |B  |B  {B  EI  EK  EK  {K  NR  NW  NW  {W  Z^  Z`  Z`  cg  ci  ci  Zi  lp  lu  lu  Zu  {u  y|  ~  ~D  ~D  ~F  HI  ~I  }I  JN  JR  JR  TU  JU  }U  yV  zV  \V  Z^  _c  de  gh  dh  _i  lm  lr  lr  lt  _t  uv  _v  Zw  [w  4w  {|  3|  }A  BC  EF  BF  }G  3G  JK  JM  JM  3M  N"JJ;ad3Kaffh3VWX3X\`\b\beiekek\knrnwnw\w  }A  }C  }C  |C  FJ  FL  FL  |L  OS  OX  OX  |X  [_  [a  [a  dh  dj  dj  [j  mq  mv  mv  [v  |v  z}  @  E  E  G  IJ  J  ~J  KO  KS  KS  UV  KV  ~V  zW  {W  ]W  [_  `d  ef  hi  ei  `j  mn  ms  ms  mu  `u  vw  `w  [x  \x  4x  |}  3}  ~B  CD  FG  CG  ~H  3H  KL  KN  KN  3N  OP   "&7777r8   c                 f   [        S5      n[        S5      n[        S5      nUR                  SXR                  -  5      nUR                  US5        UR                  X!R                  5       UR                  -  5        [        X45      n[        U R                  SU5      nUR                  S:X  d   eg )Nr   r-   rq  rr  r   )r   r   r   rv  rn   r   rc  r   r   rj  r.   )r4   r   r-   rq  rr  r/   rx  s          r5   test_normal_force_zero1TestCoulombKineticFriction.test_normal_force_zero-  s    33#JKKQW%			!Q			!VVX^$%)II

 ~~"""r8   )r&   ri  r   rj  rk  rm  rl  N)r~   r   r   r   rI   r   rn  r|  r  r  r  r  r   r   r8   r5   rf  rf  Y  s<    ^^D!} "}/8b/8b/8b/8b#r8   rf  )+r   rI   sympyr   r   r   r   r   r   r	   r
   r   sympy.physics.mechanicsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   sympy.core.exprr   rC   r   r   r!   r   r   r   r   r6  r8  rf  r   r8   r5   <module>r     s    C 
 
 
    ( -	8	Z s/ s/lP: P:fN- N-bO9 O9dF/ F/R	 	tX tXlc# c#r8   