
    oVhB                     .   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      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      Z0 e%eedz  dz
  e      Z1 e%dedz  e      Z2 e%dedz  dez  z   dz   e      Z3 e%dde      Z4 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      Z5 e%dedz  dez   ez  z   dz   e      Z6 e&e2 e%dedz
  e            Z7 e&e1 e%eedz   e            Z8 e'e/e0      Z9d Z:d Z;d  Z<d! Z=d" Z>d# Z?d$ Z@d% ZAd& ZBd' ZCd( ZDd) ZEy*)+    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fromlistpyplot)import_kwargscatchnumpy            ?      
         	   皙?      c                 .    t        |       t        |      fS N)tupler   bs     ^/home/dcms/DCMS/lib/python3.12/site-packages/sympy/physics/control/tests/test_control_plots.py	_to_tupler<   +   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*   )r<   r8   lenr9   s     r;   _trim_tuplerA   .   s    Q?DAq1a1SVQYQQ77!BC&@Aa1g#a&!)c!fai!m44qv=>? ?r=   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r7    ).0x_i
evalf_funcsystems     r;   	<genexpr>z(y_coordinate_equality.<locals>.<genexpr>9   s     7c*VS)7s   c              3   D   K   | ]  \  }}t        ||z
        d k    yw)g:0yE>N)r   )rE   y_exp_iy_is      r;   rI   z(y_coordinate_equality.<locals>.<genexpr>:   s"     K\Wcs7S=!D(Ks    )rA   r8   allzip)plot_data_funcrG   rH   xyy_exps    ``   r;   y_coordinate_equalityrS   3   sJ     &!DAqq!DAq7Q77EKS]KKKr=   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 r7   r   tfms   r;   <lambda>ztest_errors.<locals>.<lambda>D   s    s(; r=   c                      t               S r7   r   exprs   r;   rY   ztest_errors.<locals>.<lambda>E   s    (@(F r=   c                      t               S r7   r   r\   s   r;   rY   ztest_errors.<locals>.<lambda>F   s    (=d(C r=   c                      t               S r7   r   rW   s   r;   rY   ztest_errors.<locals>.<lambda>G   s    (G(L r=   c                      t               S r7   r   rW   s   r;   rY   ztest_errors.<locals>.<lambda>H   s    (:3(? r=   c                      t               S r7   r   r\   s   r;   rY   ztest_errors.<locals>.<lambda>I   s    (DT(J r=   c                      t               S r7   r   r\   s   r;   rY   ztest_errors.<locals>.<lambda>J   s    (:4(@ r=   c                      t               S r7   r   rW   s   r;   rY   ztest_errors.<locals>.<lambda>K   s    (DS(I r=   c                      t               S r7   r   rW   s   r;   rY   ztest_errors.<locals>.<lambda>L   s    	# r=   c                      t               S r7   rV   tf_as   r;   rY   ztest_errors.<locals>.<lambda>P   s    ~d3 r=   c                      t               S r7   r[   rm   s   r;   rY   ztest_errors.<locals>.<lambda>Q   s    7= r=   c                      t               S r7   r_   rm   s   r;   rY   ztest_errors.<locals>.<lambda>R   s    4T: r=   c                      t               S r7   ra   rm   s   r;   rY   ztest_errors.<locals>.<lambda>S   s    >tD r=   c                      t               S r7   rc   rm   s   r;   rY   ztest_errors.<locals>.<lambda>T       1$7 r=   c                      t               S r7   re   rm   s   r;   rY   ztest_errors.<locals>.<lambda>U       ;DA r=   c                      t               S r7   rg   rm   s   r;   rY   ztest_errors.<locals>.<lambda>V   rs   r=   c                      t               S r7   ri   rm   s   r;   rY   ztest_errors.<locals>.<lambda>W   ru   r=   c                      t               S r7   rk   rm   s   r;   rY   ztest_errors.<locals>.<lambda>X   s    y r=   c                  $    t        t        d      S )Nlower_limit)r   tf1rD   r=   r;   rY   ztest_errors.<locals>.<lambda>[   s    4SbI r=   c                  $    t        t        d      S )N皙r{   )r   r}   rD   r=   r;   rY   ztest_errors.<locals>.<lambda>\       1#4H r=   c                  $    t        t        d      S )NgUUUUUUr{   r   r}   rD   r=   r;   rY   ztest_errors.<locals>.<lambda>]   r   r=   c                  $    t        t        d      S )Nr   )sloper   rD   r=   r;   rY   ztest_errors.<locals>.<lambda>`   s    1#TB r=   c                  $    t        t        d      S )Nhz)	freq_unitr   r}   rD   r=   r;   rY   ztest_errors.<locals>.<lambda>c   s    y> r=   c                  $    t        t        d      S )Ndegree)
phase_unitr   rD   r=   r;   rY   ztest_errors.<locals>.<lambda>d   s    y(C r=   )r$   r#   r!   tf6tf5r   r"   NotImplementedErrorr   r   
ValueError)r]   rn   rX   s   @@@r;   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Dr=   c                     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 )Nc                 f    t        |       \  }}t        ||d         }t        ||d         }|xr |S )Nr   r*   )r   r   )sysexpected_value_z_pz_checkp_checks         r;   	pz_testerz!test_pole_zero.<locals>.pz_testeri   s=    )#.BBq 12Bq 12"7"r=   yϿhdEyϿhdE?        y      п4Կy      п4?)y?        y     ࿲LXzy     ࿲LXz?)r   r   r   g      @)gv|?g     g8hֿ)yϿ4ԿyϿ4?yϿhdEyϿhdE?yZEf;]yJu3;]@)r}   tf2tf3ser1par1tf8)r   exp1exp2exp3exp4exp5exp6s          r;   test_pole_zeror   g   s    # 9;cdeDE-/HIJDE 1 2D$%DJ	23D
 7
13 4D S$S$S$T4   T4   S$r=   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 )NNumPy is required for this testc                     | j                         }t        dd      }|j                  | j                  t        |z  i      }t        |      j                  ||i      j                         S )NwTreal)to_exprr   subsvarr   r	   evalfrH   pointr]   _ww_exprs        r;   bode_phase_evalfz#test_bode.<locals>.bode_phase_evalf   sW    ~~3T"FJJ"-.6{U,2244r=   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        r;   bode_mag_evalfz!test_bode.<locals>.bode_mag_evalf   sc    ~~3T"FJJ"-.#c&k2&++RK8>>@@@r=   c                 L    t        t        |       xr t        t        |       S r7   )rS   r   r   )r   r   r   s    r;   test_bode_dataz!test_bode.<locals>.test_bode_data   s,    $%BNTWX X%&?AQSVW	Xr=   )r)   r#   r}   r   r   tf4r   )r   r   r   s    @@r;   	test_boder      sh    ./5AX #####r=   c                 :    t        d t        | |      D              S )Nc              3   4   K   | ]  }t        |d dd  yw)r3   gư>)rel_tolabs_tolNr   )rE   _s     r;   rI   z'check_point_accuracy.<locals>.<genexpr>   s#       4 
 s   )rM   rN   r9   s     r;   check_point_accuracyr      s"     q!9  r=   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nr   r*   )r<   r   r   r   r   rP   rQ   x_checky_checks         r;   impulse_res_testerz1test_impulse_response.<locals>.impulse_res_tester   sL    9#b" #1&q.*;<&q.*;<"7"r=   )
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#   r}   r   r   r   r   tf7r   )r   r   r   r   r   r   r   exp7s           r;   test_impulse_responser      s    ./#^DeDCD#DgDD
 D c4(((c4(((c4(((c4(((c4(((c4(((dD)))r=   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   )r<   r   r   r   s         r;   step_res_testerz+test_step_response.<locals>.step_res_tester   sL    6sb" #1&q.*;<&q.*;<"7"r=   )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#   r}   r   r   r   r   ser2)r   r   r   r   r   r   r   s          r;   test_step_responser      s    ./#1D
 D
iDMD2D
D 3%%%3%%%3%%%3%%%3%%%4&&&r=   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*   )r<   r   r   )r   
num_pointsr   r   rP   rQ   r   r   s           r;   ramp_res_testerz+test_ramp_response.<locals>.ramp_res_tester  sN    6s%:7 81&q.*;<&q.*;<"7"r=   ))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.   r2   )r*   )r)   r#   r}   r   r   r   r   r   )r   r   r   r   r   r   r   s          r;   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)))r=   c                  0   t        t              \  } }}t        t              \  }}}t        t              \  }}}t        t              \  }	}
}| d|dz  z
  d|dz  z  d|dz  z
  dz  z   z  k(  sJ |d|z  d|dz  z  d|dz  z
  dz  z   z  k(  sJ |d|dz  z  d|dz  z  dd|dz  z  z
  dz  z   z  k(  sJ ||dd|dz  z  z
  z  d|dz  z  dd|dz  z  z
  dz  z   z  k(  sJ ||dz   |dz  dz   z  k(  sJ || |dz  dz   z  k(  sJ |	d	k(  sJ |
d
|dz  z  k(  sJ y )Nr+   g      ?g      r.   r2   r*   r-   r1   r   r/   )r   r}   r   r   r   )r1i1w1r2i2w2r3i3w3r4i4w4s               r;   test_nyquist_plot_exprr   1  s}   "3'JBB"3'JBB"3'JBB"3'JBB!b!e)d2q5jAAI>9::::b$r1u*BE	A~566662q5!BE'Q2q5[1$445555Q2q5[!1RU7a!BE'kA-=#=>>>>"a%Q####"b!eai   7N7BE>>r=   c                     t        t              \  } }}t        t              \  }}}t        t              \  }}}t        t              \  }	}
}| dt        dt        |dz  d|dz  z  z
  dz         z        z  t        d      z  k(  sJ |dt        d|dz   d|z  t        z  z   dz   z        z  t        z  k(  sJ |dt        t        |      t        d	|dz  z  d
|dz  z  z
  dz         z        z  t        d      z  k(  sJ |dt        |t        z  d|dz  z  d
|z  t        z  z   dz   z        z  t        z  k(  sJ |dt        t        |      t        |dz  dz         z        z  t        d      z  k(  sJ |dt        | t        z  |d
z  t        z  dz   z        z  t        z  k(  sJ |	dt        d|dz  t        |      z  z        z  t        d      z  k(  sJ |
dt        t        |d
z  z        z  t        z  k(  sJ y )Nr   r*   r1   g      @r+   r/      r,   $   r.   ir-   )r   r}   r   r   r   r
   r   r	   r   r   r   )m1p1r   m2p2r   m3p3r   m4p4r   s               r;   test_nichols_exprr   @  s   "3'JBB"3'JBB"3'JBB"3'JBBC$r1utBEz1A56677B????SRUFSVAX-1233B6666CBRAX"a%%7!%; <<==c"gEEEESAr"a%x!B$q&014566r9999CBRUQY/00R8888S"QAa!,--b0000CBE#b'M*++CG3333S2q5\!"$$$$r=   N)Fmathr   sympy.core.numbersr   r   sympy.core.symbolr   $sympy.functions.elementary.complexesr   r	   &sympy.functions.elementary.exponentialr
   (sympy.functions.elementary.miscellaneousr   	sympy.abcr   r   r   sympyr   sympy.externalr   #sympy.physics.control.control_plotsr   r   r   r   r   r   r   r   r   r   r   r   r   sympy.physics.control.ltir   r   r    r!   sympy.testing.pytestr"   r#   RuntimeErrorr$   r)   r}   r   r   r   r   r   r   r   r   r   r   r<   rA   rS   r   r   r   r   r   r   r   r   r   rD   r=   r;   <module>r     s    + # ; 6 9    (   . . -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?
L'ET :6
0*f-'`'*T%r=   