
    Qi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) ZEd*S )+    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     /var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/sympy/physics/control/tests/test_control_plots.py	_to_tupler<   +   s    88U1XX    c           	      h   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1a41SVVQYQQ677!BCC&@AAa1g#a&&!)c!ffai!m3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   | ]} |          V  d S r7    ).0x_i
evalf_funcsystems     r;   	<genexpr>z(y_coordinate_equality.<locals>.<genexpr>9   s/      77c**VS))777777r=   c              3   H   K   | ]\  }}t          ||z
            d k     V  dS )g:0yE>N)r   )rE   y_exp_iy_is      r;   rI   z(y_coordinate_equality.<locals>.<genexpr>:   s7      KK\Wcs7S=!!D(KKKKKKr=   )rA   r8   allzip)plot_data_funcrG   rH   xyy_exps    ``   r;   y_coordinate_equalityrS   3   sv     >&!!DAqq!DAq77777Q77777EKKS]]KKKKKKr=   c                  X    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            d S )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(F r=   c                  "    t                     S r7   r   r\   s   r;   rY   ztest_errors.<locals>.<lambda>F   s    (=d(C(C r=   c                  "    t                     S r7   r   rW   s   r;   rY   ztest_errors.<locals>.<lambda>G   s    (G(L(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(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(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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D r=   c                  "    t                     S r7   rc   rm   s   r;   rY   ztest_errors.<locals>.<lambda>T       1$77 r=   c                  "    t                     S r7   re   rm   s   r;   rY   ztest_errors.<locals>.<lambda>U       ;DA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II r=   c                  .    t          t          d          S )N皙r{   )r   r}   rD   r=   r;   rY   ztest_errors.<locals>.<lambda>\       1#4HH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B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CC r=   )r$   r#   r!   tf6tf5r   r"   NotImplementedErrorr   r   
ValueError)r]   rn   rX   s   @@@r;   test_errorsr   =   s    31222 !3*sCj!9
:
:CadQh<D
 ; ; ; ;<<<
 F F F FGGG
 C C C CDDD
 L L L LMMM
 ? ? ? ?@@@
 J J J JKKK
 @ @ @ @AAA
 I I I IJJJ
 6 6 6 6777 Aq1ua((D
:3333444
:====>>>
:::::;;;
:DDDDEEE
:7777888
:AAAABBB
:7777888
:AAAABBB
:..../// :IIJJJ
:HHIII
:HHIII :BBCCC :>>???
:CCDDDD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 d S )Nc                     t          |           \  }}t          ||d                   }t          ||d                   }|o|S )Nr   r*   )r   r   )sysexpected_value_z_pz_checkp_checks         r;   	pz_testerz!test_pole_zero.<locals>.pz_testeri   sF    )#..BBq 122Bq 12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   s1   # # # 9;cdeDE-/HIJDE 1 1 1 2D$$$%DJJJ	2 	2 	23D
 7
13 4D 9S$9S$9S$9T4     9T4     9S$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 d S )NNumPy is required for this testc                     |                                  }t          dd          }|                    | j        t          |z  i          }t          |                              ||i                                          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   si    ~~3T"""FJ"-..6{{U,,22444r=   c                 "   |                                  }t          dd          }|                    | j        t          |z  i          }dt          t          |          d                              ||i                                          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   sx    ~~3T"""FJ"-..#c&kk2&&++RK88>>@@@@r=   c                 \    t          t          |           ot          t          |           S r7   )rS   r   r   )r   r   r   s    r;   test_bode_dataz!test_bode.<locals>.test_bode_data   s2    $%BNTWXX X%&?AQSVWW	Xr=   )r)   r#   r}   r   r   tf4r   )r   r   r   s    @@r;   	test_boder      s     0.///5 5 5A A AX X X X X X >#>#>#>#>#r=   c                 P    t          d t          | |          D                       S )Nc              3   0   K   | ]}t          |d ddV  dS )r3   gư>)rel_tolabs_tolNr   )rE   _s     r;   rI   z'check_point_accuracy.<locals>.<genexpr>   sK         4 
 
 
      r=   )rM   rN   r9   s     r;   check_point_accuracyr      s8      q!99     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 d S )
Nr   c                     t          t          | dd           \  }}t          ||d                   }t          ||d                   }|o|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   s\    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    0.///# # #^DeDCD#DgDD
 D c4(((((c4(((((c4(((((c4(((((c4(((((c4(((((dD)))))))r=   c                  4   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 d S )	Nr   c                     t          t          | dd           \  }}t          ||d                   }t          ||d                   }|o|S r   )r<   r   r   r   s         r;   step_res_testerz+test_step_response.<locals>.step_res_tester   s\    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     0.///# # #1D
 D
iDMD2D
D ?3%%%%%?3%%%%%?3%%%%%?3%%%%%?3%%%%%?4&&&&&&&r=   c                  J   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 d S )Nr   r*   c                     t          t          | |d|           \  }}t          ||d                   }t          ||d                   }|o|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  s^    6s%:7 7 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    0.///# # # #CDD
VD%D/DAD ?34(((((?3D#.....?3D#.....?3D!,,,,,?3D!,,,,,?3D)))))))r=   c                  j   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 d S )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62q5!BE'Q2q5[1$4455555Q2q5[!1RU7a!BE'kA-=#=>>>>>"a%Q#####"b!eai    7777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 d S )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6777B?????SRUFSVAX-12333B66666CBRAX"a%%7!%; < <<===c"ggEEEEESAr"a%x!B$q&0145666r99999CBRUQY/000R88888S"QAa!,---b00000CBE#b''M*+++CGG3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     s6         + + + + + + + + # # # # # # ; ; ; ; ; ; ; ; 6 6 6 6 6 6 9 9 9 9 9 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Lq!Q$!A#q.2-q11vc##Aq1ua0011vc##Aq1ua0011xS  ? ? ?
L L L'E 'E 'ET     :  6  
0* 0* 0*f-' -' -'`'* '* '*T  % % % % %r=   