U
    »mœdå9  ã                   @   sš   d dl Zd dlmZmZmZmZ d dlZd dlm	Z
 d dlmZmZmZmZmZ d dlmZmZmZmZmZ G dd„ dƒZG dd	„ d	ƒZG d
d„ dƒZdS )é    N)Úassert_array_almost_equalÚassert_almost_equalÚassert_allcloseÚassert_equal)Úcont2discrete)ÚdlsimÚss2tfÚss2zpkÚlsim2Últi)Útf2ssÚimpulse2ÚdimpulseÚstep2Údstepc                   @   st   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestC2Dc                 C   s¼   t  d¡}t  dd¡}t  ddgddgddgg¡}t  dgdgdgg¡}d	t  d¡ }t  dd
¡}d}t||||f|dd�\}}	}
}}t||ƒ t||	ƒ t||
ƒ t||ƒ t||ƒ d S )Né   ©r   é   ç      à?ç      è?ç      ð?ç      Ð?ç        ç…ëQ¸Õ¿ç›Ž)aú?g6<SÂÔ?Úzoh©Úmethod©ÚnpÚeyeÚfullÚarrayÚc2dr   r   )ÚselfÚacÚbcÚccÚdcÚad_truthÚbd_truthÚdt_requestedÚadÚbdÚcdÚddÚdt© r2   ú^/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/signal/tests/test_cont2discrete.pyÚtest_zoh   s    
 



zTestC2D.test_zohc                 C   sÖ   t  d¡}t  dd¡}t  ddgddgddgg¡}t  dgdgdgg¡}d	t  d¡ }t  dd
¡}|}t  dgdgdgg¡}d}	t||||f|	dd�\}
}}}}t||
ƒ t||ƒ t||ƒ t||ƒ t|	|ƒ d S )Nr   r   r   r   r   r   r   r   r   gm†²çïÚ?g>.Òâ"¨Ð?gÙ4ðpL	Ó?g.ÈªÑqÂ¿Úfohr   r   ©r%   r&   r'   r(   r)   r*   r+   Úcd_truthÚdd_truthr,   r-   r.   r/   r0   r1   r2   r2   r3   Útest_foh#   s$    
þ 



zTestC2D.test_fohc                 C   sÖ   t  d¡}t  dd¡}t  ddgddgddgg¡}t  dgdgdgg¡}dt  d¡ }t  dd	¡}|}t  d
gdgdgg¡}d}	t||||f|	dd�\}
}}}}t||
ƒ t||ƒ t||ƒ t||ƒ t|	|ƒ d S )Nr   r   r   r   r   r   r   r   g›Ž)aÚ?g      Ü?g      Ô?Úimpulser   r   r6   r2   r2   r3   Útest_impulse:   s"    
ÿ



zTestC2D.test_impulsec                 C   sê   t  d¡}t  dd¡}t  ddgddgddgg¡}t  dgdgdgg¡}d}d	}d
t  d¡ }t  dd¡}t  ddgddgddgg¡}	t  dgdgdgg¡}
t||||f|d|d�\}}}}}t||ƒ t||ƒ t|	|ƒ t|
|ƒ d S )Nr   r   r   r   r   r   r   r   çUUUUUUÕ?gš™™™™™ù?ç333333Ó?çÍÌÌÌÌÌì?ç333333ó?çffffffÆ?çš™™™™™É?ç=
×£p=Ê¿Úgbt©r   Úalpha©r    r!   r"   r#   r$   r   )r%   r&   r'   r(   r)   r,   rE   r*   r+   r7   r8   r-   r.   r/   r0   r1   r2   r2   r3   Útest_gbtP   s0    

þþ ÿ


zTestC2D.test_gbtc                 C   sÜ   t  d¡}t  dd¡}t  ddgddgddgg¡}t  dgdgdgg¡}d}d	t  d¡ }t  dd¡}t  ddgddgddgg¡}|}	t||||f|d
d�\}
}}}}t||
ƒ t||ƒ t||ƒ t|	|ƒ t||ƒ d S )Nr   r   r   r   r   r   r   r   ç      ø?Zeulerr   r   ©r%   r&   r'   r(   r)   r,   r*   r+   r7   r8   r-   r.   r/   r0   r1   r2   r2   r3   Ú
test_eulerj   s(    

þÿ



zTestC2D.test_eulerc                 C   sä   t  d¡}t  dd¡}t  ddgddgddgg¡}t  dgdgdgg¡}d}d	t  d¡ }t  dd¡}t  d
d	gd	d	gd	dgg¡}t  dgdgdgg¡}	t||||f|dd�\}
}}}}t||
ƒ t||ƒ t||ƒ t|	|ƒ d S )Nr   r   r   r   r   r   r   r   g       @rH   g      ì?gáz®GáÒ?Zbackward_diffr   rF   rI   r2   r2   r3   Útest_backward_diff‚   s,    

þþÿ


zTestC2D.test_backward_diffc                 C   s�  t  d¡}t  dd¡}t  ddgddgddgg¡}t  dgdgdgg¡}d}d	t  d¡ }t  dd
¡}t  ddgddgdd
gg¡}t  dgd
gdgg¡}	t||||f|dd�\}
}}}}t||
ƒ t||ƒ t||ƒ t|	|ƒ t||ƒ dt  d¡ }t  dd¡}t  ddgddgddgg¡}t  dgdgdgg¡}	d
}t||||f|dd�\}
}}}}t||
ƒ t||ƒ t||ƒ t|	|ƒ t||ƒ d S )Nr   r   r   r   r   r   r   r   g«ªªªªªú?r<   gUUUUUUõ?g±ªªªªªÒ?g>¿Xò‹%¿¿Úbilinearr   gffffffö?rA   r>   r?   r=   r@   rB   r   rI   r2   r2   r3   Útest_bilinear›   sH    

þþÿ




ÿ



zTestC2D.test_bilinearc           	      C   s€   t  dddg¡}t  dddg¡}t  dddgg¡}t  ddd	g¡}d}t||f|d
d�\}}}t||ƒ t||ƒ t||ƒ d S )Nr   r   r   r   r<   gN›îÕZÛ¿gÏ±†³)_Ì?gŽüø]OŸõ¿g–oü²hã?r   r   )r    r#   r$   r   r   )	r%   ZnumcZdencZnumdZdendr,   ÚnumÚdenr1   r2   r2   r3   Útest_transferfunctionÇ   s    

zTestC2D.test_transferfunctionc                 C   s”   t  ddg¡}t  dt  d¡ dt  d¡ g¡}d}ddg}d	d
g}d}d}t|||f|dd�\}}	}
}t||ƒ t||	ƒ t||
ƒ t||ƒ d S )Nr   g      à¿y              ð?r   y       €      ð¿r   gwÀÄRN½ó?g.-“.ˆç?y\9¨Oî?Æ„ò°(Ö?y\9¨Oî?Æ„ò°(Ö¿r   r   )r    r#   Úsqrtr$   r   r   )r%   Zzeros_cZpoles_cZk_cZzeros_dZpolls_dZk_dr,   ZzerosZpolesÚkr1   r2   r2   r3   Útest_zerospolesgainÖ   s     "ÿÿ


zTestC2D.test_zerospolesgainc                 C   s2  d}d}d}d}t ||||ƒ\}}t||||ƒ\}}}	d}
d}dd| |
 |  d||
 |   }|
| d||
 |   }|d||
 |   }||| |  }t ||||ƒ\}}t||f|
d|d�\}}}t||ƒ t||ƒ t||||ƒ\}}}t|||	f|
d|d�\}}}}t||ƒ t||ƒ t||ƒ dS )	z7Test method='gbt' with alpha=0.25 for tf and zpk cases.g      ð¿r   r   r   r   rC   rD   N)r   r	   r$   r   )r%   ÚAÚBÚCÚDZcnumZcdenÚczÚcpZckÚhrE   ZAdZBdZCdZDdZdnumZddenZc2dnumZc2ddenr1   ZdzZdpZdkZc2dzZc2dpZc2dkr2   r2   r3   Útest_gbt_with_sio_tf_and_zpkê   s*    $



z$TestC2D.test_gbt_with_sio_tf_and_zpkc                 C   s  dd„ }t  dgg¡}t  dgg¡}t  dgg¡}t  dgg¡}d}t  ddd¡}|d	 |d  }||ƒ}	t||||f||	|d
dd�\}}
}t||||f|dd�}d|	dd… |	d	d…   }|dd… }t|| dd	¡||d�\}}}d|
dd… |
d	d…   }t| ¡ |dd� dS )a  
        Test that the solution to the discrete approximation of a continuous
        system actually approximates the solution to the continuous system.
        This is an indirect test of the correctness of the implementation
        of cont2discrete.
        c                 S   s   t  d|  ¡S )Ng      @)r    Úsin)Útr2   r2   r3   Úu  s    z'TestC2D.test_discrete_approx.<locals>.ug{®Gáz„¿r   rA   r   g      $@ée   r   ç•Ö&è.>ç•dyáý¥=)ÚTÚUZX0ÚrtolÚatolrL   r   r   Néÿÿÿÿ)r^   r]   Úx0g-Cëâ6?©rd   )	r    r#   Zlinspacer
   r$   r   Zreshaper   Úravel)r%   r^   ÚaÚbÚcÚdrg   r]   r1   Úu1ZyoutZxoutZdsysÚu2Út2Ztd2Zyd2Zxd2Zymidr2   r2   r3   Útest_discrete_approx  s&     ÿzTestC2D.test_discrete_approxc                 C   sb   ddgddggddgf}t |dƒ\}}}t|dƒ t|ddgdd� t|ddgddggdd� d S )	Nr   r   ç{®Gáz„?gUùxÊe±ï¿gü©ñÒMbP?rh   rf   gÞT(û|®ï¿)r$   r   r   )r%   ÚtfrN   rO   r1   r2   r2   r3   Útest_simo_tf=  s
    
zTestC2D.test_simo_tfc                 C   sÀ   d}ddgddggddgf}t ||ƒ\}}}|d d |d f}t ||ƒ\}}}	|d d |d f}
t |
|ƒ\}}}t||	ƒ t||ƒ t|t ||f¡dd� t||dd� t||dd� d S )Nrr   r   éýÿÿÿé   r   g‚vIhÂ%<=rh   )r$   r   r   r    Zvstack)r%   Útsrs   rN   rO   r1   Ztf1Znum1Zden1Zdt1Ztf2Znum2Zden2Zdt2r2   r2   r3   Útest_multioutputF  s    

zTestC2D.test_multioutputN)Ú__name__Ú
__module__Ú__qualname__r4   r9   r;   rG   rJ   rK   rM   rP   rS   r[   rq   rt   rx   r2   r2   r2   r3   r      s   ,*)	r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú
TestC2dLtic           	      C   s°   t  ddgddgg¡}t  dgdgg¡}t  ddgg¡}d}t  ddgd	d
gg¡}t  dgdgg¡}t||||ƒ}| d¡}t|j|ƒ t|j|ƒ t|j|ƒ t|j|ƒ d S )Ng333333Ó¿çš™™™™™¹?rA   gffffffæ¿r   r   gÐ“»Ç<†ï?gö‡�ùs?gö‡�ùƒ?gã{Kpæî?g1vMñ ?g_†Ç·J(©?gš™™™™™©?)	r    r#   r   Úto_discreter   rT   rU   rV   rW   )	r%   rT   rU   rV   rW   ZA_resZB_resZsys_sscZsys_ssdr2   r2   r3   Útest_c2d_ss_  s    
ÿ
zTestC2dLti.test_c2d_ssc                 C   s\   t ddgddgƒ}| d¡}t ddg¡}t ddg¡}t|j|dd	� t|j|dd	� d S )
Nr   r=   r   gš™™™™™Ù?g{®Gázt?g�â„i®ß¿gYì­›É]ï¿g{®Gáz”?)re   )r   r~   r    r#   r   rO   rN   )r%   ÚsysZnum_resZden_resr2   r2   r3   Útest_c2d_tfr  s    
zTestC2dLti.test_c2d_tfN)ry   rz   r{   r   r�   r2   r2   r2   r3   r|   ^  s   r|   c                   @   s¤   e Zd ZeddgdddgƒddfeddgddddgƒddfedddddgƒddfgZd	d
dœZej de¡dd„ ƒZ	ej de¡dd„ ƒZ
ej de¡dd„ ƒZdS )ÚTestC2dInvariantsr   rH   r   é
   r   é   r   r}   r`   ra   )rd   re   zsys,sample_time,samples_numberc                 C   sd   t  |¡| }t|fd|i| j—Ž\}}tt||dd�t|ƒd�\}}t|| ¡  |d  ¡ ƒ d S )Nrb   r:   r   ©Únr   )	r    Úaranger   Ú
tolerancesr   r$   Úlenr   ri   ©r%   r€   Zsample_timeZsamples_numberÚtimeÚ_Z	yout_contZ	yout_discr2   r2   r3   Útest_impulse_invariantŽ  s    ÿ
z(TestC2dInvariants.test_impulse_invariantc                 C   s`   t  |¡| }t|fd|i| j—Ž\}}tt||dd�t|ƒd�\}}t| ¡ |d  ¡ ƒ d S )Nrb   r   r   r…   r   )	r    r‡   r   rˆ   r   r$   r‰   r   ri   rŠ   r2   r2   r3   Útest_step_invariant—  s    z%TestC2dInvariants.test_step_invariantc                 C   s^   t  |¡| }t|f||dœ| j—Ž\}}}tt||dd�|d�\}}}t| ¡ | ¡ ƒ d S )N)rb   rc   r5   r   )r^   )r    r‡   r
   rˆ   r   r$   r   ri   rŠ   r2   r2   r3   Útest_linear_invariantŸ  s    z'TestC2dInvariants.test_linear_invariantN)ry   rz   r{   r   Zcasesrˆ   ÚpytestÚmarkZparametrizer�   rŽ   r�   r2   r2   r2   r3   r‚   €  s   ý


r‚   )Únumpyr    Znumpy.testingr   r   r   r   r�   Zscipy.signalr   r$   r   r   r	   r
   r   r   r   r   r   r   r   r|   r‚   r2   r2   r2   r3   Ú<module>   s     Q"