
    tKg                        d dl Z d dlZd dlmZmZ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mZmZmZ d dlmZ d dlmZ ddZ G d d      Z  G d	 d
      Z! G d d      Z" G d d      Z# G d d      Z$ G d d      Z% G d d      Z& G d d      Z' G d d      Z( G d d      Z) G d d      Z* G d d      Z+y)     N)assert_almost_equalassert_equalassert_allcloseassert_suppress_warnings)raises)ss2tftf2ssltidltibodefreqresplsimimpulsestepabcd_normalizeplace_polesTransferFunction
StateSpaceZerosPolesGain)BadCoefficientsc           
         |j                         }| D ]  }d}t        |j                  d         D ]  }t        j                  t        j
                  |      t        j                  |      gt        j
                  ||         t        j                  ||         g||      srd}t        j                  ||        n |rt        dt        |      z   dz   t        |      z          y)a  
    Check each pole in P1 is close to a pole in P2 with a 1e-8
    relative tolerance or 1e-8 absolute tolerance (useful for zero poles).
    These tolerances are very strict but the systems tested are known to
    accept these poles so we should not be far from what is requested.
    Fr   TzCan't find pole z in N)
copyrangeshapenpallcloserealimagdelete
ValueErrorstr)P1P2rtolatolp1foundp2_idxs          b/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/signal/tests/test_ltisys.py_assert_poles_closer+      s     
BBHHQK(F{{BGGBK5GGBvJ/F1DE' 		"f% ) /#b'9FBSWLMM     c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestPlacePolesc                 ,   t        |||fi |}t        j                  j                  |t        j                  ||j
                        z
        \  }}t        ||j                         t        ||j                         t        ||j                         |S )z
        Perform the most common tests on the poles computed by place_poles
        and return the Bunch object for further specific tests
        )	r   r   linalgeigdotgain_matrixr+   requested_polescomputed_poles)selfABPkwargsfsfexpected_s           r*   _checkzTestPlacePoles._check'   sv    
 !Q,V,iimmAq#//(B$BC!Hc&9&9:Hc&8&89Ac112
r,   c                    t        j                  g d      j                  dd      }t        j                  g d      j                  dd      }t        j                  g d      }| j                  |||d       | j                  |||d       t        j                  d	
      5  | j                  ||d       d d d        y # 1 sw Y   y xY w)NgGz?gʿg\(@gNbX9g<,Ԛg)\(r   g?gOn?d;O@gV-gOn@g~jt?rA   grh|?gE    )r   K@V-?rD   r   r   ^I+	r      皙ɿ      g}гY9gDT!KNV0methodYTignore)invalid)rF   rF      rP   )r   arrayreshaper>   errstate)r6   r7   r8   r9   s       r*   	test_realzTestPlacePoles.test_real3   s     HH % &&-gam 	
 HH=>FFq!LHH34 	Aq!F+Aq!D) [[*KK1i( +**s   &CCc                    t        j                  g dg dg dg dg      }t        j                  ddgddgddgddgg      }t        j                  g d      }t        j                  dd      5  | j                  |||       d d d        g d	}t        j                  dd      5  | j                  |||d
       d d d        t        j                  g d      j	                  dd      }t        j                  g d      j	                  dd      }g d}| j                  |||       t        j
                  d      t        j                  d      z
  }t        j
                  d      t        j                  dgdz  d      d d dd f   z
  }||d dd df<   ||d dd df<   g d}t        j                  dd      5  | j                  |||       d d d        g d}| j                  |d dd df   |d dd df   |       g d}| j                  |d dd df   |d dd df   |       t        j                  g d      j	                  dd      }t        j                  g d      j	                  dd      }t        j                  g d      }t        j                  dd      5  t        |||       d d d        t        j                  g d      }t        j                  dd      5  | j                  |||       d d d        y # 1 sw Y   xY w# 1 sw Y   \xY w# 1 sw Y   SxY w# 1 sw Y   {xY w# 1 sw Y   y xY w)N)r      r   r   )r   r   r   竪@)r   r   r   r   r      )                          ?rN   )dividerO   )y        ưy        ư>
   i  maxiter)$iii%iiFii[iiiYiiii\ii^iciii(i~iiiiirF   iSiiigiiipii   )iiiii0i_iLi`iiiii]ii#iii"iHiii<i^iUiiiciiiR   )y      9      =y      9      =@y      ?@      Ey      ?@      E@y     @@     Dy     @@     D@)   rd   rd   )rd   r_   r_   )r^   (   2   <   F   y      4      y      4      @y      @      @y      @      )
r^   re   rf   iiiirZ   )
y      $      $@y      4      4@y      >      >@y      D      D@y      I      I@y      $      $y      4      4y      >      >y      D      Dy      I      I)r   rV   r   r   r   r   r   rW   r   r   r   r   r   r   r   r   r   r   r   rc   r   r   r   r   	   )
r   r   r   r   rX   r   r   rX   rF   rP   rF   )y            ?y                        ?            )ro   rY   rp   rq   )	r   rQ   rS   r>   rR   oneseyediagr   )r6   r7   r8   r9   big_Abig_Bs         r*   test_complexzTestPlacePoles.test_complexI   s    HHl%""$ % HHq!f!f!f!f 
 HH+, [[(;KK1a  < %[[(;KK1aK. < HHG
 WQq\ 	
 HH(
 wq| 	
 KAq!
  + !R!21QR4!88bqb!ebqb!e=[[(;KKua( < 7E#2#crc'NE#2#crc'NA66E#2#crc'NE#2#crc'NA6 HH ) **1'!A, 	
HH*+33Aa8HH56[[(;1a  <
 HH/0[[(;KK1a  <;{ <; <;> <;  <; <;s<   1L(L L%*L2.L>LL"%L/2L;>Mc                 >   t        j                  g d      j                  dd      }t        j                  g d      j                  dd      }t        j                  g d      }| j                  |||      }t	        |j
                  t         j                         t	        |j                  t         j                         t        j                  d      }| j                  |||      }t	        |j
                  t         j                         t	        |j                  t         j                         |d d df   j                  dd      }t        j                  d      }| j                  |||      }t	        |j
                  d       t	        |j                  d       y )Nr@   rB   )r   rC   rD   rD   r   r   rE   r   rX   rF   rP   rB   rc   rb   rV      rG   )r\   r[   rY   ro   r   rX   )r   rQ   rR   r>   r   r%   nannb_iter)r6   r7   r8   r9   r;   s        r*   test_tricky_BzTestPlacePoles.test_tricky_B   s1    HH % &&-gam 	
 HH " ##*71a= 	

 HH34kk!Q" 	SXXrvv&S[["&&) HH()kk!Q"SXXrvv&S[["&&) acFNN1QHH()kk!Q" 	SXXq!S[[!$r,   c           
         t        j                  g d      j                  dd      }t        j                  g d      j                  dd      }t        t        t
        ||dd       t        t        t
        ||t        j                  d      j                  dd             t        t        t
        |d d d d t         j                  f   |d       t        t        t
        ||d d d d t         j                  f   d       t        t        t
        ||d	       t        t        t
        ||d
       t        t        t
        ||dd       t        t        t
        ||dd       t        t        t
        ||d       t        t        t
        t        j                  d      t        j                  d      d       t        j                  d      5 }t        j                  d       t        ||ddd      }t        t        |      dk(         t        t        |d   j                  t                     t        dt!        |d   j"                        v        t%        |j&                  d       d d d        t        t        t
        ||d       t        t        t
        |d d d df   |d       t        t        t
        ||d dd d f   d       t        t        t
        ||dd       y # 1 sw Y   zxY w) N)r   rV   r   r   r   r   r   rW   r   r   r   r   r   r   r   r   rB   )r   r   r   r   rX   r   r   rX   rF   ) 皙ffffff333333foorK   rX   )r   r   r   r   rY   )r   r   r   *   r%   ir`   )ro   ro   ro   ro   )rB   rB   )rB   rF   rX   rF   rP   rB   T)recordalways)rZ   ro   rY   rr   gؗҜ<)r%   ra   rZ   z4Convergence was not reached after maxiter iterations)r\   r[                @ro   rP   )ro   rY   rr   )r\   r[   r   y             rJ   )r   rQ   rR   assert_raisesr!   r   newaxisrs   warningscatch_warningssimplefilterr   len
issubclasscategoryUserWarningr"   messager   r|   )r6   r7   r8   wr;   s        r*   test_errorszTestPlacePoles.test_errors   sP   HH9:BB1QGHH&'//!4 	j+q!5J"	$ 	j+q!hh45==aB	D 	j+q1RZZ/@!+	- 	j+q!Aa

N2C+	- 	j+q!5MN 	j+q!5EF 	j+q!5J	 	j+q!5J!	# 	j+q!]C 	j+rwwu~ggeni	1
 $$D1Q!!(+aMrJCCFaK Jqu~~{;<J1R5==)* +b) 2 	j+q!5KL 	j+q2A2w=I 	j+q!BQBqD'=I 	j+q!/	@' 21s   
BKK(N)__name__
__module____qualname__r>   rT   rx   r}   r    r,   r*   r.   r.   %   s     
),N!` %D@@r,   r.   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)		TestSS2TFc           	          t        t        j                  ||f      t        j                  ||f      t        j                  ||f      t        j                  ||f      d       y )Nr   )r	   r   zerosr6   pqrs       r*   check_matrix_shapeszTestSS2TF.check_matrix_shapes   sK    bhh1vhh1vhh1vhh1v	#r,   c                 @    dD ]  \  }}}| j                  |||        y )N))rP   rP   rP   )rX   rP   rP   rX   rX   rX   )r   r   s       r*   test_shapeszTestSS2TF.test_shapes  s&     9GAq!$$Q1- 9r,   c                 p   t        j                  g d      }t        j                  g d      }t        ||      \  }}}}t        |ddgddggd       t        |dgdggd       t        |dd	ggd       t        |dggd
       t	        ||||      \  }}t        |d   |d       t        ||d       y )N)      ?      @      @)r          @r   ro   rY   rX   r   vIh%<=r   rF   +=)r   rQ   r
   r   r	   )	r6   bar7   r8   CDbbaas	            r*   
test_basiczTestSS2TF.test_basic  s    HH_%HH_%1a[
1aRHq!f-E:QC!:E2QF8%0QC5u-q!Q"B1qu-AE*r,   c                 "   d}t        | \  }}}}t        |dggd       t        |dggd       t        |dggd       t        |dggd       t        ||||      \  }}t        |ddggd       t        |ddgd       dgdggdf}t        | \  }}}}t        |dggd       t        |dggd       t        |dgdggd       t        |dgdggd       t        ||||      \  }}t        |ddgddggd       t        |ddgd       y )N)rF   rX   r   r   r   rF   rX   rc   )r
   r   r	   r6   tfr7   r8   r   r   numdens           r*   test_zero_order_round_tripz$TestSS2TF.test_zero_order_round_trip  s5   BZ
1aQC5u-QC5u-QC5u-QC5u-Aq!$Sq!fXE2aV%0sQCj!_BZ
1aQC5u-QC5u-QC!:E2QC!:E2Aq!$Sq!fq!f-E:aV%0r,   c                 R   ddgddggddgf}t        | \  }}}}t        |dggd       t        |dggd       t        |dgdggd       t        |dgdggd       t        ||||      \  }}t        |ddgddggd       t        |ddgd       g dg d	gg d	f}t        | \  }}}}t        |ddgddggd       t        |dgdggd       t        |ddgddggd       t        |dgdggd       t        ||||      \  }}t        |g dg d	gd       t        |g d	d       g d
g d
gg df}t        | \  }}}}t        |g dg dg dgd       t        |dgdgdggd       t        |g d
g d
gd       t        |dgdggd       t        ||||      \  }}t        |g dg dgd       t        |g dd       t        j                  dddggt
              ddgf}t        | \  }}}}t        |dggd       t        |dggd       t        |dgdggd       t        |dgdggd       t        ||||      \  }}t        |ddgddggd       t        |ddgd       t        j                  ddgg d
gt
              g df}t        | \  }}}}t        |ddgddggd       t        |dgdggd       t        |ddgddggd       t        |dgdggd       t        ||||      \  }}t        |g dg d
gd       t        |g dd       y )NrX   rF   ro   r   r   r   rZ   )rX   r   rX   r   )rX   rF   rP   r   )ro   rY   rr   )rX   r   r   r   rX   r   )r   rX   rF   rP   rP   )dtyperb   ighe99irY   )rX   rb   rc   r   rr   )r   rX   rY   )r
   r   r	   r   rQ   objectr   s           r*   test_simo_round_tripzTestSS2TF.test_simo_round_trip3  sp   1v1vA'BZ
1aRD6.QC5u-QC";U3QC!:E2Aq!$Sq!fq!f-E:aV%0)$i0BZ
1aRHq!f-E:QC!:E2RGaV,59QC!:E2Aq!$Si3%@YU3)$l3BZ
1aL)Y?eLQC!qc?7Iy1>QC!:E2Aq!$SlL9F\6hhAq6{&1Aq6:BZ
1aRD6.QC5u-QC";U3QC!:E2Aq!$Sq!fq!f-E:aV%0hhB+6:IFBZ
1aRHq!f-E:QC!:E2QGb"X.U;QC!:E2Aq!$Sj)45AYU3r,   c                     g dg dg dg}dgdgdgg}g dg}dgg}t        ||||      \  }}t        |g dgdd	
       t        |g dd       y )Nr   )r   r   rX   )rY   rr   ro   r   rX   )rc   rX   r   )        r   r   r   r   r   r%   r&   )r   r         @r   r   )r	   r   )r6   r7   r8   r   r   r   r   s          r*   test_all_int_arrayszTestSS2TF.test_all_int_arraysl  sb    	<0S1#sOKSEAq!$S23%eL1>r,   c                 <   t        j                  g dg dg dg dg      }t        j                  dgdgdgdgg      }t        j                  g dg d	g d
g      }t        j                  dgdgdgg      }t        ||||      \  }}t        |||d   |d         \  }}t        |||d   |d         \  }	}
t        |||d   |d         \  }}t        ||d       t        |
|d       t        ||d       t        |t        j                  ||	|f      dd       y )N)      r   r   r   )r   r   r   r   )g      r   r   r   )g              @r   r   333333?r   g      @)r   r   r   r   )r   r   r   r   )r   r   r   r   r   r   rX   rF   r   r   r   r   )r   rQ   r	   r   vstack)r6   r7   r8   r   r   b_allr   b0a0b1a1b2a2s                r*   test_multioutputzTestSS2TF.test_multioutputu  s;    HH++++- . HHseeee  HH***, - HHseee 
 Aq!$q q!QqT1Q4(Bq!QqT1Q4(Bq!QqT1Q4(B 	AE*AE*AE*ryy"b"6UOr,   N)
r   r   r   r   r   r   r   r   r   r   r   r,   r*   r   r      s'    #.+1074r?$Pr,   r   c                   L    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zy)TestLsimrV   c                     t               5 }|j                  t               t        | }d d d        |S # 1 sw Y   S xY wN)r   filterr   r   )r6   argssupsystems       r*   
lti_nowarnzTestLsim.lti_nowarn  s8     CJJ'$ZF !  ! s   3=c                    | j                  dddd      }t        j                  dd      }t        j                  |      }t	        |||dg      \  }}}t        j
                  |       }t        ||       t        ||       y Nr   r   r   r   rc   X0r   r   linspace
zeros_liker   expr   r6   r   tutoutyx
expected_xs           r*   test_first_orderzTestLsim.test_first_order  sq     R2.KK!MM!&!QC51
aVVTE]
Az*Az*r,   c                    t        j                  ddd      }t        j                  |      }| j                  dgg d      }t	        |||ddg      \  }}}d|z
  t        j
                  |       z  }t        |d d df   |       y )Nr   r_   i  r   r   r   r   r   r   )r   r   r   r   r   r   r   )r6   r   r   r   r   r   r   r   s           r*   test_second_orderzTestLsim.test_second_order  sz    KK2t$MM! #8&!QC:6
aDjBFFD5M1
AadGZ0r,   c                     | j                  dddd      }t        j                  dd      }|}t        |||      \  }}}d|dz  z  }t	        ||| j
                         t	        ||| j
                         y )Nr   r   r   rc         ?rF   decimal)r   r   r   r   r   digits_accuracyr   s           r*   test_integratorzTestLsim.test_integrator  sp    RR0KK!&!Q'
a47]
Az43G3GHAz43G3GHr,   c                 t   t        j                  ddgddgg      }t        j                  ddgddgg      }t        j                  ddg      }t        j                  d      }| j                  ||||      }t        j                  ddd      }t        j                  t        |      d	f      }t        |||ddg
      \  }}	}
t        j                  |       }t        j                  |       }t        j                  d|z        }t        |	|       t        |
d d df   |       t        |
d d df   |       y )Nr   r          r   rX   rF   r   g      $@   rF   )UTr   rX   	r   rQ   r   r   r   r   r   r   r   r6   r7   r8   r   r   r   r   r   r   r   r   
expected_yexpected_x0expected_x1s                 r*   test_two_stateszTestLsim.test_two_states  s   HHtSkC;/0HHsCj3*-.HHc3Z HHVAq!,KK4$HHc!fa[!&ASz:
aVVTE]
ffdUmffTD[)Az*AadG[1AadG[1r,   c                    t        j                  ddgddgg      }t        j                  dgdgg      }t        j                  ddgg      }| j                  |||d      }t        j                  dd      }t        j                  |      }t        |||      \  }}}	t        j                  t        j                  d|dz  z  |g            }
|dz  }t        |	|
| j                         t        ||| j                         y )	Nr   r   r   r   rc   r   rF   r   )	r   rQ   r   r   	ones_liker   	transposer   r   )r6   r7   r8   r   r   r   r   r   r   r   r   r   s               r*   test_double_integratorzTestLsim.test_double_integrator  s    HHr2hR)*HHrdRD\"HHr2hZ Aq"-KK!LLO&!Q'
a\\"((C$'M4+@"AB
1W
Az43G3GHAz43G3GHr,   c                    t        j                  ddgddgg      }t        j                  dgdgg      }t        j                  ddgg      }| j                  |||d      }t        j                  dd      }t        j                  |      }t        |||ddg      \  }}}	|t        j                  |       z  }
t        ||
       y r   )r   rQ   r   r   r   r   r   r   )r6   r7   r8   r   r   r   r   r   r   r   r   s              r*   test_jordan_blockzTestLsim.test_jordan_block  s     HHsBi"c+,HHrdRD\"HHr2hZ Aq"-KK!MM!&!QC:6
aBFFD5M)
Az*r,   c                 t   t        j                  ddgddgg      }t        j                  ddgddgg      }t        j                  ddg      }t        j                  d      }| j                  ||||      }t        j                  ddd      }t        j                  t        |      d	f      }t        |||ddg
      \  }}	}
t        j                  |       }t        j                  |       }t        j                  d|z        }t        |	|       t        |
d d df   |       t        |
d d df   |       y )Nr   r   r   r   r   r   r   e   rF   r   rX   r   r   s                 r*   	test_misozTestLsim.test_miso  s   HHtSkC;/0HHsCj3*-.HHc3Z HHUOAq!,KK3$HHc!fa[!&!QC:6
aVVTE]
ffdUmffT$Y'Az*AacFK0AacFK0r,   c                     | j                  dddd      }t        j                  dd      }t        j                  |      }t	        |||dg      \  }}}t        j
                  |       }t        ||       y )Nr   r   r   rX   rF   r   r   )r6   r   r   r   r   r   r   r   s           r*   test_nonzero_initial_timez"TestLsim.test_nonzero_initial_time  se    R2.KK!MM!&!QC51
aVVTE]
Az*r,   c                     t        j                  g d      }t        j                  g d      }dgddgf}t        t        d      5  t	        |||dg      \  }}}d d d        y # 1 sw Y   y xY w)N)r   r   r   r   )r   r   r   r   r   r   z"Time steps are not equally spaced.)matchr   )r   rQ   r   r!   r   )r6   r   r   r   r   r   r   s          r*   test_nonequal_timestepsz TestLsim.test_nonequal_timesteps  si    HH)*HH)*%#s$:!EGfau5JD!QG G Gs   A%%A.N)r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r   r,   r*   r   r     s;    O	+	1I2&I+ 1$+6r,   r   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestImpulsec                 r    dgddgf}t        |      \  }}t        j                  |       }t        ||       y Nr   r   r   r   r   r6   r   r   r   r   s        r*   r   zTestImpulse.test_first_order  s:     %#c#&/aVVTE]
Az*r,   c                     dgddgf}d}t        j                  dd|      }t        ||      \  }}t        |j                  |f       t        ||       t        j                  |       }t        ||       y )Nr   r   r   r   r   )r   r   r   r   r   r   r   r6   r   nr   r   r   r   s          r*   test_first_order_fixed_timez'TestImpulse.test_first_order_fixed_time#  sn    
 %#c#KK3"&A&aTZZ!&D!$VVQBZ
Az*r,   c                 |    dgddgf}t        |d      \  }}dt        j                  |       z  }t        ||       y Nr   r   r   r   r  r  s        r*   test_first_order_initialz$TestImpulse.test_first_order_initial1  sB    
 %#c#&S)a2664%=(
Az*r,   c                 ~    dgddgf}t        |dg      \  }}dt        j                  |       z  }t        ||       y r  r  r  s        r*   test_first_order_initial_listz)TestImpulse.test_first_order_initial_list;  sD    
 %#c#&cU+a2664%=(
Az*r,   c                 p    dgddgf}t        |      \  }}t        j                  |      }t        ||       y Nr   r   )r   r   r  r   r  s        r*   r   zTestImpulse.test_integratorE  s7    %#c#&/a\\$'
Az*r,   c                 x    dgg df}t        |      \  }}|t        j                  |       z  }t        ||       y )Nr   r   r  r  s        r*   r   zTestImpulse.test_second_orderL  s;     %)&/aBFFD5M)
Az*r,   c                 `    dgg df}t        |dgddg      \  }}t        |dgdg      \  }}y )Nr   r   rP   rc   rb   r   r   r   r6   r   r   r   s       r*   test_array_likezTestImpulse.test_array_likeU  s<    %)&aSQF3a&aSQC0ar,   c                 4    dgg df}t        |dd      \  }}y )Nr   r   rP   rc   r"  r#  r$  s       r*   test_array_like2zTestImpulse.test_array_like2\  s     %)&Q!,ar,   N)r   r   r   r   r  r  r  r   r   r%  r'  r   r,   r*   r  r    s*    ++++++1-r,   r  c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
TestStepc                 x    dgddgf}t        |      \  }}dt        j                  |       z
  }t        ||       y r  r   r   r   r   r  s        r*   r   zTestStep.test_first_orderb  s?     %#c#v,a2664%=(
Az*r,   c                     dgddgf}d}t        j                  dd|      }t        ||      \  }}t        |j                  |f       t        ||       dt        j                  |       z
  }t        ||       y )Nr   r   r   r   r  rX   )r   r   r   r   r   r   r   r  s          r*   r  z$TestStep.test_first_order_fixed_timej  sr    
 %#c#KK3"v#aTZZ!&D!$^
Az*r,   c                     dgddgf}t        |d      \  }}ddt        j                  |       z  z   }t        ||       y Nr   r   r   rX   r   r+  r  s        r*   r  z!TestStep.test_first_order_initialx  sG    
 %#c#v#&aRVVTE]**
Az*r,   c                     dgddgf}t        |dg      \  }}ddt        j                  |       z  z   }t        ||       y r.  r+  r  s        r*   r  z&TestStep.test_first_order_initial_list  sI    
 %#c#v3%(aRVVTE]**
Az*r,   c                 J    dgddgf}t        |      \  }}|}t        ||       y r  )r   r   r  s        r*   r   zTestStep.test_integrator  s0     %S	"v,a
Az*r,   c                     dgg df}t        |      \  }}dd|z   t        j                  |       z  z
  }t        ||       y )Nr   r   rX   r+  r  s        r*   r   zTestStep.test_second_order  sD     %)v,a!d(bffdUm33
Az*r,   c                 6    dgg df}t        |ddg      \  }}y )Nr   r   rc   rb   r  r   r$  s       r*   r%  zTestStep.test_array_like  s"    %)v!Q(ar,   c                 "    t        g dgdf       y )NrZ   y      ?        r3  r6   s    r*   test_complex_inputzTestStep.test_complex_input  s     	b2$r,   N)r   r   r   r   r  r  r  r   r   r%  r6  r   r,   r*   r)  r)  a  s*    ++++++)r,   r)  c                       e Zd Zd Zy)TestLtic                    t        dgdg      }t        t        |t                     t        t        |t                      t        t        |t                      t        |j
                  d u        t        t        j                  g       t        j                  dg      d      }t        t        |t                     t        t        |t                      t        t        |t                      t        |j
                  d u        t        g dgd      }t        dgdgdd      }t        t        |t                     t        t        |t                      t        t        |t                      t        |j
                  d u        y )NrX   rZ   rP   )
r   r   
isinstancer   r   dtr   rQ   r   r   r6   ss     r*   test_lti_instantiationzTestLti.test_lti_instantiation  s   
 bTN
1./0
1c"#Jq$''( bhhtna0
1n-.
1c"#Jq$''( RD!bT1a 
1j)*
1c"#Jq$''(r,   N)r   r   r   r>  r   r,   r*   r8  r8    s    r,   r8  c                   $    e Zd Zd Zd Zd Zd Zy)TestStateSpacec                    t        dddd       t        dgdgdgdg       t        t        j                  ddgddgg      t        j                  dgdgg      t        j                  ddgg      t        j                  dgg             y )NrX   rF   rP   rB   r   )r   r   rQ   r5  s    r*   test_initializationz"TestStateSpace.test_initialization  sy    1aAA3aS1#&288aVaV,-rxx!qc
/C88aVH%rxx!	8r,   c                 l   t        dddd      }t        t        |j                         t                      t        t        |j	                         t
                     t        t        |j                         t                     t        t        |      |u       t        |j                         |u       y )NrX   rF   rP   rB   )r   r   r:  to_ssto_tfr   to_zpkr   r<  s     r*   test_conversionzTestStateSpace.test_conversion  sx    q!Q"
1779j12
1779&678
188:~67 	
1Q&'	"#r,   c                     t        dddd      }t        |j                  dg       t        |j                  dg       t	        |j
                  d u        y NrX   r   )r   r   polesr   r   r;  r<  s     r*   test_propertieszTestStateSpace.test_properties  sD    
 q!Q"QWWqc"QWWqc"r,   c                     G d d      }t        t        j                  ddgddgg      t        j                  dgdgg      t        j                  ddgg      t        j                  dgg            }t        t        j                  d	d
gdd
gg      t        j                  dgdgg      t        j                  ddgg      t        j                  dgg            }|j                  d      }|j                  d      }|j                  d      }t        j                  ddd      }t        j
                  |      }d|d<   t        t        t        t        j                  t        j                  t        j                  fD ]  }	t        t         |	d      |z  ||      d    |	d      t        |||      d   z         t        t        | |	d      z  ||      d   t        |||      d    |	d      z         t        t        | |	d      z  ||      d   t        |||      d    |	d      z         t        t              5   |	d      |z   d d d         t        t        |dz  ||      d   t        |d|z  |      d          t        t        ||z  ||      d   t        |t        |||      d   |      d   d       t        t              5  ||z   d d d        t        t              5  ||z   d d d        t        t              5  ||z   d d d        t        t              5  | |       z   d d d        t        t              5   |       |z   d d d        t        t              5  | |       z   d d d        t        t              5   |       |z   d d d        t        t        |dz   ||      d   d|z  t        |||      d   z          t        t              5  |t        j                  ddg      z    d d d        t        t              5  t        j                  ddg      |z    d d d        t        t              5  ||z    d d d        t        t              5  |t        j                  ddgddgg      z   d d d        t        t              5  ||z    d d d        t        t              5  | |       z    d d d        t        t              5   |       |z    d d d        t        t        ||z   ||      d   t        |||      d   t        |||      d   z          t        t        |dz
  ||      d   d|z  t        |||      d   z          t        t        d|z
  ||      d   d|z  t        | ||      d   z          t        t        ||z
  ||      d   t        |||      d   t        |||      d   z
         t        t              5  | |       z
   d d d        t        t              5   |       |z
   d d d        ||z   }
t!        |
j"                  dk(         ||z  }
t!        |
j"                  dk(         d|z  }
t!        |
j"                  dk(         | }
t!        |
j"                  dk(         y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   vxY w# 1 sw Y   axY w# 1 sw Y   LxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   qxY w# 1 sw Y   \xY w# 1 sw Y   bxY w# 1 sw Y   MxY w)Nc                       e Zd Zy).TestStateSpace.test_operators.<locals>.BadTypeN)r   r   r   r   r,   r*   BadTyperN    s    r,   rO  rI   gffffff?r   grX   r   rH   gg?皙?g?d   rF   )r   r   gh㈵>)r&   rP   rB   ro   )r   r   rQ   to_discreter   r   intfloatcomplexfloat32
complex128r   r   r   	TypeErrorr!   r   r;  )r6   rO  s1s2
s_discretes2_discretes3_discreter   r   typr=  s              r*   test_operatorszTestStateSpace.test_operators  sR   	 	 4+T{!;<1#s,1a&*1# 4,d!<=1#s,1a&*1# ^^C(
nnS)nnS) KK1c"MM!! R]]BHHMCDQ"Q7:FT"Q%7%::< Dc!fQ7: qA.q1CF:< Dc!fQ7: qA.q1CF:< y)A *) N 	R!VqA.q1R1q5A.q1	3 	R"WQ/2R4a1#5a#8A>qA!	# 9%G & 9%O & 9%$ & 9%N & 9%IN & 9%N & 9%IN & 	R!VqA.q1AR1 21 55	7 :&1a&!! ' :&HHaVr! ' 9%O & :&Aq6Aq6*++ ' 9%$ & 9%N & 9%IN & 	R"WQ/2R1*1-R10B10EE	G 	R!VqA.q1QbA!3A!66	8 	QVqA.q1AbSA 3A 66	8 	R"WQ/2R1*1-R10B10EE	G 9%N & 9%IN & $$
NKq *) &% &% &% &% &% &% &% '& '& &% '& &% &% &%  &% &%s   ZZ5Z)Z6/[[3[[**[7\\+\!\+>\8 ]']	]Z	Z&)Z36[ [[['*[47\\\\(+\58]]]])N)r   r   r   rB  rG  rK  r_  r   r,   r*   r@  r@    s    8	$~r,   r@  c                       e Zd Zd Zd Zd Zy)TestTransferFunctionc                     t        dd       t        dgdg       t        t        j                  dg      t        j                  dg             y NrX   rF   )r   r   rQ   r5  s    r*   rB  z(TestTransferFunction.test_initializationd  s8    A!qc"1#!6r,   c                 p   t        ddgddg      }t        t        |j                         t                     t        t        |j                         t                      t        t        |j                         t                     t        t        |      |u       t        |j                         |u       y NrX   r   rZ   )r   r   r:  rD  r   rE  rF  r   r<  s     r*   rG  z$TestTransferFunction.test_conversionj  s~    aVaW-
1779j12
1779&678
188:~67 	 #1,-	"#r,   c                     t        ddgddg      }t        |j                  dg       t        |j                  dg       y re  )r   r   rJ  r   r<  s     r*   rK  z$TestTransferFunction.test_propertiesu  s8    
 aVaW-QWWqc"QWWqc"r,   N)r   r   r   rB  rG  rK  r   r,   r*   ra  ra  c  s    7	$#r,   ra  c                       e Zd Zd Zd Zy)TestZerosPolesGainc                     t        ddd       t        dgdgd       t        t        j                  dg      t        j                  dg      d       y rc  )r   r   rQ   r5  s    r*   rB  z&TestZerosPolesGain.test_initialization  s>    q!QsQC#rxx}bhhsmQ7r,   c                 j   t        ddd      }t        t        |j                         t                     t        t        |j                         t                     t        t        |j                         t                      t        t        |      |u       t        |j                         |u       y )NrX   rF   rP   )r   r   r:  rD  r   rE  r   rF  r<  s     r*   rG  z"TestZerosPolesGain.test_conversion  sw    1a#
1779j12
1779&678
188:~67 	q!*+
!#$r,   N)r   r   r   rB  rG  r   r,   r*   rh  rh    s    8	%r,   rh  c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)Test_abcd_normalizec                     t        j                  ddgddgg      | _        t        j                  dgdgg      | _        t        j                  ddgg      | _        t        j                  dgg      | _        y )Nr   r   r   r   r   r         @)r   rQ   r7   r8   r   r   r5  s    r*   setup_methodz Test_abcd_normalize.setup_method  sa    C:Sz23D6C5/*C:,'C5'"r,   c                 ,    t        t        t               y r   )r   r!   r   r5  s    r*   test_no_matrix_failsz(Test_abcd_normalize.test_no_matrix_fails  s    j.1r,   c                 t    t        t        t        ddg| j                  | j                  | j
                         y )NrX   rZ   )r   r!   r   r8   r   r   r5  s    r*   test_A_nosquare_failsz)Test_abcd_normalize.test_A_nosquare_fails  s'    j.1b'ffdffdff	.r,   c                 t    t        t        t        | j                  ddg| j                  | j
                         y NrZ   rc   r   r!   r   r7   r   r   r5  s    r*   test_AB_mismatch_failsz*Test_abcd_normalize.test_AB_mismatch_fails  '    j.$&&2q'ffdff	&r,   c                 x    t        t        t        | j                  | j                  dgdgg| j
                         y )Nr   r   )r   r!   r   r7   r8   r   r5  s    r*   test_AC_mismatch_failsz*Test_abcd_normalize.test_AC_mismatch_fails  s+    j.$&&$&&usendff	.r,   c           	      t    t        t        t        | j                  | j                  | j
                  ddg       y )Nrn  r   )r   r!   r   r7   r8   r   r5  s    r*   test_CD_mismatch_failsz*Test_abcd_normalize.test_CD_mismatch_fails  s'    j.$&&$&&ffsAh	(r,   c                 t    t        t        t        | j                  ddg| j                  | j
                         y ru  rv  r5  s    r*   test_BD_mismatch_failsz*Test_abcd_normalize.test_BD_mismatch_fails  rx  r,   c                 *   t        | j                  | j                  | j                  | j                        \  }}}}t        || j                         t        || j                         t        || j                         t        || j                         y r   )r   r7   r8   r   r   r   r6   r7   r8   r   r   s        r*   "test_normalized_matrices_unchangedz6Test_abcd_normalize.test_normalized_matrices_unchanged  sb    #DFFDFFDFFDFFC
1aQQQQr,   c                    t        | j                  | j                  ddgd      \  }}}}t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  d   |j                  d          y rI  )r   r7   r8   r   r   r  s        r*   r   zTest_abcd_normalize.test_shapes  s    #DFFDFFQFA>
1aQWWQZ,QWWQZ,QWWQZ,QWWQZ,QWWQZ,r,   c                    t        j                  d      }t        j                  d      }t        | j                  ||      \  }}}}t	        || j                         t	        ||       t	        ||       t	        |j
                  d   |j
                  d          t	        |j
                  d   | j                  j
                  d          y )NrF   r   )r   r   r7   r8   r   r   rX   r   r   r   r7   r   r   )r6   B_D_r7   r8   r   r   s          r*    test_zero_dimension_is_not_none1z4Test_abcd_normalize.test_zero_dimension_is_not_none1  s    XXfXXf#dffb9
1aQQQQWWQZ!-QWWQZa1r,   c                    t        j                  d      }t        j                  d      }t        | j                  ||      \  }}}}t	        || j                         t	        ||       t	        ||       t	        |j
                  d   |j
                  d          t	        |j
                  d   |j
                  d          y )Nr  )r   rF   r7   r8   r   r   rX   r  )r6   r  C_r7   r8   r   r   s          r*    test_zero_dimension_is_not_none2z4Test_abcd_normalize.test_zero_dimension_is_not_none2  s    XXfXXf#dffb9
1aQQQQWWQZ!-QWWQZ!-r,   c                    t        | j                  | j                  | j                        \  }}}}t	        |j
                  d   |j
                  d          t	        |j
                  d   |j
                  d          t	        |j
                  | j                  j
                  d   | j                  j
                  d   f       y )N)r8   r   r   r   rX   )r   r8   r   r   r   r   r  s        r*   test_missing_Az"Test_abcd_normalize.test_missing_A      #dff$&&A
1aQWWQZ,QWWQZ,QWWtvv||AQ@Ar,   c                    t        | j                  | j                  | j                        \  }}}}t	        |j
                  d   |j
                  d          t	        |j
                  d   |j
                  d          t	        |j
                  | j                  j
                  d   | j                  j
                  d   f       y )N)r7   r   r   r   rX   )r   r7   r   r   r   r   r  s        r*   test_missing_Bz"Test_abcd_normalize.test_missing_B  r  r,   c                    t        | j                  | j                  | j                        \  }}}}t	        |j
                  d   |j
                  d          t	        |j
                  d   |j
                  d          t	        |j
                  | j                  j
                  d   | j                  j
                  d   f       y )Nr  r   rX   )r   r7   r8   r   r   r   r  s        r*   test_missing_Cz"Test_abcd_normalize.test_missing_C  r  r,   c                    t        | j                  | j                  | j                        \  }}}}t	        |j
                  d   |j
                  d          t	        |j
                  d   |j
                  d          t	        |j
                  | j                  j
                  d   | j                  j
                  d   f       y )Nr  r   rX   )r   r7   r8   r   r   r   r  s        r*   test_missing_Dz"Test_abcd_normalize.test_missing_D  r  r,   c                 L   t        | j                  | j                        \  }}}}t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  | j                  j                  d   | j                  j                  d   f       t        |j                  | j                  j                  d   | j                  j                  d   f       y )N)r   r   r   rX   )r   r   r   r   r   r  s        r*   test_missing_ABz#Test_abcd_normalize.test_missing_AB  s    #dff7
1aQWWQZ,QWWQZ,QWWQZ,QWWtvv||AQ@AQWWtvv||AQ@Ar,   c                    t        | j                  | j                        \  }}}}t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  | j                  j                  d   | j                  j                  d   f       t        |j                  | j                  j                  d   | j                  j                  d   f       y )N)r8   r   r   rX   )r   r8   r   r   r   r  s        r*   test_missing_ACz#Test_abcd_normalize.test_missing_AC      #dff7
1aQWWQZ,QWWQZ,QWWQZ,QWWQZ,QWWtvv||AQ@AQWWtvv||AQ@Ar,   c                    t        | j                  | j                        \  }}}}t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  | j                  j                  d   | j                  j                  d   f       t        |j                  | j                  j                  d   | j                  j                  d   f       y )N)r8   r   r   rX   )r   r8   r   r   r   r  s        r*   test_missing_ADz#Test_abcd_normalize.test_missing_AD  r  r,   c                    t        | j                  | j                        \  }}}}t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  d   |j                  d          t        |j                  | j                  j                  d   | j                  j                  d   f       t        |j                  | j                  j                  d   | j                  j                  d   f       y )N)r7   r   r   rX   )r   r7   r   r   r   r  s        r*   test_missing_BCz#Test_abcd_normalize.test_missing_BC  r  r,   c                 D    t        t        t        | j                         y )N)r   )r   r!   r   r   r5  s    r*   test_missing_ABC_failsz*Test_abcd_normalize.test_missing_ABC_fails  s    j.DFF;r,   c                 Z    t        t        t        | j                  | j                         y )N)r7   r   )r   r!   r   r7   r   r5  s    r*   test_missing_BD_failsz)Test_abcd_normalize.test_missing_BD_fails      j.DFFdffEr,   c                 Z    t        t        t        | j                  | j                         y )N)r7   r8   )r   r!   r   r7   r8   r5  s    r*   test_missing_CD_failsz)Test_abcd_normalize.test_missing_CD_fails  r  r,   N)r   r   r   ro  rq  rs  rw  rz  r|  r~  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r   r,   r*   rl  rl    sz    #2.&.(& -2.BBBBBBBB<FFr,   rl  c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)	Test_bodec                 p    t        dgddg      }g d}t        ||      \  }}}g d}t        ||d       y )NrX   rP  rX   r_   rQ  r   )r   rY   re   rk   r   r   r   r   )r6   r   r   magphaseexpected_mags         r*   test_01zTest_bode.test_01  s>     aS1a&!Vq)3(Cq9r,   c                 p    t        dgddg      }g d}t        ||      \  }}}g d}t        ||d       y )NrX   rP  rX   r_   r  )gig33333Ur   r  )r6   r   r   r  r  expected_phases         r*   test_02zTest_bode.test_02(  s>     aS1a&!Vq)3+E>1=r,   c                 2   t        dgddg      }g d}t        ||      \  }}}|dz  }t        j                  |j                  |      t        j                  |j
                  |      z  }dt        j                  t        |            z  }t        ||       y )NrX   r  r                ?g      4@)	r   r   r   polyvalr   r   log10absr   )r6   r   r   r  r  jwr   r  s           r*   test_03zTest_bode.test_034  s     aS1a&!Vq)3VJJvzz2&FJJ)CCbhhs1v..C.r,   c                 l   t        dgddg      }g d}t        ||      \  }}}|dz  }t        j                  |j                  |      t        j                  |j
                  |      z  }t        j                  |j                  |j                        dz  t        j                  z  }t        ||       y )NrX   r  r  r  g     f@)r   r   r   r  r   r   arctan2r   r   pir   )r6   r   r   r  r  r  r   r  s           r*   test_04zTest_bode.test_04?  s     aS1a&!Vq)3VJJvzz2&FJJ)CCAFFAFF3e;beeCE>2r,   c                     t        dgddg      }d}t        j                  dd|      }t        ||      \  }}}t	        ||       y NrX   r_   ro   r  )r   r   logspacer   r   )r6   r   r  
expected_wr   r  r  s          r*   test_05zTest_bode.test_05J  sI     aS1a&![[Q*
Vq)3Az*r,   c                 b    t        dgddg      }t        |d      \  }}}t        |d   d       y NrX   r   rF   r  g{Gz?)r   r   r   r6   r   r   r  r  s        r*   test_06zTest_bode.test_06T  s6     aS1a&!Vq)3QqT4 r,   c                 D    t        dgg d      }t        |d      \  }}}y )NrX   )rX   r   rQ  rF   r  )r   r   r  s        r*   test_07zTest_bode.test_07[  s$     aS+&Vq)3r,   c                     t        g g dd      }|j                  t        j                  ddd            \  }}}t	        t        |      dd	       y )
N)r^   rf   rk   rl   rm   rX   rY   rg   rQ  r  i>   r   )r   r   r   r  r   minr  s        r*   test_08zTest_bode.test_08a  sD    R2A6bkk"b#&>?3CJb9r,   c           	      *   t        j                  g d      }t        j                  |      j                  }t        j                  dgdgdgg      }t        j                  g dg      }t        j                  dgg      }t               5 }|j                  t               t        ||||      }t        |d      \  }}	}
d d d        dt        j                  t        j                  dddz  z   z              z  }t        	|       y # 1 sw Y   JxY w)	Nr   r   r   r   r   r   r   r   r   rQ  r     rb   )r   rQ   r0   	companionr   r   r   r   r   r   r  sqrtr   )r6   r   r7   r8   r   r   r   r   r   r  r  expected_magnitudes               r*   test_from_state_spacezTest_bode.test_from_state_spaceg  s     HH)*Q!!HHsecUSE*+HHo&'HHseW CJJ'Aq!_F 3/MAsE !
  "((2773#1*3E+F"GGC!34 ! s   5D		DN)r   r   r   r  r  r  r  r  r  r  r  r  r   r,   r*   r  r    s/    :
>	/	3+!*:5r,   r  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)Test_freqrespc                     t        dgddg      }g d}t        ||      \  }}g d}g d}t        |j                  |d       t        |j                  |d       y )NrX   r  r  )gGz?r   gׁsF?)MbXrI   r  r   r   r   r   r   r   )r6   r   r   Hexpected_reexpected_ims         r*   test_output_manualz Test_freqresp.test_output_manual~  sU     aS1a&!!$1),AFFK;AFFK;r,   c                 V   t        dgddg      }g d}t        ||      \  }}|dz  }t        j                  |j                  |      t        j                  |j
                  |      z  }t        |j                  |j                         t        |j                  |j                         y )NrX   r  r  r  )	r   r   r   r  r   r   r   r   r   r6   r   r   r  r=  r<   s         r*   test_outputzTest_freqresp.test_output  s     aS1a&!!$1F::fjj!,rzz&**a/HHAFFHMM2AFFHMM2r,   c                     t        dgddg      }d}t        j                  dd|      }t        ||      \  }}t	        ||       y r  )r   r   r  r   r   )r6   r   r  r  r   r  s         r*   test_freq_rangezTest_freqresp.test_freq_range  sG     aS1a&![[Q*
!$1Az*r,   c                 `    t        dgddg      }t        |d      \  }}t        |d   d       y r  )r   r   r   )r6   r   r   r  s       r*   test_pole_zerozTest_freqresp.test_pole_zero  s4     aS1a&!!$1QqT4 r,   c                 f   t        j                  g d      }t        j                  |      j                  }t        j                  dgdgdgg      }t        j                  g dg      }t        j                  dgg      }t               5 }|j                  t               t        ||||      }t        |d      \  }}	d d d        dz  }
ddd|
z  z   d|
dz  z  z   |
d	z  z   z  }t        	j                  |j                         t        |	j                  |j                         y # 1 sw Y   ixY w)
Nr  r   r   r  rQ  r  r  rF   rP   )r   rQ   r0   r  r   r   r   r   r   r   r   r   r   )r6   r   r7   r8   r   r   r   r   r   r  r=  r<   s               r*   r  z#Test_freqresp.test_from_state_space  s     HH)*Q!!HHseSE3%()HHo&'HHseW CJJ'Aq!_FFc*DAq ! F319qAv-145AFFHMM2AFFHMM2 ! s   4D''D0c                     t        g dgdz  dg      }g d}t        ||      \  }}|dz  }d|dz   dz  z  }t        |j                  |j                         t        |j                  |j                         y )NrZ   rB   rX   r  r  r  r  r  s         r*   test_from_zpkzTest_freqresp.test_from_zpk  sk    RQs#!$1FAz>AFFHMM2AFFHMM2r,   N)	r   r   r   r  r  r  r  r  r  r   r,   r*   r  r  |  s     <	3+!3*3r,   r  ):0yE>r  ),r   numpyr   numpy.testingr   r   r   r   r   pytestr   r   scipy.signalr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   scipy.signal._filter_designr   scipy.linalgr0   r+   r.   r   r   r  r)  r8  r@  ra  rh  rl  r  r  r   r,   r*   <module>r     s     7 7 *H H H H 8 N*V@ V@r[P [P|{6 {6|D- D-NF FR 8[ [z# #8% %&CF CFLa5 a5HI3 I3r,   