U
    L?h.=                     @   sP  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)Z2dd Z3dd Z4d d! Z5d"d# Z6d$d% Z7d&d' Z8d(d) Z9d*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fromlistZpyplot)Zimport_kwargsZcatchnumpy      g      ?      
         	   皙?      c                 C   s   t | t |fS N)tupler   b r0   `/var/www/html/venv/lib/python3.8/site-packages/sympy/physics/control/tests/test_control_plots.py	_to_tuple'   s    r2   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!   )r2   r-   lenr.   r0   r0   r1   _trim_tuple*   s    ::r5   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,   r0   ).0Zx_i
evalf_funcsystemr0   r1   	<genexpr>5   s     z(y_coordinate_equality.<locals>.<genexpr>c                 s   s"   | ]\}}t || d k V  qdS )g:0yE>N)r   )r6   Zy_exp_iZy_ir0   r0   r1   r:   6   s     )r5   r-   allzip)Zplot_data_funcr8   r9   xyZy_expr0   r7   r1   y_coordinate_equality/   s    r?   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                      s   t  S r,   r   r0   tfmr0   r1   <lambda>@       ztest_errors.<locals>.<lambda>c                      s   t  S r,   r   r0   exprr0   r1   rC   A   rD   c                      s   t  S r,   r   r0   rF   r0   r1   rC   B   rD   c                      s   t  S r,   r   r0   rA   r0   r1   rC   C   rD   c                      s   t  S r,   r   r0   rA   r0   r1   rC   D   rD   c                      s   t  S r,   r   r0   rF   r0   r1   rC   E   rD   c                      s   t  S r,   r   r0   rF   r0   r1   rC   F   rD   c                      s   t  S r,   r   r0   rA   r0   r1   rC   G   rD   c                      s   t  S r,   r   r0   rA   r0   r1   rC   H   rD   c                      s   t  S r,   r@   r0   tf_ar0   r1   rC   L   rD   c                      s   t  S r,   rE   r0   rO   r0   r1   rC   M   rD   c                      s   t  S r,   rH   r0   rO   r0   r1   rC   N   rD   c                      s   t  S r,   rI   r0   rO   r0   r1   rC   O   rD   c                      s   t  S r,   rJ   r0   rO   r0   r1   rC   P   rD   c                      s   t  S r,   rK   r0   rO   r0   r1   rC   Q   rD   c                      s   t  S r,   rL   r0   rO   r0   r1   rC   R   rD   c                      s   t  S r,   rM   r0   rO   r0   r1   rC   S   rD   c                      s   t  S r,   rN   r0   rO   r0   r1   rC   T   rD   c                   S   s   t tddS )NZlower_limit)r   tf1r0   r0   r0   r1   rC   W   rD   c                   S   s   t tddS )N皙rR   )r   rS   r0   r0   r0   r1   rC   X   rD   c                   S   s   t tddS )NgUUUUUUrR   r   rS   r0   r0   r0   r1   rC   Y   rD   c                   S   s   t tddS )NrT   )sloperU   r0   r0   r0   r1   rC   \   rD   c                   S   s   t tddS )Nhz)Z	freq_unitr   rS   r0   r0   r0   r1   rC   _   rD   c                   S   s   t tddS )NZdegree)Z
phase_unitrX   r0   r0   r0   r1   rC   `   rD   )r   r   r   tf6tf5r	   r   NotImplementedErrorr   r   
ValueErrorr0   r0   )rG   rP   rB   r1   test_errors9   s:    r]   c                  C   s   t std dd } g ddgg}dgddgg}dgd	d
dgg}g ddddgg}dddgddddgg}g ddgg}| t|s~t| t|st| t|st| t|st| t|st| t|std S )NNumPy is required for this testc                 S   s4   t | \}}t||d }t||d }|o2|S )Nr   r!   )r   r    Zallclose)sysexpected_valuezr
   Zz_checkZp_checkr0   r0   r1   	pz_testerg   s    z!test_pole_zero.<locals>.pz_testeryϿhdE?yϿhdE        y      п4?y      п4Կy     ࿲LXz?y     ࿲LXzy?        g      @gv|?g     g8hֿyϿhdE?yϿhdEyϿ4?yϿ4ԿyZEf;]yJu3;]@)	r    r   rS   AssertionErrortf2tf3ser1par1tf8)rb   exp1exp2exp3exp4exp5exp6r0   r0   r1   test_pole_zeroc   s4      rp   c                     sj   t std dd dd   fdd} | ts6t| tsBt| tsNt| tsZt| tsftd S )Nr^   c                 S   s>   |   }tddd}|| jt| i}t|||i S )NwTreal)to_exprr   subsvarr   r   evalfr9   pointrG   _wZw_exprr0   r0   r1   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 )Nrq   Trr      r%   )rt   r   ru   rv   r   r   r   rw   rx   r0   r0   r1   bode_mag_evalf   s    z!test_bode.<locals>.bode_mag_evalfc                    s   t t | ot t| S r,   )r?   r   r   )r_   r}   r{   r0   r1   test_bode_data   s    
z!test_bode.<locals>.test_bode_data)r    r   rS   rd   re   rf   tf4rZ   )r   r0   r~   r1   	test_bode   s    r   c                 C   s   t dd t| |D S )Nc                 s   s   | ]}t |d ddV  qdS )r)   gư>)Zrel_tolZabs_tolNr   )r6   _r0   r0   r1   r:      s   z'check_point_accuracy.<locals>.<genexpr>)r;   r<   r.   r0   r0   r1   check_point_accuracy   s    r   c                  C   s   t std dd } d}d}d}d}d}d	}d
}| t|s>t| t|sLt| t|sZt| t|sht| t|svt| t|st| t	|std S )Nr^   c                 S   s:   t t| ddd \}}t||d }t||d }|o8|S NFr%   )adaptivenr   r!   )r2   r   r   r_   r`   r=   r>   x_checky_checkr0   r0   r1   impulse_res_tester   s     z1test_impulse_response.<locals>.impulse_res_tester)
rc   grq?grq@g
@grq@g88@g@gqq@grq!@      $@)
rc   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   )
rc   gf@gf8@gsqK@gfX@gOEJc@gsqk@gr@gfx@g     @@)r   )
rc   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   )
rc   g6qD2@g7մ@gO/ߡ 5AgsYAgzC5Bgl̹˵BgC/6CgJ@Cg"-|6D)
r    r   rS   rd   re   rf   r   rZ   tf7rg   )r   rj   rk   rl   rm   rn   ro   Zexp7r0   r0   r1   test_impulse_response   s"    r   c                  C   s   t std dd } d}d}d}d}d}d	}| t|s:t| t|sHt| t|sVt| t|sdt| t|srt| t|std S )
Nr^   c                 S   s:   t t| ddd \}}t||d }t||d }|o8|S r   )r2   r   r   r   r0   r0   r1   step_res_tester   s     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   )
rc   gRul?gql?g."aG?g?gb?gVߴ?g-b[S?g7 ގ?g\7' m)r   )
rc   gNw4?gh&7|@g."@gs<@gHvU@grnT^p@gh%݈@gs@g{ct'@)r   )
rc   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   rS   rd   re   rf   r   rZ   ser2)r   rj   rk   rl   rm   rn   ro   r0   r0   r1   test_step_response   s    r   c                  C   s   t std ddd} d}d}d}d}d	}d
}| td|s>t| td|dsPt| td|dsbt| td|dstt| td|dst| td|std S )Nr^   r!   c                 S   s<   t t| |d|d \}}t||d }t||d }|o:|S )NF)rV   r   r   r   r!   )r2   r   r   )r_   Z
num_pointsr`   rV   r=   r>   r   r   r0   r0   r1   ramp_res_tester  s      z+test_ramp_response.<locals>.ramp_res_tester))rc   g       @g      @g      @g       @r   )rc   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   )
rc   g?{?g?{>@gQEJc@g?{~@g(|R@gQEJ@g`ޱ@g?{@g     j@)r   )
rc   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   rS   rd   re   rf   r   rZ   rY   )r   rj   rk   rl   rm   rn   ro   r0   r0   r1   test_ramp_response  s    
r   N)=mathr   Zsympy.core.numbersr   Zsympy.core.symbolr   Z$sympy.functions.elementary.complexesr   r   Z&sympy.functions.elementary.exponentialr   Z	sympy.abcr	   r
   r   Zsympy.externalr   Z#sympy.physics.control.control_plotsr   r   r   r   r   r   r   r   r   r   r   Zsympy.physics.control.ltir   r   r   r   Zsympy.testing.pytestr   r   RuntimeErrorr   r    rS   re   rf   r   rZ   rY   r   ri   rg   r   rh   r2   r5   r?   r]   rp   r   r   r   r   r   r0   r0   r0   r1   <module>   sH   4  D 

*30