o
    GZhB                     @   s  d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	 d dl
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 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# 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Z0e%eed d eZ1e%ded eZ2e%ded de  d eZ3e%ddeZ4e%de d ded   de  d ded  ded   d eZ5e%ded de e  d eZ6e&e2e%ded eZ7e&e1e%eed eZ8e'e/e0Z9dd Z:d d! Z;d"d# Z<d$d% Z=d&d' Z>d(d) Z?d*d+ Z@d,d- ZAd.d/ ZBd0d1 ZCd2d3 ZDd4d5 ZEd6S )7    isclose)I	all_close)Dummy)Absarg)log)sqrt)spa)pi)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nyquist_plot_exprnichols_plot_expr)TransferFunctionSeriesParallelTransferFunctionMatrix)raisesskip
matplotlibfromlistZpyplot)Zimport_kwargsZcatchnumpy            ?      
         	   皙?      c                 C   s   t | t |fS N)tupler   b r6   ]/var/www/auris/lib/python3.10/site-packages/sympy/physics/control/tests/test_control_plots.py	_to_tuple+   s   r8   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&   )r8   r3   lenr4   r6   r6   r7   _trim_tuple.   s   ::r;   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 r2   r6   ).0Zx_i
evalf_funcsystemr6   r7   	<genexpr>9   s    z(y_coordinate_equality.<locals>.<genexpr>c                 s   s$    | ]\}}t || d k V  qdS )g:0yE>N)r   )r<   Zy_exp_iZy_ir6   r6   r7   r@   :   s   " )r;   r3   allzip)Zplot_data_funcr>   r?   xyZy_expr6   r=   r7   y_coordinate_equality3   s   rE   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 r2   r   r6   tfmr6   r7   <lambda>D       ztest_errors.<locals>.<lambda>c                      rF   r2   r   r6   exprr6   r7   rJ   E   rK   c                      rF   r2   r   r6   rM   r6   r7   rJ   F   rK   c                      rF   r2   r   r6   rH   r6   r7   rJ   G   rK   c                      rF   r2   r   r6   rH   r6   r7   rJ   H   rK   c                      rF   r2   r   r6   rM   r6   r7   rJ   I   rK   c                      rF   r2   r   r6   rM   r6   r7   rJ   J   rK   c                      rF   r2   r   r6   rH   r6   r7   rJ   K   rK   c                      rF   r2   r   r6   rH   r6   r7   rJ   L   rK   c                      rF   r2   rG   r6   tf_ar6   r7   rJ   P   rK   c                      rF   r2   rL   r6   rV   r6   r7   rJ   Q   rK   c                      rF   r2   rO   r6   rV   r6   r7   rJ   R   rK   c                      rF   r2   rP   r6   rV   r6   r7   rJ   S   rK   c                      rF   r2   rQ   r6   rV   r6   r7   rJ   T   rK   c                      rF   r2   rR   r6   rV   r6   r7   rJ   U   rK   c                      rF   r2   rS   r6   rV   r6   r7   rJ   V   rK   c                      rF   r2   rT   r6   rV   r6   r7   rJ   W   rK   c                      rF   r2   rU   r6   rV   r6   r7   rJ   X   rK   c                   S      t tddS )NZlower_limit)r   tf1r6   r6   r6   r7   rJ   [       c                   S   rX   )N皙rZ   )r   r[   r6   r6   r6   r7   rJ   \   r\   c                   S   rX   )NgUUUUUUrZ   r   r[   r6   r6   r6   r7   rJ   ]   r\   c                   S   rX   )Nr]   )sloper^   r6   r6   r6   r7   rJ   `   r\   c                   S   rX   )Nhz)Z	freq_unitr   r[   r6   r6   r6   r7   rJ   c   r\   c                   S   rX   )NZdegree)Z
phase_unitra   r6   r6   r6   r7   rJ   d   r\   )r#   r"   r    tf6tf5r   r!   NotImplementedErrorr   r   
ValueErrorr6   r6   )rN   rW   rI   r7   test_errors=   s:   rf   c                  C   s   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 |s3J | t|s:J | t|sAJ | t|sHJ | t|sOJ | t|sVJ d S )Nc                 S   s0   t | \}}t||d }t||d }|o|S )Nr   r&   )r   r   )sysexpected_valueZ_z_pZz_checkZp_checkr6   r6   r7   	pz_testeri   s   z!test_pole_zero.<locals>.pz_testeryϿhdEyϿhdE?        y      п4Կy      п4?)y?        y     ࿲LXzy     ࿲LXz?)rk   rk   rk   g      @)gv|?g     g8hֿ)yϿ4ԿyϿ4?yϿhdEyϿhdE?yZEf;]yJu3;]@)r[   tf2tf3ser1par1tf8)rj   exp1exp2exp3exp4exp5exp6r6   r6   r7   test_pole_zerog   s"   rw   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 )NNumPy is required for this testc                 S   s>   |   }tddd}|| jt| i}t|||i S )NwTreal)to_exprr   subsvarr   r   evalfr?   pointrN   _wZw_exprr6   r6   r7   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 )Nry   Trz      r+   )r|   r   r}   r~   r   r	   r   r   r   r6   r6   r7   bode_mag_evalf   s    z!test_bode.<locals>.bode_mag_evalfc                    s   t t | ot t| S r2   )rE   r   r   )rg   r   r   r6   r7   test_bode_data   s   
z!test_bode.<locals>.test_bode_data)r%   r"   r[   rl   rm   tf4rc   )r   r6   r   r7   	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   )r<   _r6   r6   r7   r@      s    z'check_point_accuracy.<locals>.<genexpr>)rA   rB   r4   r6   r6   r7   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 )Nrx   c                 S   :   t t| ddd \}}t||d }t||d }|o|S NFr+   )adaptivenr   r&   )r8   r   r   rg   rh   rC   rD   x_checky_checkr6   r6   r7   impulse_res_tester      z1test_impulse_response.<locals>.impulse_res_tester)
rk   grq?grq@g
@grq@g88@g@gqq@grq!@      $@)
rk   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   )
rk   gf@gf8@gsqK@gfX@gOEJc@gsqk@gr@gfx@g     @@)r   )
rk   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   )
rk   g6qD2@g7մ@gO/ߡ 5AgsYAgzC5Bgl̹˵BgC/6CgJ@Cg"-|6D)	r%   r"   r[   rl   rm   r   rc   tf7rn   )r   rq   rr   rs   rt   ru   rv   Zexp7r6   r6   r7   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 )
Nrx   c                 S   r   r   )r8   r   r   r   r6   r6   r7   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   )
rk   gRul?gql?g."aG?g?gb?gVߴ?g-b[S?g7 ގ?g\7' m)r   )
rk   gNw4?gh&7|@g."@gs<@gHvU@grnT^p@gh%݈@gs@g{ct'@)r   )
rk   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[   rl   rm   r   rc   ser2)r   rq   rr   rs   rt   ru   rv   r6   r6   r7   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 )Nrx   r&   c                 S   s<   t t| |d|d \}}t||d }t||d }|o|S )NF)r_   r   r   r   r&   )r8   r   r   )rg   Z
num_pointsrh   r_   rC   rD   r   r   r6   r6   r7   ramp_res_tester  s   z+test_ramp_response.<locals>.ramp_res_tester))rk   g       @g      @g      @g       @r   )rk   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   )
rk   g?{?g?{>@gQEJc@g?{~@g(|R@gQEJ@g`ޱ@g?{@g     j@)r   )
rk   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[   rl   rm   r   rc   rb   )r   rq   rr   rs   rt   ru   rv   r6   r6   r7   test_ramp_response  s   
r   c                  C   s`  t t\} }}t t\}}}t t\}}}t t\}	}
}| d|d  d|d  d|d  d   ks4J |d| d|d  d|d  d   ksJJ |d|d  d|d  dd|d   d   ksdJ ||dd|d    d|d  dd|d   d   ksJ ||d  |d d  ksJ || |d d  ksJ |	d	ksJ |
d
|d  ksJ d S )Nr'   g      ?g      r*   r.   r&   r)   r-   r   r+   )r   r[   rl   rm   r   )r1i1w1r2i2w2Zr3Zi3w3Zr4i4w4r6   r6   r7   test_nyquist_plot_expr1  s   0,4<r   c               	   C   s  t t\} }}t t\}}}t t\}}}t t\}	}
}| dtdt|d d|d   d   td ks8J |dtd|d  d| t  d   t	 ksQJ |dtt
|td	|d  d
|d   d   td ksqJ |dt|t d|d  d
| t  d   t	 ksJ |dtt
|t|d d   td ksJ |dt| t |d
 t d   t	 ksJ |	dtd|d t
|   td ksJ |
dtt|d
   t	 ksJ d S )Nr   r&   r-   g      @r'   r+      r(   $   r*   ir)   )r   r[   rl   rm   r   r	   r
   r   r   r   r   )m1p1r   m2p2r   Zm3Zp3r   Zm4Zp4r   r6   r6   r7   test_nichols_expr@  s   82@80.,$r   N)Fmathr   Zsympy.core.numbersr   r   Zsympy.core.symbolr   Z$sympy.functions.elementary.complexesr   r   Z&sympy.functions.elementary.exponentialr	   Z(sympy.functions.elementary.miscellaneousr
   Z	sympy.abcr   r   r   Zsympyr   Zsympy.externalr   Z#sympy.physics.control.control_plotsr   r   r   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%   r[   rl   rm   r   rc   rb   r   rp   rn   r   ro   r8   r;   rE   rf   rw   r   r   r   r   r   r   r   r6   r6   r6   r7   <module>   sP    <
 D 

*30*