
    hB                     (   S SK Jr  S SKJrJr  S SKJr  S SKJrJ	r	  S SK
Jr  S SKJr  S SKJrJrJr  S SKJr  S S	KJr  S S
KJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#  S SK$J%r%J&r&J'r'J(r(  S SK)J*r*J+r+  \" SSS/0\,4S9r-\" S5      r.\%" S\S-  S\-  -   S-   \5      r/\%" \S\S-  -  S\-  -   S-   \5      r0\%" \\S-  S-
  \5      r1\%" S\S-  \5      r2\%" S\S-  S\-  -   S-   \5      r3\%" SS\5      r4\%" S\-  S-  S\S-  -  -   S\-  -   S-   S\S-  -  S\S-  -  -   S-   \5      r5\%" S\S-  S\-   \-  -   S-   \5      r6\&" \2\%" S\S-
  \5      5      r7\&" \1\%" \\S-   \5      5      r8\'" \/\05      r9S r:S r;S  r<S! r=S" r>S# r?S$ r@S% rAS& rBS' rCS( rDS) rEg*)+    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                 .    [        U 5      [        U5      4$ N)tupler   bs     h/var/www/fran/franai/venv/lib/python3.13/site-packages/sympy/physics/control/tests/test_control_plots.py	_to_tupler<   +   s    8U1X    c           	          [        X5      u  p[        U SS U [        U 5      S-  [        U 5      S-  S-    -   U SS  -   5      [        USS U[        U5      S-  [        U5      S-  S-    -   USS  -   5      4$ )Nr   r+   r*   )r<   r8   lenr9   s     r;   _trim_tuplerA   .   s    Q?DA1a1SVQYQQ77!BC&@Aa1g#a&!)c!fai!m44qv=>? ?r=   c                    ^^ U " T5      u  p4[        X45      u  p4[        UU4S jU 5       5      n[        S [        XT5       5       5      $ )zxChecks whether the y-coordinate value of the plotted
data point is equal to the value of the function at a
particular x.c              3   6   >#    U  H  nT" TU5      v   M     g 7fr7    ).0x_i
evalf_funcsystems     r;   	<genexpr>(y_coordinate_equality.<locals>.<genexpr>9   s     7Qc*VS))Qs   c              3   F   #    U  H  u  p[        X-
  5      S :  v   M     g7f)g:0yE>N)r   )rE   y_exp_iy_is      r;   rI   rJ   :   s     K]\Ws7=!D(]s   !)rA   r8   allzip)plot_data_funcrG   rH   xyy_exps    ``   r;   y_coordinate_equalityrT   3   sB     &!DAqDA7Q77EKS]KKKr=   c                  j  ^ ^^ [         (       d  [        S5        [        [        [        /[        [        //5      mS[
        S-  S-
  -  m [        [        U4S j5        [        [        U 4S j5        [        [        U 4S j5        [        [        U4S j5        [        [        U4S j5        [        [        U 4S	 j5        [        [        U 4S
 j5        [        [        U4S j5        [        [        U4S j5        [        [        [
        S-   [
        5      m[        [        U4S j5        [        [        U4S j5        [        [        U4S j5        [        [        U4S j5        [        [        U4S j5        [        [        U4S j5        [        [        U4S j5        [        [        U4S j5        [        [        U4S j5        [        [        S 5        [        [        S 5        [        [        S 5        [        [        S 5        [        [        S 5        [        [        S 5        g )Nz"Matplotlib not the default backendr*   r+   c                     > [        T 5      $ r7   r   tfms   r;   <lambda>test_errors.<locals>.<lambda>D   s
    s(;r=   c                     > [        T 5      $ r7   r   exprs   r;   rZ   r[   E   s    (@(Fr=   c                     > [        T 5      $ r7   r   r^   s   r;   rZ   r[   F   s    (=d(Cr=   c                     > [        T 5      $ r7   r   rX   s   r;   rZ   r[   G   s    (G(Lr=   c                     > [        T 5      $ r7   r   rX   s   r;   rZ   r[   H   s    (:3(?r=   c                     > [        T 5      $ r7   r   r^   s   r;   rZ   r[   I   s    (DT(Jr=   c                     > [        T 5      $ r7   r   r^   s   r;   rZ   r[   J   s    (:4(@r=   c                     > [        T 5      $ r7   r   rX   s   r;   rZ   r[   K   s    (DS(Ir=   c                     > [        T 5      $ r7   r   rX   s   r;   rZ   r[   L   s	    	#r=   c                     > [        T 5      $ r7   rW   tf_as   r;   rZ   r[   P   s
    ~d3r=   c                     > [        T 5      $ r7   r]   ro   s   r;   rZ   r[   Q   s    7=r=   c                     > [        T 5      $ r7   ra   ro   s   r;   rZ   r[   R   s    4T:r=   c                     > [        T 5      $ r7   rc   ro   s   r;   rZ   r[   S   s    >tDr=   c                     > [        T 5      $ r7   re   ro   s   r;   rZ   r[   T       1$7r=   c                     > [        T 5      $ r7   rg   ro   s   r;   rZ   r[   U       ;DAr=   c                     > [        T 5      $ r7   ri   ro   s   r;   rZ   r[   V   ru   r=   c                     > [        T 5      $ r7   rk   ro   s   r;   rZ   r[   W   rw   r=   c                     > [        T 5      $ r7   rm   ro   s   r;   rZ   r[   X   s	    yr=   c                      [        [        SS9$ )Nlower_limit)r   tf1rD   r=   r;   rZ   r[   [   s    4SbIr=   c                      [        [        SS9$ )N皙r}   )r   r   rD   r=   r;   rZ   r[   \       1#4Hr=   c                      [        [        SS9$ )NgUUUUUUr}   r   r   rD   r=   r;   rZ   r[   ]   r   r=   c                      [        [        SS9$ )Nr   )sloper   rD   r=   r;   rZ   r[   `   s    1#TBr=   c                      [        [        SS9$ )Nhz)	freq_unitr   r   rD   r=   r;   rZ   r[   c   s    y>r=   c                      [        [        SS9$ )Ndegree)
phase_unitr   rD   r=   r;   rZ   r[   d   s    y(Cr=   )r$   r#   r!   tf6tf5r   r"   NotImplementedErrorr   r   
ValueError)r_   rp   rY   s   @@@r;   test_errorsr   =   sf   :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                  J   S n / SS//nS/SS//nS// SQ/n/ / SQ/n/ S	Q/ S
Q/n/ SS//nU " [         U5      (       d   eU " [        U5      (       d   eU " [        U5      (       d   eU " [        U5      (       d   eU " [        U5      (       d   eU " [
        U5      (       d   eg )Nc                 j    [        U 5      u  p#[        X!S   5      n[        X1S   5      nU=(       a    U$ )Nr   r*   )r   r   )sysexpected_value_z_pz_checkp_checks         r;   	pz_tester!test_pole_zero.<locals>.pz_testeri   s7    )#.Bq 12Bq 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                    ^^ [         (       d  [        S5        S mS mUU4S jn U " [        5      (       d   eU " [        5      (       d   eU " [        5      (       d   eU " [
        5      (       d   eU " [        5      (       d   eg )NNumPy is required for this testc                     U R                  5       n[        SSS9nUR                  U R                  [        U-  05      n[        U5      R                  X105      R                  5       $ )NwTreal)to_exprr   subsvarr   r	   evalfrH   pointr_   _ww_exprs        r;   bode_phase_evalf#test_bode.<locals>.bode_phase_evalf   sU    ~~3T"FJJ"-.6{,2244r=   c                     U R                  5       n[        SSS9nUR                  U R                  [        U-  05      nS[        [        U5      S5      R                  X105      R                  5       -  $ )Nr   Tr      r/   )r   r   r   r   r   r
   r   r   r   s        r;   bode_mag_evalf!test_bode.<locals>.bode_mag_evalf   sa    ~~3T"FJJ"-.#c&k2&++RK8>>@@@r=   c                 V   > [        [        TU 5      =(       a    [        [        TU 5      $ r7   )rT   r   r   )r   r   r   s    r;   test_bode_data!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      sy    5./5AX #####r=   c                 8    [        S [        X5       5       5      $ )Nc              3   :   #    U  H  n[        US SS.6v   M     g7f)r3   gư>)rel_tolabs_tolNr   )rE   _s     r;   rI   'check_point_accuracy.<locals>.<genexpr>   s"      a 4 
s   )rN   rO   r9   s     r;   check_point_accuracyr      s      q9  r=   c                  j   [         (       d  [        S5        S n SnSnSnSnSnSnS	nU " [        U5      (       d   eU " [        U5      (       d   eU " [        U5      (       d   eU " [
        U5      (       d   eU " [        U5      (       d   eU " [        U5      (       d   eU " [        U5      (       d   eg )
Nr   c                 v    [        [        U SSS96 u  p#[        X!S   5      n[        X1S   5      nU=(       a    U$ NFr/   )adaptivenr   r*   )r<   r   r   r   r   rQ   rR   x_checky_checks         r;   impulse_res_tester1test_impulse_response.<locals>.impulse_res_tester   sF    9#b" #&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    5./#^DeDCD#DgDD
 D c4((((c4((((c4((((c4((((c4((((c4((((dD))))r=   c                  >   [         (       d  [        S5        S n SnSnSnSnSnSnU " [        U5      (       d   eU " [        U5      (       d   eU " [        U5      (       d   eU " [
        U5      (       d   eU " [        U5      (       d   eU " [        U5      (       d   eg )	Nr   c                 v    [        [        U SSS96 u  p#[        X!S   5      n[        X1S   5      nU=(       a    U$ r   )r<   r   r   r   s         r;   step_res_tester+test_step_response.<locals>.step_res_tester   sF    6sb" #&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    5./#1D
 D
iDMD2D
D 3%%%%3%%%%3%%%%3%%%%3%%%%4&&&&r=   c                  V   [         (       d  [        S5        SS jn SnSnSnSnSnSnU " [        S	U5      (       d   eU " [        S
US5      (       d   eU " [        S
US5      (       d   eU " [
        S
US5      (       d   eU " [        S
US5      (       d   eU " [        S
U5      (       d   eg )Nr   c           	      x    [        [        U USUS96 u  pE[        XBS   5      n[        XRS   5      nU=(       a    U$ )NF)r   r   r   r   r*   )r<   r   r   )r   
num_pointsr   r   rQ   rR   r   r   s           r;   ramp_res_tester+test_ramp_response.<locals>.ramp_res_tester  sH    6s%:7 8&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    5./#CDD
VD%D/DAD 34((((3D#....3D#....3D!,,,,3D!,,,,3D))))r=   c                  2   [        [        5      u  pn[        [        5      u  p4n[        [        5      u  pgn[        [        5      u  pnU SUS-  -
  SUS-  -  SUS-  -
  S-  -   -  :X  d   eUSU-  SUS-  -  SUS-  -
  S-  -   -  :X  d   eUSUS-  -  SUS-  -  SSUS-  -  -
  S-  -   -  :X  d   eXESSUS-  -  -
  -  SUS-  -  SSUS-  -  -
  S-  -   -  :X  d   eXhS-  * US-  S-   -  :X  d   eXx* US-  S-   -  :X  d   eU	S	:X  d   eU
S
US-  -  :X  d   eg )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  so   "3'JBB"3'JBB"3'JBB"3'JBB!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                     [        [        5      u  pn[        [        5      u  p4n[        [        5      u  pgn[        [        5      u  pnU S[        S[        US-  SUS-  -  -
  S-   5      -  5      -  [        S5      -  :X  d   eUS[        SUS-  * SU-  [        -  -   S-   -  5      -  [        -  :X  d   eUS[        [        U5      [        S	US-  -  S
US-  -  -
  S-   5      -  5      -  [        S5      -  :X  d   eUS[        U[        -  SUS-  -  S
U-  [        -  -   S-   -  5      -  [        -  :X  d   eUS[        [        U5      [        US-  S-   5      -  5      -  [        S5      -  :X  d   eUS[        U* [        -  US
-  [        -  S-   -  5      -  [        -  :X  d   eU	S[        SUS-  [        U5      -  -  5      -  [        S5      -  :X  d   eU
S[        [        US
-  -  5      -  [        -  :X  d   eg )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'JBB"3'JBB"3'JBB"3'JBB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   rT   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=   