
    sg.=                        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)      Z2d Z3d Z4d Z5d Z6d  Z7d! Z8d" Z9d# 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      ?      
         	   皙?      c                 .    t        |       t        |      fS N)tupler   bs     a/var/www/html/venv/lib/python3.12/site-packages/sympy/physics/control/tests/test_control_plots.py	_to_tupler6   '   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%   )r6   r2   lenr3   s     r5   _trim_tupler;   *   s    Q?DAq1a1SVQYQQ77!BC&@Aa1g#a&!)c!fai!m44qv=>? ?r7   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r1    ).0x_i
evalf_funcsystems     r5   	<genexpr>z(y_coordinate_equality.<locals>.<genexpr>5   s     7c*VS)7s   c              3   D   K   | ]  \  }}t        ||z
        d k    yw)g:0yE>N)r   )r?   y_exp_iy_is      r5   rC   z(y_coordinate_equality.<locals>.<genexpr>6   s"     K\Wcs7S=!D(Ks    )r;   r2   allzip)plot_data_funcrA   rB   xyy_exps    ``   r5   y_coordinate_equalityrM   /   sJ     &!DAqq!DAq7Q77EKS]KKKr7   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 r1   r   tfms   r5   <lambda>ztest_errors.<locals>.<lambda>@   s    s(; r7   c                      t               S r1   r   exprs   r5   rS   ztest_errors.<locals>.<lambda>A   s    (@(F r7   c                      t               S r1   r   rV   s   r5   rS   ztest_errors.<locals>.<lambda>B   s    (=d(C r7   c                      t               S r1   r   rQ   s   r5   rS   ztest_errors.<locals>.<lambda>C   s    (G(L r7   c                      t               S r1   r   rQ   s   r5   rS   ztest_errors.<locals>.<lambda>D   s    (:3(? r7   c                      t               S r1   r   rV   s   r5   rS   ztest_errors.<locals>.<lambda>E   s    (DT(J r7   c                      t               S r1   r   rV   s   r5   rS   ztest_errors.<locals>.<lambda>F   s    (:4(@ r7   c                      t               S r1   r   rQ   s   r5   rS   ztest_errors.<locals>.<lambda>G   s    (DS(I r7   c                      t               S r1   r   rQ   s   r5   rS   ztest_errors.<locals>.<lambda>H   s    	# r7   c                      t               S r1   rP   tf_as   r5   rS   ztest_errors.<locals>.<lambda>L   s    ~d3 r7   c                      t               S r1   rU   rg   s   r5   rS   ztest_errors.<locals>.<lambda>M   s    7= r7   c                      t               S r1   rY   rg   s   r5   rS   ztest_errors.<locals>.<lambda>N   s    4T: r7   c                      t               S r1   r[   rg   s   r5   rS   ztest_errors.<locals>.<lambda>O   s    >tD r7   c                      t               S r1   r]   rg   s   r5   rS   ztest_errors.<locals>.<lambda>P       1$7 r7   c                      t               S r1   r_   rg   s   r5   rS   ztest_errors.<locals>.<lambda>Q       ;DA r7   c                      t               S r1   ra   rg   s   r5   rS   ztest_errors.<locals>.<lambda>R   rm   r7   c                      t               S r1   rc   rg   s   r5   rS   ztest_errors.<locals>.<lambda>S   ro   r7   c                      t               S r1   re   rg   s   r5   rS   ztest_errors.<locals>.<lambda>T   s    y r7   c                  $    t        t        d      S )Nlower_limit)r   tf1r>   r7   r5   rS   ztest_errors.<locals>.<lambda>W   s    4SbI r7   c                  $    t        t        d      S )N皙ru   )r   rw   r>   r7   r5   rS   ztest_errors.<locals>.<lambda>X       1#4H r7   c                  $    t        t        d      S )NgUUUUUUru   r   rw   r>   r7   r5   rS   ztest_errors.<locals>.<lambda>Y   rz   r7   c                  $    t        t        d      S )Nry   )sloper|   r>   r7   r5   rS   ztest_errors.<locals>.<lambda>\   s    1#TB r7   c                  $    t        t        d      S )Nhz)	freq_unitr   rw   r>   r7   r5   rS   ztest_errors.<locals>.<lambda>_   s    y> r7   c                  $    t        t        d      S )Ndegree)
phase_unitr   r>   r7   r5   rS   ztest_errors.<locals>.<lambda>`   s    y(C r7   )r   r   r   tf6tf5r
   r   NotImplementedErrorr   r   
ValueError)rW   rh   rR   s   @@@r5   test_errorsr   9   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Dr7   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         r5   	pz_testerz!test_pole_zero.<locals>.pz_testerg   sE    ',1..N1$56..N1$56"7"r7   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   rw   tf2tf3ser1par1tf8)r   exp1exp2exp3exp4exp5exp6s          r5   test_pole_zeror   c   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$r7   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rB   pointrW   _ww_exprs        r5   bode_phase_evalfz#test_bode.<locals>.bode_phase_evalf   sW    ~~3T"FJJ"-.6{U,2244r7   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        r5   bode_mag_evalfz!test_bode.<locals>.bode_mag_evalf   sc    ~~3T"FJJ"-.#c&k2&++RK8>>@@@r7   c                 L    t        t        |       xr t        t        |       S r1   )rM   r   r   )r   r   r   s    r5   test_bode_dataz!test_bode.<locals>.test_bode_data   s,    $%BNTWX X%&?AQSVW	Xr7   )r$   r   rw   r   r   tf4r   )r   r   r   s    @@r5   	test_boder      sh    ./5AX #####r7   c                 :    t        d t        | |      D              S )Nc              3   4   K   | ]  }t        |d dd  yw)r-   gư>)rel_tolabs_tolNr   )r?   _s     r5   rC   z'check_point_accuracy.<locals>.<genexpr>   s#       4 
 s   )rG   rH   r3   s     r5   check_point_accuracyr      s"     q!9  r7   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%   )r6   r   r   r   r   rJ   rK   x_checky_checks         r5   impulse_res_testerz1test_impulse_response.<locals>.impulse_res_tester   sL    9#b" #1&q.*;<&q.*;<"7"r7   )
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   rw   r   r   r   r   tf7r   )r   r   r   r   r   r   r   exp7s           r5   test_impulse_responser      s    ./#^DeDCD#DgDD
 D c4(((c4(((c4(((c4(((c4(((c4(((dD)))r7   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   )r6   r   r   r   s         r5   step_res_testerz+test_step_response.<locals>.step_res_tester   sL    6sb" #1&q.*;<&q.*;<"7"r7   )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   rw   r   r   r   r   ser2)r   r   r   r   r   r   r   s          r5   test_step_responser      s    ./#1D
 D
iDMD2D
D 3%%%3%%%3%%%3%%%3%%%4&&&r7   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%   )r6   r   r   )r   
num_pointsr   r~   rJ   rK   r   r   s           r5   ramp_res_testerz+test_ramp_response.<locals>.ramp_res_tester  sN    6s%:7 81&q.*;<&q.*;<"7"r7   ))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   rw   r   r   r   r   r   )r   r   r   r   r   r   r   s          r5   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)))r7   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$   rw   r   r   r   r   r   r   r   r   r   r   r6   r;   rM   r   r   r   r   r   r   r   r>   r7   r5   <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?
L'ET <6
0*f-'`'*r7   