
    MZdp=                        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      Z& ed      Z' ededz  dez  z   dz   e      Z( eededz  z  dez  z   dz   e      Z) eeedz  dz
  e      Z* ededz  e      Z+ ededz  dez  z   dz   e      Z, edde      Z- edez  dz  dedz  z  z   dez  z   dz   dedz  z  dedz  z  z   dz   e      Z. ededz  dez   ez  z   dz   e      Z/ ee+ ededz
  e            Z0 ee* eeedz   e            Z1 e e(e)      Z2 e e(e)e*      Z3d Z4d Z5d Z6d Z7d  Z8d! Z9d" Z:d# Z;d$ Z<d% Z=y&)'    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                 .    t        |       t        |      fS N)tupler   bs     P/usr/lib/python3/dist-packages/sympy/physics/control/tests/test_control_plots.py	_to_tupler5   (   s    8U1X    c           	          t        | |      \  } }t        | dd | t        |       dz  t        |       dz  dz    z   | dd  z         t        |dd |t        |      dz  t        |      dz  dz    z   |dd  z         fS )Nr   r&   r%   )r5   r1   lenr2   s     r4   _trim_tupler:   +   s    Q?DAq1a1SVQYQQ77!BC&@Aa1g#a&!)c!fai!m44qv=>? ?r6   c                      |       \  }}t        ||      \  }}t        fd|D              }t        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   0   K   | ]  } |        y wr0    ).0x_i
evalf_funcsystems     r4   	<genexpr>z(y_coordinate_equality.<locals>.<genexpr>6   s     7c*VS)7s   c              3   D   K   | ]  \  }}t        ||z
        d k    yw)g:0yE>N)r   )r>   y_exp_iy_is      r4   rB   z(y_coordinate_equality.<locals>.<genexpr>7   s"     K\Wcs7S=!D(Ks    )r:   r1   allzip)plot_data_funcr@   rA   xyy_exps    ``   r4   y_coordinate_equalityrL   0   sJ     &!DAqq!DAq7Q77EKS]KKKr6   c                  <    t         st        d       t        t        t        gt        t        gg      dt
        dz  dz
  z   t        t        fd       t        t         fd       t        t         fd       t        t        fd       t        t        fd       t        t         fd	       t        t         fd
       t        t        fd       t        t        fd       t        t        t
        dz   t
              t        t        fd       t        t        fd       t        t        fd       t        t        fd       t        t        fd       t        t        fd       t        t        fd       t        t        fd       t        t        fd       t        t        d        t        t        d        t        t        d        t        t        d        t        t        d        t        t        d        y )Nz"Matplotlib not the default backendr%   r&   c                      t               S r0   r   tfms   r4   <lambda>ztest_errors.<locals>.<lambda>A   s    s(; r6   c                      t               S r0   r   exprs   r4   rR   ztest_errors.<locals>.<lambda>B   s    (@(F r6   c                      t               S r0   r   rU   s   r4   rR   ztest_errors.<locals>.<lambda>C   s    (=d(C r6   c                      t               S r0   r   rP   s   r4   rR   ztest_errors.<locals>.<lambda>D   s    (G(L r6   c                      t               S r0   r   rP   s   r4   rR   ztest_errors.<locals>.<lambda>E   s    (:3(? r6   c                      t               S r0   r   rU   s   r4   rR   ztest_errors.<locals>.<lambda>F   s    (DT(J r6   c                      t               S r0   r   rU   s   r4   rR   ztest_errors.<locals>.<lambda>G   s    (:4(@ r6   c                      t               S r0   r   rP   s   r4   rR   ztest_errors.<locals>.<lambda>H   s    (DS(I r6   c                      t               S r0   r   rP   s   r4   rR   ztest_errors.<locals>.<lambda>I   s    	# r6   c                      t               S r0   rO   tf_as   r4   rR   ztest_errors.<locals>.<lambda>M   s    ~d3 r6   c                      t               S r0   rT   rf   s   r4   rR   ztest_errors.<locals>.<lambda>N   s    7= r6   c                      t               S r0   rX   rf   s   r4   rR   ztest_errors.<locals>.<lambda>O   s    4T: r6   c                      t               S r0   rZ   rf   s   r4   rR   ztest_errors.<locals>.<lambda>P   s    >tD r6   c                      t               S r0   r\   rf   s   r4   rR   ztest_errors.<locals>.<lambda>Q       1$7 r6   c                      t               S r0   r^   rf   s   r4   rR   ztest_errors.<locals>.<lambda>R       ;DA r6   c                      t               S r0   r`   rf   s   r4   rR   ztest_errors.<locals>.<lambda>S   rl   r6   c                      t               S r0   rb   rf   s   r4   rR   ztest_errors.<locals>.<lambda>T   rn   r6   c                      t               S r0   rd   rf   s   r4   rR   ztest_errors.<locals>.<lambda>U   s    y r6   c                  $    t        t        d      S )Nlower_limit)r   tf1r=   r6   r4   rR   ztest_errors.<locals>.<lambda>X   s    4SbI r6   c                  $    t        t        d      S )N皙rt   )r   rv   r=   r6   r4   rR   ztest_errors.<locals>.<lambda>Y       1#4H r6   c                  $    t        t        d      S )NgUUUUUUrt   r   rv   r=   r6   r4   rR   ztest_errors.<locals>.<lambda>Z   ry   r6   c                  $    t        t        d      S )Nrx   )sloper{   r=   r6   r4   rR   ztest_errors.<locals>.<lambda>]   s    1#TB r6   c                  $    t        t        d      S )Nhz)	freq_unitr   rv   r=   r6   r4   rR   ztest_errors.<locals>.<lambda>`   s    y> r6   c                  $    t        t        d      S )Ndegree)
phase_unitr   r=   r6   r4   rR   ztest_errors.<locals>.<lambda>a   s    y(C r6   )r   r   r   tf6tf5r
   r   NotImplementedErrorr   r   
ValueError)rV   rg   rQ   s   @@@r4   test_errorsr   :   sd   12 !3*sCj!9
:CadQh<D
 ;<
 FG
 CD
 LM
 ?@
 JK
 @A
 IJ
 67 Aq1ua(D
:34
:=>
::;
:DE
:78
:AB
:78
:AB
:./ :IJ
:HI
:HI :BC :>?
:CDr6   c                  0   t         st        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        |      sJ  | t        |      sJ  | t        |      sJ  | t
        |      sJ  | t        |      sJ  | t        |      sJ y )NNumPy is required for this testc                     t        |       \  }}t        j                  ||d         }t        j                  ||d         }|xr |S )Nr   r%   )r   r$   allclose)sysexpected_valuezr   z_checkp_checks         r4   	pz_testerz!test_pole_zero.<locals>.pz_testerh   sE    ',1..N1$56..N1$56"7"r6   yϿhdE?yϿhdE        y      п4?y      п4Կ)y     ࿲LXz?y     ࿲LXzy?        )g      @r   r   r   )gv|?g     g8hֿ)yϿhdE?yϿhdEyϿ4?yϿ4ԿyZEf;]yJu3;]@)r$   r   rv   tf2tf3ser1par1tf8)r   exp1exp2exp3exp4exp5exp6s          r4   test_pole_zeror   d   s    ./# 9;cdeDE-/HIJDE H ID$%DJ	23D 7
13 4D S$S$S$T4   T4   S$r6   c                      t         st        d       d d fd}  | t              sJ  | t              sJ  | t              sJ  | t
              sJ  | t              sJ y )Nr   c                     | j                         }t        dd      }|j                  | j                  t        |z  i      }t        |      j                  ||i      j                         S )NwTreal)to_exprr   subsvarr   r   evalfrA   pointrV   _ww_exprs        r4   bode_phase_evalfz#test_bode.<locals>.bode_phase_evalf   sW    ~~3T"FJJ"-.6{U,2244r6   c                     | j                         }t        dd      }|j                  | j                  t        |z  i      }dt        t        |      d      j                  ||i      j                         z  S )Nr   Tr      r)   )r   r   r   r   r   r	   r   r   r   s        r4   bode_mag_evalfz!test_bode.<locals>.bode_mag_evalf   sc    ~~3T"FJJ"-.#c&k2&++RK8>>@@@r6   c                 L    t        t        |       xr t        t        |       S r0   )rL   r   r   )r   r   r   s    r4   test_bode_dataz!test_bode.<locals>.test_bode_data   s,    $%BNTWX X%&?AQSVW	Xr6   )r$   r   rv   r   r   tf4r   )r   r   r   s    @@r4   	test_boder      sh    ./5AX #####r6   c                 :    t        d t        | |      D              S )Nc              3   >   K   | ]  \  }}t        ||d         yw)gdy=)rel_tolNr   )r>   a_ib_is      r4   rB   z'check_point_accuracy.<locals>.<genexpr>   s(      S sC00 s   )rF   rG   r2   s     r4   check_point_accuracyr      s"     1I  r6   c                     t         st        d       d } d}d}d}d}d}d}d	} | t        |      sJ  | t        |      sJ  | t        |      sJ  | t
        |      sJ  | t        |      sJ  | t        |      sJ  | t        |      sJ y )
Nr   c                 x    t        t        | dd       \  }}t        ||d         }t        ||d         }|xr |S NFr)   )adaptivenb_of_pointsr   r%   )r5   r   r   r   r   rI   rJ   x_checky_checks         r4   impulse_res_testerz1test_impulse_response.<locals>.impulse_res_tester   sL    9#- .1&q.*;<&q.*;<"7"r6   )
r   grq?grq@g
@grq@g88@g@gqq@grq!@      $@)
r   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   )
r   gf@gf8@gsqK@gfX@gOEJc@gsqk@gr@gfx@g     @@)r   )
r   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   )
r   g6qD2@g7մ@gO/ߡ 5AgsYAgzC5Bgl̹˵BgC/6CgJ@Cg"-|6D)	r$   r   rv   r   r   r   r   tf7r   )r   r   r   r   r   r   r   exp7s           r4   test_impulse_responser      s    ./#^DeDCD#DgDD
 D c4(((c4(((c4(((c4(((c4(((c4(((dD)))r6   c                      t         st        d       d } d}d}d}d}d}d} | t        |      sJ  | t        |      sJ  | t        |      sJ  | t
        |      sJ  | t        |      sJ  | t        |      sJ y )	Nr   c                 x    t        t        | dd       \  }}t        ||d         }t        ||d         }|xr |S r   )r5   r   r   r   s         r4   step_res_testerz+test_step_response.<locals>.step_res_tester   sL    6s- .1&q.*;<&q.*;<"7"r6   )r   )
g   jϛTgڴW?g?gg	?gM?g#J?g"@te?g ?g/P?gc?)r   )
r   gRul?gql?g."aG?g?gb?gVߴ?g-b[S?g7 ގ?g\7' m)r   )
r   gNw4?gh&7|@g."@gs<@gHvU@grnT^p@gh%݈@gs@g{ct'@)r   )
r   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   rv   r   r   r   r   ser2)r   r   r   r   r   r   r   s          r4   test_step_responser      s    ./#1D
 D
iDMD2D
D 3%%%3%%%3%%%3%%%3%%%4&&&r6   c                     t         st        d       dd} d}d}d}d}d}d} | t        d	|      sJ  | t        d
|d      sJ  | t        d
|d      sJ  | t
        d
|d      sJ  | t        d
|d      sJ  | t        d
|      sJ y )Nr   c                 z    t        t        | |d|       \  }}t        ||d         }t        ||d         }|xr |S )NF)r}   r   r   r   r%   )r5   r   r   )r   
num_pointsr   r}   rI   rJ   r   r   s           r4   ramp_res_testerz+test_ramp_response.<locals>.ramp_res_tester	  sP    6s%jB C1&q.*;<&q.*;<"7"r6   ))r   g       @g      @g      @g       @r   )r   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   )
r   g?{?g?{>@gQEJc@g?{~@g(|R@gQEJ@g`ޱ@g?{@g     j@)r   )
r   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   rv   r   r   r   r   r   )r   r   r   r   r   r   r   s          r4   test_ramp_responser     s    ./#CDD
VD%D/DAD 34(((3D#...3D#...3D!,,,3D!,,,3D)))r6   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$   rv   r   r   r   r   r   r   r   r   r   r   par2r5   r:   rL   r   r   r   r   r   r   r   r=   r6   r4   <module>r      s      # ; 6   (* * * *. . -Z($<o
 	gq!Q$Q,*A.q!AqD&1Q3,*A.q!Q$(A&r1a4#q!Q$1*r/1-q!Qqs1uqAv~A-2AadFQq!tVOb4H!Lq!Q$!A#q.2-q1c#Aq1ua01c#Aq1ua01SS#?
L'ET <6
0*f-'`'*r6   