U
    L?hu                     @   s   d Z ddlZddlmZmZmZmZmZmZ ddl	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ edZedZG dd	 d	ZG d
d dZ G dd dZ!G dd dZ"G dd dZ#G dd dZ$G dd dZ%dS )z=Tests for the ``sympy.physics.mechanics.actuator.py`` module.    N)SMatrixSymbolSympifyErrorsqrtAbs)ActuatorBaseForceForceActuatorKanesMethodLinearDamperLinearPathwayLinearSpringParticlePinJointPointReferenceFrame	RigidBodyTorqueActuatorVectordynamicsymbolsDuffingSpring)Exprtargetreactionc                   @   s  e Zd Zejdddd Zdd Zejdde	j
fe	j
e	j
fed	ed	fed	ed	fed	d
 ed	 ed	d
 ed	 fgdd Zejddd	gdd Zejdeededgdd Zdd Zejdddgdd Zdd Zdd  Zd!d" Zd#d$ ZdS )%TestForceActuatorTZautousec                 C   s~   t d| _td| _td| _t| j| j| _td| _td| _	td| _
tdd| _tdd| _tdd| _td| _d S )	NFpApBq1q2q3   N)r   forcer   r   r   r   pathwayr   r    r!   r"   Zq1dZq2dZq3dr   r$   self r)   ]/var/www/html/venv/lib/python3.8/site-packages/sympy/physics/mechanics/tests/test_actuator.py_linear_pathway_fixture(   s    





z)TestForceActuator._linear_pathway_fixturec                 C   s   t ttstd S N)
issubclassr
   r   AssertionErrorr'   r)   r)   r*   test_is_actuator_base_subclass6   s    z0TestForceActuator.test_is_actuator_base_subclasszforce, expected_forcer#   r      c                 C   sJ   t || j}t|t stt|ds(tt|jts8t|j|ksFtd S )Nr%   )r
   r&   
isinstancer.   hasattrr%   ExprType)r(   r%   expected_forceinstancer)   r)   r*   test_valid_constructor_force9   s
    z.TestForceActuator.test_valid_constructor_forcer%   Nc              	   C   s&   t t t|| j}W 5 Q R X d S r,   )pytestraisesr   r
   r&   )r(   r%   _r)   r)   r*   .test_invalid_constructor_force_not_sympifyableJ   s    z@TestForceActuator.test_invalid_constructor_force_not_sympifyabler&   r   r   c                 C   sJ   t | j|}t|t stt|ds(tt|jts8t|j|ksFtd S )Nr&   )r
   r%   r1   r.   r2   r&   r   )r(   r&   r5   r)   r)   r*   test_valid_constructor_pathwayO   s
    z0TestForceActuator.test_valid_constructor_pathwayc              	   C   s&   t t t| jd }W 5 Q R X d S r,   )r7   r8   	TypeErrorr
   r%   r(   r9   r)   r)   r*   1test_invalid_constructor_pathway_not_pathway_base\   s    zCTestForceActuator.test_invalid_constructor_pathway_not_pathway_base property_name, fixture_attr_name)r%   r%   r&   r&   c              	   C   s>   t | j| j}t| |}tt t||| W 5 Q R X d S r,   )r
   r%   r&   getattrr7   r8   AttributeErrorsetattr)r(   property_namefixture_attr_namer5   valuer)   r)   r*   test_properties_are_immutable`   s    
z/TestForceActuator.test_properties_are_immutablec                 C   s&   t | j| j}d}t||ks"td S )Nz'ForceActuator(F, LinearPathway(pA, pB)))r
   r%   r&   reprr.   r(   actuatorexpectedr)   r)   r*   	test_reprm   s    zTestForceActuator.test_reprc                 C   sd   | j | jd| jj  t| j| j}| j| j | jj f| j | j| jj fg}| |ks`t	d S Nr0   )
r   set_posr   r$   xr
   r%   r&   to_loadsr.   rI   r)   r)   r*   test_to_loads_static_pathwayr   s    z.TestForceActuator.test_to_loads_static_pathwayc                 C   s   | j | jd| j | jj  t| j| j}| j| j | jt	| jd   | jj f| j | j| jt	| jd   | jj fg}|
 |kstd S rM   )r   rN   r   r    r$   rO   r
   r%   r&   r   rP   r.   rI   r)   r)   r*   test_to_loads_2D_pathway{   s    (&z*TestForceActuator.test_to_loads_2D_pathwayc                 C   s2  | j | j| j| jj | j| jj  d| j | jj	   t
| j| j}t| jd | jd  d| jd   }| j | j | jj | | j| j | jj |  d| j | j | jj	 |  }| j| j | jj | | j| j | jj |  d| j | j | jj	 |  }| j|f| j |fg}| |ks.td S )Nr0      )r   rN   r   r    r$   rO   r!   yr"   zr
   r%   r&   r   rP   r.   )r(   rJ   lengthZpO_forceZpI_forcerK   r)   r)   r*   test_to_loads_3D_pathway   s,    ,&z*TestForceActuator.test_to_loads_3D_pathway)__name__
__module____qualname__r7   fixturer+   r/   markparametrizer   Oner   r   r6   r:   r   r   r;   r>   rG   rL   rQ   rR   rW   r)   r)   r)   r*   r   &   sB   


&




		r   c                   @   s  e Zd Zejdddd Zdd Zdd Zej	d	d
e
jde
jeedd  fededde
jed eedd  fedede
je
jed eedd  fededededed eedd ed  fgdd Zej	dddgdd Zdd Zej	dddgdd Zej	ddddgdd  Zej	d!e
jd"fedd#fgd$d% Zd&d' ZdS )(TestLinearSpringTr   c                 C   sP   t d| _t d| _td| _td| _t| j| j| _td| _	t
d| _d S )Nklr   r   qr$   )r   	stiffnessra   r   r   r   r   r&   r   rb   r   r$   r'   r)   r)   r*   _linear_spring_fixture   s    




z'TestLinearSpring._linear_spring_fixturec                 C   s   t ttstd S r,   )r-   r   r
   r.   r'   r)   r)   r*   test_is_force_actuator_subclass   s    z0TestLinearSpring.test_is_force_actuator_subclassc                 C   s   t ttstd S r,   )r-   r   r   r.   r'   r)   r)   r*   r/      s    z/TestLinearSpring.test_is_actuator_base_subclasszUstiffness, expected_stiffness, equilibrium_length, expected_equilibrium_length, forcer#   r   rb   r0   r`   ra   c                 C   s   | j | j| j| jj  t|| j|}t|ts6t	t
|dsDt	t|jtsTt	|j|ksbt	t
|dspt	t|jtst	|j| jkst	t
|dst	t|jtst	|j|kst	t
|dst	t|jtst	|j|kst	d S )Nrc   r&   equilibrium_lengthr%   )r   rN   r   rb   r$   rO   r   r&   r1   r.   r2   rc   r3   r   rf   r%   )r(   rc   Zexpected_stiffnessrf   expected_equilibrium_lengthr%   springr)   r)   r*   test_valid_constructor   s    /z'TestLinearSpring.test_valid_constructorrc   Nc              	   C   s*   t t t|| j| j}W 5 Q R X d S r,   )r7   r8   r   r   r&   ra   )r(   rc   r9   r)   r)   r*   2test_invalid_constructor_stiffness_not_sympifyable   s    zCTestLinearSpring.test_invalid_constructor_stiffness_not_sympifyablec              	   C   s*   t t t| jd | j}W 5 Q R X d S r,   )r7   r8   r<   r   rc   ra   r=   r)   r)   r*   r>      s    zBTestLinearSpring.test_invalid_constructor_pathway_not_pathway_baserf   c              	   C   s*   t t t| j| j|}W 5 Q R X d S r,   )r7   r8   r   r   rc   r&   r(   rf   r9   r)   r)   r*   ;test_invalid_constructor_equilibrium_length_not_sympifyable   s    zLTestLinearSpring.test_invalid_constructor_equilibrium_length_not_sympifyabler?   )rc   rc   r@   )rf   ra   c              	   C   sB   t | j| j| j}t| |}tt t||| W 5 Q R X d S r,   )	r   rc   r&   ra   rA   r7   r8   rB   rC   )r(   rD   rE   rh   rF   r)   r)   r*   rG     s    	
z.TestLinearSpring.test_properties_are_immutableequilibrium_length, expectedz&LinearSpring(k, LinearPathway(pA, pB))z<LinearSpring(k, LinearPathway(pA, pB), equilibrium_length=l)c                 C   s>   | j | j| j| jj  t| j| j|}t	||ks:t
d S r,   )r   rN   r   rb   r$   rO   r   rc   r&   rH   r.   r(   rf   rK   rh   r)   r)   r*   rL     s    zTestLinearSpring.test_reprc           
      C   s   | j | j| j| jj  t| j| j| j	}| jt
| jd  | jj }| jt
| jd | j	  | }| j t
| jd | j	  | }t| j|t| j |g}| }t||D ]>\}\}}	t|tst|j|kst|j|	  dkstqd S )Nr0   r   )r   rN   r   rb   r$   rO   r   rc   r&   ra   r   r	   rP   zipr1   r.   pointvectorsimplify)
r(   rh   normalpA_forcepB_forcerK   loadsloadrp   rq   r)   r)   r*   test_to_loads   s     zTestLinearSpring.test_to_loads)rX   rY   rZ   r7   r[   rd   re   r/   r\   r]   r   r^   Zeror   r   r   ri   rj   r>   rl   rG   rL   rx   r)   r)   r)   r*   r_      sp   

	 '





r_   c                   @   s   e Zd Zejdddd Zdd Zdd Zd	d
 Zdd Z	ej
dddgdd Zdd Zej
dddgdd Zdd Zdd ZdS )TestLinearDamperTr   c                 C   sf   t d| _t d| _td| _td| _t| j| j| _td| _	tdd| _
td| _td| _d S )	Ncra   r   r   rb   r#   ur$   )r   dampingra   r   r   r   r   r&   r   rb   dqr|   r   r$   r'   r)   r)   r*   _linear_damper_fixture1  s    





z'TestLinearDamper._linear_damper_fixturec                 C   s   t ttstd S r,   )r-   r   r
   r.   r'   r)   r)   r*   re   =  s    z0TestLinearDamper.test_is_force_actuator_subclassc                 C   s   t ttstd S r,   )r-   r   r   r.   r'   r)   r)   r*   r/   @  s    z/TestLinearDamper.test_is_actuator_base_subclassc                 C   s   | j | j| j| jj  t| j| j}t	|ts6t
t|dsDt
t	|jtsTt
|j| jksdt
t|dsrt
t	|jtst
|j| jkst
d S )Nr}   r&   )r   rN   r   rb   r$   rO   r   r}   r&   r1   r.   r2   r3   r   )r(   damperr)   r)   r*   ri   C  s    z'TestLinearDamper.test_valid_constructorc                 C   sz   | j | j| j| jj  t| j| j}| j t	| jd  | j
 | j }t|dsXtt|jtsht|j|ksvtd S )Nr0   r%   )r   rN   r   rb   r$   rO   r   r}   r&   r   r~   r2   r.   r1   r%   r3   )r(   r   r4   r)   r)   r*   r6   Q  s    "z-TestLinearDamper.test_valid_constructor_forcer}   Nr{   c              	   C   s&   t t t|| j}W 5 Q R X d S r,   )r7   r8   r   r   r&   )r(   r}   r9   r)   r)   r*   0test_invalid_constructor_damping_not_sympifyableZ  s    zATestLinearDamper.test_invalid_constructor_damping_not_sympifyablec              	   C   s&   t t t| jd }W 5 Q R X d S r,   )r7   r8   r<   r   r}   r=   r)   r)   r*   r>   _  s    zBTestLinearDamper.test_invalid_constructor_pathway_not_pathway_baser?   )r}   r}   r@   c              	   C   s>   t | j| j}t| |}tt t||| W 5 Q R X d S r,   )r   r}   r&   rA   r7   r8   rB   rC   )r(   rD   rE   r   rF   r)   r)   r*   rG   c  s    
z.TestLinearDamper.test_properties_are_immutablec                 C   s@   | j | j| j| jj  t| j| j}d}t	||ks<t
d S )Nz&LinearDamper(c, LinearPathway(pA, pB)))r   rN   r   rb   r$   rO   r   r}   r&   rH   r.   )r(   r   rK   r)   r)   r*   rL   p  s    zTestLinearDamper.test_reprc                 C   s   | j | j| j| jj  t| j| j}| jd | jd  | jj }| j| j	 | }| j | j	 | }t
| j|t
| j |g}| |kstd S rM   )r   rN   r   rb   r$   rO   r   r}   r&   r~   r	   rP   r.   )r(   r   	directionrt   ru   rK   r)   r)   r*   rx   v  s    zTestLinearDamper.test_to_loads)rX   rY   rZ   r7   r[   r   re   r/   ri   r6   r\   r]   r   r>   rG   rL   rx   r)   r)   r)   r*   rz   /  s$   

	

rz   c                   @   s4   e Zd ZdZejdddd Zdd Zdd	 Zd
S )TestForcedMassSpringDamperModela  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                 C   s  t d| _t d| _t d| _t d| _td| _tdd| _td| _t	d| _
td	| _| j| j
d
 td| _| j| j| j| j
j  td| j| j| _t| j| j| _t| j
| jg| jg| j| j gd| _| jg| _t| jgg| _t| j| j| j  | j| j  gg| _d S )Nmr`   r{   r   rb   r#   r|   r$   ZpOr   r   mass)Zq_indZu_indZkd_eqs)r   r   r`   r{   r   r   rb   r~   r|   r   framer   originZset_vel
attachmentrN   rO   r   r   r   r&   r   kanes_methodbodiesr   mass_matrixforcingr'   r)   r)   r*   '_force_mass_spring_damper_model_fixture  s.    









zGTestForcedMassSpringDamperModel._force_mass_spring_damper_model_fixturec                 C   s   | j  | jj }t|| j}| j | jj }t|| j}| j| j| jj	 ff|
 |
 }| j| j| | jj| jks~t| jj| jkstd S r,   )r`   r&   rV   r
   r{   Zextension_velocityr   r   r   rO   rP   r   kanes_equationsr   r   r.   r   )r(   rc   rh   r}   r   rv   r)   r)   r*   test_force_acuator  s    z2TestForcedMassSpringDamperModel.test_force_acuatorc                 C   sx   t | j| j}t| j| j}| j| j| jj ff|	 |	 }| j
| j| | j
j| jksbt| j
j| jksttd S r,   )r   r`   r&   r   r{   r   r   r   rO   rP   r   r   r   r   r.   r   )r(   rh   r   rv   r)   r)   r*    test_linear_spring_linear_damper  s    z@TestForcedMassSpringDamperModel.test_linear_spring_linear_damperN)	rX   rY   rZ   __doc__r7   r[   r   r   r   r)   r)   r)   r*   r     s
   

r   c                	   @   s  e Zd Zejdddd Zdd Zejde	de
de	dd	 e	d gejd
ejejfeejfejefeefgdd Zejde	de
de	dd	 e	d gejdejegdd Zejdddgdd Zejde	de
dgdd Zejddedfeddfdedfeddfgdd Zejddddd gd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. ZdS )/TestTorqueActuatorTr   c                 C   sL   t d| _td| _td| _| jj| _td| jd| _td| jd| _	d S )NTr$   Ar   )r   r   )
r   torquer   r$   r   rU   axisr   r   r   r'   r)   r)   r*   _torque_actuator_fixture  s    



z+TestTorqueActuator._torque_actuator_fixturec                 C   s   t ttstd S r,   )r-   r   r   r.   r'   r)   r)   r*   r/     s    z1TestTorqueActuator.test_is_actuator_base_subclassr   r   r0   ztarget_frame, reaction_framec                 C   s   t || j||}t|t stt|ds,tt|jts<t|j|ksJtt|dsXtt|jtsht|j| jksxtt|dstt|jt	st|jt
jkstt|dstt|jt	st|jtjkstd S Nr   r   target_framereaction_frame)r   r   r1   r.   r2   r   r3   r   r   r   r   r   r   r   )r(   r   r   r   r5   r)   r)   r*   $test_valid_constructor_with_reaction  s&    z7TestTorqueActuator.test_valid_constructor_with_reactionr   c                 C   s   t || j|}t|t stt|ds*tt|jts:t|j|ksHtt|dsVtt|jtsft|j| jksvtt|dstt|jt	st|jt
jkstt|dst|jd kstd S r   )r   r   r1   r.   r2   r   r3   r   r   r   r   r   r   )r(   r   r   r5   r)   r)   r*   'test_valid_constructor_without_reaction  s    
z:TestTorqueActuator.test_valid_constructor_without_reactionNc              	   C   s*   t t t|| j| j}W 5 Q R X d S r,   )r7   r8   r   r   r   r   )r(   r   r9   r)   r)   r*   /test_invalid_constructor_torque_not_sympifyable+  s    zBTestTorqueActuator.test_invalid_constructor_torque_not_sympifyabler   ac              	   C   s.   t t t| j|| j| j}W 5 Q R X d S r,   )r7   r8   r<   r   r   r   r   )r(   r   r9   r)   r)   r*   (test_invalid_constructor_axis_not_vector0  s    z;TestTorqueActuator.test_invalid_constructor_axis_not_vectorframeschildparentc              	   C   s.   t t t| j| jf| }W 5 Q R X d S r,   )r7   r8   r<   r   r   r   )r(   r   r9   r)   r)   r*   )test_invalid_constructor_frames_not_frame5  s    
z<TestTorqueActuator.test_invalid_constructor_frames_not_framer?   )r   r   )r   r   )r   r   )r   r   c              	   C   sF   t | j| j| j| j}t| |}tt t	||| W 5 Q R X d S r,   )
r   r   r   r   r   rA   r7   r8   rB   rC   )r(   rD   rE   rJ   rF   r)   r)   r*   rG   B  s    

z0TestTorqueActuator.test_properties_are_immutablec                 C   s*   t | j| j| j}d}t||ks&td S )Nz+TorqueActuator(T, axis=N.z, target_frame=N))r   r   r   r   rH   r.   rI   r)   r)   r*   test_repr_without_reactionV  s    z-TestTorqueActuator.test_repr_without_reactionc                 C   s.   t | j| j| j| j}d}t||ks*td S )Nz=TorqueActuator(T, axis=N.z, target_frame=N, reaction_frame=A))r   r   r   r   r   rH   r.   rI   r)   r)   r*   test_repr_with_reaction[  s    z*TestTorqueActuator.test_repr_with_reactionc              	   C   s   t d| j| jtdtd| j| jd}t| j|}t	|tsBt
t|dsPt
t	|jts`t
|j| jkspt
t|ds~t
t	|jtst
|j| jkst
t|dst
t	|jtst
|j| jkst
t|dst
t	|jtst
|j| jkst
d S )	Npinrb   r|   )ZcoordinatesZspeedsZparent_interframeZ
joint_axisr   r   r   r   )r   r   r   r   r$   r   r   at_pin_jointr   r1   r.   r2   r3   r   r   r   r   r   )r(   Z	pin_jointr5   r)   r)   r*   test_at_pin_joint_constructore  s.    	z0TestTorqueActuator.test_at_pin_joint_constructorc              	   C   s,   t t t| jtd}W 5 Q R X d S )Nr   )r7   r8   r<   r   r   r   r   r=   r)   r)   r*   1test_at_pin_joint_pin_joint_not_pin_joint_invalid  s    zDTestTorqueActuator.test_at_pin_joint_pin_joint_not_pin_joint_invalidc                 C   s:   t | j| j| j}| j| j| j fg}| |ks6td S r,   )r   r   r   r   r$   rP   r.   rI   r)   r)   r*   test_to_loads_without_reaction  s    z1TestTorqueActuator.test_to_loads_without_reactionc                 C   sP   t | j| j| j| j}| j| j| j f| j| j | j fg}| |ksLtd S r,   )	r   r   r   r   r   r$   r   rP   r.   rI   r)   r)   r*   test_to_loads_with_reaction  s    z.TestTorqueActuator.test_to_loads_with_reaction)rX   rY   rZ   r7   r[   r   r/   r\   r]   r   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   r   r   r   r   r)   r)   r)   r*   r     sp   


	





	
	

r   c                   @   s   e Zd ZdS )NonSympifyableN)rX   rY   rZ   r)   r)   r)   r*   r     s   r   c                   @   s6  e Zd Zejdddd Zdd Zdd Zej	d	d
e
jd
e
jde
jeedd  eedd d  fededededde
jed eedd  edeedd d   fedededede
je
jed eedd  edeedd d   fededededededed eedd ed  edeedd ed d   fgdd Zej	dde gdd Zej	dde gdd Zdd Zej	dde gdd Zej	d d!d"d#d$gd%d& Zej	d'd(edd)fgd*d+ Zd,d- ZdS ).TestDuffingSpringTr   c                 C   sZ   t d| _t d| _t d| _td| _td| _t| j| j| _t	d| _
td| _d S )Nbetaalphara   r   r   rb   r$   )r   linear_stiffnessnonlinear_stiffnessrf   r   r   r   r   r&   r   rb   r   r$   r'   r)   r)   r*   _duffing_spring_fixture  s    





z)TestDuffingSpring._duffing_spring_fixturec                 C   s   t ttstd S r,   )r-   r   r
   r.   r'   r)   r)   r*   re     s    z1TestDuffingSpring.test_is_force_actuator_subclassc                 C   s   t ttstd S r,   )r-   r   r   r.   r'   r)   r)   r*   r/     s    z0TestDuffingSpring.test_is_actuator_base_subclasszlinear_stiffness,  expected_linear_stiffness,  nonlinear_stiffness,   expected_nonlinear_stiffness,  equilibrium_length,    expected_equilibrium_length,   forcer#   r   rb   r0      r   r   ra   c           	      C   s  | j | j| j| jj  t||| j|}t|ts8t	t
|dsFt	t|jtsVt	|j|ksdt	t
|dsrt	t|jtst	|j|kst	t
|dst	t|jtst	|j| jkst	t
|dst	t|jtst	|j|kst	t
|dst	t|jts
t	|j|kst	d S )Nr   r   r&   rf   r%   )r   rN   r   rb   r$   rO   r   r&   r1   r.   r2   r   r3   r   r   rf   r%   )	r(   r   Zexpected_linear_stiffnessr   Zexpected_nonlinear_stiffnessrf   rg   r%   rh   r)   r)   r*   ri     s$    ?z(TestDuffingSpring.test_valid_constructorr   Nc              	   C   s.   t t t|| j| j| j}W 5 Q R X d S r,   )r7   r8   r   r   r   r&   rf   )r(   r   r9   r)   r)   r*   9test_invalid_constructor_linear_stiffness_not_sympifyable  s    zKTestDuffingSpring.test_invalid_constructor_linear_stiffness_not_sympifyabler   c              	   C   s.   t t t| j|| j| j}W 5 Q R X d S r,   )r7   r8   r   r   r   r&   rf   )r(   r   r9   r)   r)   r*   <test_invalid_constructor_nonlinear_stiffness_not_sympifyable  s    zNTestDuffingSpring.test_invalid_constructor_nonlinear_stiffness_not_sympifyablec              	   C   s0   t t t| j| jt | j}W 5 Q R X d S r,   )r7   r8   r<   r   r   r   r   rf   r=   r)   r)   r*   r>     s    zCTestDuffingSpring.test_invalid_constructor_pathway_not_pathway_baserf   c              	   C   s.   t t t| j| j| j|}W 5 Q R X d S r,   )r7   r8   r   r   r   r   r&   rk   r)   r)   r*   rl     s    zMTestDuffingSpring.test_invalid_constructor_equilibrium_length_not_sympifyabler?   )r   r   )r   r   r@   )rf   rf   c              	   C   sB   t | j| j| j| j}tt t||t	| | W 5 Q R X d S r,   )
r   r   r   r&   rf   r7   r8   rB   rC   rA   )r(   rD   rE   rh   r)   r)   r*   rG     s    z/TestDuffingSpring.test_properties_are_immutablerm   )r   zGDuffingSpring(beta, alpha, LinearPathway(pA, pB), equilibrium_length=0)zGDuffingSpring(beta, alpha, LinearPathway(pA, pB), equilibrium_length=l)c                 C   s(   t | j| j| j|}t||ks$td S r,   )r   r   r   r&   rH   r.   rn   r)   r)   r*   rL   .  s    
zTestDuffingSpring.test_reprc              
   C   s"  | j | j| j| jj  t| j| j| j	| j
}| j| j
 }| j | | j|d   }t| j|| jj t| j | | jj g}| }t||D ]\}}|j|jkst| jD ]j}|j|}	|j|}
| jdtddtddtddi}|	|
 | }t|dk std| qqd S )Nr   r#   ra   r   r   g&.>z%The forces do not match. Difference: )r   rN   r   rb   r$   rO   r   r   r   r&   rf   r	   rP   ro   rp   r.   rq   dotr   subsZevalfr   )r(   rh   Zdisplacementr%   Zexpected_loadsZcalculated_loadsZ
calculatedrK   dimZcalculated_componentZexpected_componentZsubstitutionsdiffr)   r)   r*   rx   ;  s    *
"zTestDuffingSpring.test_to_loads)rX   rY   rZ   r7   r[   r   re   r/   r\   r]   r   r^   ry   r   r   r   ri   r   r   r   r>   rl   rG   rL   rx   r)   r)   r)   r*   r     s   


$
4
4
D5
#




	
r   )&r   r7   Zsympyr   r   r   r   r   r   Zsympy.physics.mechanicsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsympy.core.exprr   r3   r   r   r   r_   rz   r   r   r   r   r)   r)   r)   r*   <module>   s    Hv QR J