o
    *ήcp=                     @   s\  d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZmZmZ d dl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 d d	lmZmZm Z m!Z! d d
l"m#Z#m$Z$ edddgie%fdZ&edZ'eded de  d eZ(eeded  de  d eZ)eeed d eZ*eded eZ+eded de  d eZ,eddeZ-ede d ded   de  d ded  ded   d eZ.eded de e  d eZ/ee+eded eZ0ee*eeed eZ1e e(e)Z2e e(e)e*Z3dd Z4dd Z5d d! Z6d"d# Z7d$d% Z8d&d' Z9d(d) Z:d*d+ Z;d,d- Z<d.d/ Z=d0S )1    isclose)I)Dummy)Absarg)log)spa)import_module)pole_zero_numerical_datapole_zero_plotstep_response_numerical_datastep_response_plotimpulse_response_numerical_dataimpulse_response_plotramp_response_numerical_dataramp_response_plotbode_magnitude_numerical_databode_phase_numerical_data	bode_plot)TransferFunctionSeriesParallelTransferFunctionMatrix)raisesskip
matplotlibfromlistpyplot)import_kwargscatchnumpy      g      ?      
         	   g?      c                 C   s   t | t |fS N)tupler   b r2   U/tmp/pip-target-vg8gfxp4/lib/python/sympy/physics/control/tests/test_control_plots.py	_to_tuple(   s   r4   c                 C   s   t | |\} }t| dd | t| d t| d d   | dd   t|dd |t|d t|d d   |dd   fS )Nr   r%   r$   )r4   r/   lenr0   r2   r2   r3   _trim_tuple+   s   ::r7   c                    sJ   | \}}t ||\}}t fdd|D }tdd t||D S )zChecks whether the y-coordinate value of the plotted
    data point is equal to the value of the function at a
    particular x.c                 3   s    | ]} |V  qd S r.   r2   ).0x_i
evalf_funcsystemr2   r3   	<genexpr>6   s    z(y_coordinate_equality.<locals>.<genexpr>c                 s   s$    | ]\}}t || d k V  qdS )g:0yE>N)r   )r8   y_exp_iy_ir2   r2   r3   r=   7   s   " )r7   r/   allzip)plot_data_funcr;   r<   xyy_expr2   r:   r3   y_coordinate_equality0   s   rF   c                      s  t std tttgttggdtd d   ttfdd tt fdd tt fdd ttfdd ttfd	d tt fd
d tt fdd ttfdd ttfdd tt	td ttt
fdd tt
fdd tt
fdd tt
fdd tt
fdd tt
fdd tt
fdd tt
fdd tt
fdd tt
dd  tt
dd  tt
dd  tt
dd  tt
dd  tt
dd  d S )Nz"Matplotlib not the default backendr$   r%   c                         t  S r.   r   r2   tfmr2   r3   <lambda>A       ztest_errors.<locals>.<lambda>c                      rG   r.   r   r2   exprr2   r3   rK   B   rL   c                      rG   r.   r   r2   rN   r2   r3   rK   C   rL   c                      rG   r.   r   r2   rI   r2   r3   rK   D   rL   c                      rG   r.   r   r2   rI   r2   r3   rK   E   rL   c                      rG   r.   r   r2   rN   r2   r3   rK   F   rL   c                      rG   r.   r   r2   rN   r2   r3   rK   G   rL   c                      rG   r.   r   r2   rI   r2   r3   rK   H   rL   c                      rG   r.   r   r2   rI   r2   r3   rK   I   rL   c                      rG   r.   rH   r2   tf_ar2   r3   rK   M   rL   c                      rG   r.   rM   r2   rW   r2   r3   rK   N   rL   c                      rG   r.   rP   r2   rW   r2   r3   rK   O   rL   c                      rG   r.   rQ   r2   rW   r2   r3   rK   P   rL   c                      rG   r.   rR   r2   rW   r2   r3   rK   Q   rL   c                      rG   r.   rS   r2   rW   r2   r3   rK   R   rL   c                      rG   r.   rT   r2   rW   r2   r3   rK   S   rL   c                      rG   r.   rU   r2   rW   r2   r3   rK   T   rL   c                      rG   r.   rV   r2   rW   r2   r3   rK   U   rL   c                   S      t tddS )Nlower_limit)r   tf1r2   r2   r2   r3   rK   X       c                   S   rY   )N皙r[   )r   r]   r2   r2   r2   r3   rK   Y   r^   c                   S   rY   )NgUUUUUUr[   r   r]   r2   r2   r2   r3   rK   Z   r^   c                   S   rY   )Nr_   )sloper`   r2   r2   r2   r3   rK   ]   r^   c                   S   rY   )Nhz)	freq_unitr   r]   r2   r2   r2   r3   rK   `   r^   c                   S   rY   )Ndegree)
phase_unitrd   r2   r2   r2   r3   rK   a   r^   )r   r   r   tf6tf5r	   r   NotImplementedErrorr   r   
ValueErrorr2   r2   )rO   rX   rJ   r3   test_errors:   s:   rk   c                  C   s   t std dd } g ddgg}dgddgg}dgg d	g}g g d
g}g dg dg}g ddgg}| t|s9J | t|s@J | t|sGJ | t|sNJ | t|sUJ | t|s\J d S )NNumPy is required for this testc                 S   s4   t | \}}t||d }t||d }|o|S )Nr   r$   )r   r#   allclose)sysexpected_valuezr
   z_checkp_checkr2   r2   r3   	pz_testerh   s   z!test_pole_zero.<locals>.pz_testeryϿhdE?yϿhdE        y      п4?y      п4Կ)y     ࿲LXz?y     ࿲LXzy?        )g      @rt   rt   rt   )gv|?g     g8hֿ)yϿhdE?yϿhdEyϿ4?yϿ4ԿyZEf;]yJu3;]@)r#   r   r]   tf2tf3ser1par1tf8)rs   exp1exp2exp3exp4exp5exp6r2   r2   r3   test_pole_zerod   s&   r   c                     sj   t std dd dd   fdd} | tsJ | ts!J | ts'J | ts-J | ts3J d S )Nrl   c                 S   s>   |   }tddd}|| jt| i}t|||i S )NwTreal)to_exprr   subsvarr   r   evalfr<   pointrO   _ww_exprr2   r2   r3   bode_phase_evalf   s   z#test_bode.<locals>.bode_phase_evalfc                 S   sH   |   }tddd}|| jt| i}dtt|d||i  S )Nr   Tr      r(   )r   r   r   r   r   r   r   r   r   r2   r2   r3   bode_mag_evalf   s    z!test_bode.<locals>.bode_mag_evalfc                    s   t t | ot t| S r.   )rF   r   r   )rn   r   r   r2   r3   test_bode_data   s   
z!test_bode.<locals>.test_bode_data)r#   r   r]   ru   rv   tf4rh   )r   r2   r   r3   	test_bode   s   r   c                 C   s   t dd t| |D S )Nc                 s   s"    | ]\}}t ||d dV  qdS )gdy=)rel_tolNr   )r8   a_ib_ir2   r2   r3   r=      s    z'check_point_accuracy.<locals>.<genexpr>)r@   rA   r0   r2   r2   r3   check_point_accuracy   s   r   c                  C   s   t std dd } d}d}d}d}d}d	}d
}| t|sJ | t|s&J | t|s-J | t|s4J | t|s;J | t|sBJ | t|sIJ d S )Nrl   c                 S   :   t t| ddd \}}t||d }t||d }|o|S NFr(   )adaptivenb_of_pointsr   r$   )r4   r   r   rn   ro   rC   rD   x_checky_checkr2   r2   r3   impulse_res_tester      z1test_impulse_response.<locals>.impulse_res_tester)
rt   grq?grq@g
@grq@g88@g@gqq@grq!@      $@)
rt   gϡ(h?g j?gyӿgTHfg'?g*Vrv?g>ﹿg)c gkz?)r   )
gvWUU?gV!y?g7?gfꦎgJIPgWMJĤg"Gga6ߞgiރgP=))r   )
g   2>g?gxL#V
@gĮU"@g^<@gTU@g|/u^p@gjD#;݈@gi@gNU(@)r   )
rt   gf@gf8@gsqK@gfX@gOEJc@gsqk@gr@gfx@g     @@)r   )
rt   gٵ:/ĺgy%L?g2ƜgGLK&ы?gybŔugΕ_?g-~HFgof.?g&;)r   )
g   `n9g&l?gqɔ
@g(w\=(@gl%)k9@g+<Z=@glއ~>gLqggf}L)r   )
rt   g6qD2@g7մ@gO/ߡ 5AgsYAgzC5Bgl̹˵BgC/6CgJ@Cg"-|6D)	r#   r   r]   ru   rv   r   rh   tf7rw   )r   rz   r{   r|   r}   r~   r   exp7r2   r2   r3   test_impulse_response   s"   r   c                  C   s   t std dd } d}d}d}d}d}d	}| t|sJ | t|s$J | t|s+J | t|s2J | t|s9J | t|s@J d S )
Nrl   c                 S   r   r   )r4   r   r   r   r2   r2   r3   step_res_tester   r   z+test_step_response.<locals>.step_res_tester)r   )
g   jϛTgڴW?g?gg	?gM?g#J?g"@te?g ?g/P?gc?)r   )
rt   gRul?gql?g."aG?g?gb?gVߴ?g-b[S?g7 ގ?g\7' m)r   )
rt   gNw4?gh&7|@g."@gs<@gHvU@grnT^p@gh%݈@gs@g{ct'@)r   )
rt   gۍ^6J@gۍ^6J2@gb<N@gۍ^6Jb@gVJyq@gb<~@go@gۍ^6J@gg
@)r   )
g   .1gъQ?gUZ?gup?grBz?g5k?g뎸?g(%
- ?gj?g9U ?)r   )
g   ΃g
V?g}{?g.cRz	@g į"^"@gy;+<@gNU@g@ lp@g&O-@gN2q@)r#   r   r]   ru   rv   r   rh   ser2)r   rz   r{   r|   r}   r~   r   r2   r2   r3   test_step_response   s   r   c                  C   s   t std ddd} d}d}d}d}d	}d
}| td|sJ | td|ds(J | td|ds1J | td|ds:J | td|dsCJ | td|sKJ d S )Nrl   r$   c                 S   s<   t t| |d|d \}}t||d }t||d }|o|S )NF)ra   r   r   r   r$   )r4   r   r   )rn   
num_pointsro   ra   rC   rD   r   r   r2   r2   r3   ramp_res_tester	  s   z+test_ramp_response.<locals>.ramp_res_tester))rt   g       @g      @g      @g       @r   )rt   g+^p?g C?gmX]@gBOBa@gNʡf@)r   )
g   (Z>gr?g8g((?go!(?gي2?gz$Y?gxMw?g5^)?gv]?gǓ?)r   )
g   WegD/l3?g@g7CЃ(@g!%8D@glZ_@gR×vx@gJ̳ @gs;4O@gk<0݁@)r   )
rt   g?{?g?{>@gQEJc@g?{~@g(|R@gQEJ@g`ޱ@g?{@g     j@)r   )
rt   ggGS@gU-XH"@gEBT1,@gޝn3@gzj8@gS\=@g}A@g5jهǌC@g>6F@)r   r   r&   r(   g333333?g      ?r'   r+   )r$   )r#   r   r]   ru   rv   r   rh   rg   )r   rz   r{   r|   r}   r~   r   r2   r2   r3   test_ramp_response  s   
r   N)>mathr   sympy.core.numbersr   sympy.core.symbolr   $sympy.functions.elementary.complexesr   r   &sympy.functions.elementary.exponentialr   	sympy.abcr	   r
   r   sympy.externalr   #sympy.physics.control.control_plotsr   r   r   r   r   r   r   r   r   r   r   sympy.physics.control.ltir   r   r   r   sympy.testing.pytestr   r   RuntimeErrorr   r#   r]   ru   rv   r   rh   rg   r   ry   rw   r   rx   par2r4   r7   rF   rk   r   r   r   r   r   r   r2   r2   r2   r3   <module>   sJ    4
 D 

*30