
    _Mh>                         d Z ddlZddl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mZmZ g dZd Zd	 Zd
 Zd Zd Zd ZddZddZd ZddZddZdS )zr
ltisys -- a collection of functions to convert linear time invariant systems
from one representation to another.
    N)	r_eye
atleast_2dpolydotasarrayzerosarrayouter)linalg   )tf2zpkzpk2tf	normalize)tf2ssabcd_normalizess2tfzpk2ssss2zpkcont2discretec                    t          | |          \  } }t          | j                  }|dk    rt          | g| j                  } | j        d         }t          |          }||k    rd}t          |          |dk    s|dk    rRt          g t                    t          g t                    t          g t                    t          g t                    fS t          j	        t          j
        | j        d         ||z
  f| j                  | f          } | j        d         dk    rt          | dddf                   }nt          dggt                    }|dk    ra|                    | j                  }t          d          t          d|j        d         f          t          |j        d         df          |fS t          |dd         g           }t          |t          |dz
  |dz
            f         }t          |dz
  d          }	| ddddf         t          | dddf         |dd                   z
  }
|                    |
j        d         |	j        d         f          }||	|
|fS )	a  Transfer function to state-space representation.

    Parameters
    ----------
    num, den : array_like
        Sequences representing the coefficients of the numerator and
        denominator polynomials, in order of descending degree. The
        denominator needs to be at least as long as the numerator.

    Returns
    -------
    A, B, C, D : ndarray
        State space representation of the system, in controller canonical
        form.

    Examples
    --------
    Convert the transfer function:

    .. math:: H(s) = \frac{s^2 + 3s + 3}{s^2 + 2s + 1}

    >>> num = [1, 3, 3]
    >>> den = [1, 2, 1]

    to the state-space representation:

    .. math::

        \dot{\textbf{x}}(t) =
        \begin{bmatrix} -2 & -1 \\ 1 & 0 \end{bmatrix} \textbf{x}(t) +
        \begin{bmatrix} 1 \\ 0 \end{bmatrix} \textbf{u}(t) \\

        \textbf{y}(t) = \begin{bmatrix} 1 & 2 \end{bmatrix} \textbf{x}(t) +
        \begin{bmatrix} 1 \end{bmatrix} \textbf{u}(t)

    >>> from scipy.signal import tf2ss
    >>> A, B, C, D = tf2ss(num, den)
    >>> A
    array([[-2., -1.],
           [ 1.,  0.]])
    >>> B
    array([[ 1.],
           [ 0.]])
    >>> C
    array([[ 1.,  2.]])
    >>> D
    array([[ 1.]])
    r   z7Improper transfer function. `num` is longer than `den`.r   )dtypeN)r   r      )r   lenshaper   r   
ValueErrorr
   floatnphstackr	   r   reshaper   r   r   )numdennnMKmsgDfrowABCs              \/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/scipy/signal/_lti_conversion.pyr   r      sE   p c""HC	SYB	QwwseSY''	!ACA1uuGooAvvab%  %E"2"2E"e4D4Db%  " 	" )RXsy|QU339EEEsK
L
LC
y}qs111a4y!! A3%AvvIIci  fua_55qwqz1o&&+ 	+ 3qrr7)D
4QUAE"""#AAE1AAAAqrrE
U3qqq!t9c!""g...A			171:qwqz*++AaA:    c                 (    | t          d          S | S )Nr   r   )r	   args    r-   _none_to_empty_2dr3   s   s    
{V}}
r.   c                 (    | t          |           S d S N)r   r1   s    r-   _atleast_2d_or_noner6   z   s    
# r.   c                     | | j         S dS )N)NN)r   )r%   s    r-   _shape_or_noner8      s    }w{r.   c                      | D ]}||c S 	d S r5    )argsr2   s     r-   _choice_not_noner<      s.      ?JJJ  r.   c                 n    | j         dk    rt          |          S | j         |k    rt          d          | S )Nr0   z*The input arrays have incompatible shapes.)r   r	   r   )r%   r   s     r-   _restorer>      s<    w&U||7eIJJJr.   c                 2   t          t          | |||f          \  } }}}t          |           \  }}t          |          \  }}t          |          \  }}	t          |          \  }
}t          |||	          }t          ||          }t          ||
          }|||t	          d          t          t
          | |||f          \  } }}}t          | ||f          } t          |||f          }t          |||f          }t          |||f          }| |||fS )a  Check state-space matrices and ensure they are 2-D.

    If enough information on the system is provided, that is, enough
    properly-shaped arrays are passed to the function, the missing ones
    are built from this information, ensuring the correct number of
    rows and columns. Otherwise a ValueError is raised.

    Parameters
    ----------
    A, B, C, D : array_like, optional
        State-space matrices. All of them are None (missing) by default.
        See `ss2tf` for format.

    Returns
    -------
    A, B, C, D : array
        Properly shaped state-space matrices.

    Raises
    ------
    ValueError
        If not enough information on the system was provided.

    Nz%Not enough information on the system.)mapr6   r8   r<   r   r3   r>   )r*   r+   r,   r(   MANAMBNBMCNCMDNDpqrs                  r-   r   r      s-   2 (1aA,77JAq!QAFBAFBAFBAFBR$$AR  AR  AyAI@AAA&Aq!55JAq!QQFAQFAQFAQFAaA:r.   c                    t          | |||          \  } }}}|j        \  }}||k    rt          d          |dd||dz   f         }|dd||dz   f         }	 t          |           }n# t          $ r d}Y nw xY w|j        dk    r;|j        dk    r0t          j        |          }|j        dk    r| j        dk    rg }||fS | j        d         }	| dddf         |dddf         z   |dddf         z   |z   dz   }
t          j        ||	dz   f|
j                  }t          |          D ]M}t          ||ddf                   }t          | t          ||          z
            ||         dz
  |z  z   ||<   N||fS )a  State-space to transfer function.

    A, B, C, D defines a linear state-space system with `p` inputs,
    `q` outputs, and `n` state variables.

    Parameters
    ----------
    A : array_like
        State (or system) matrix of shape ``(n, n)``
    B : array_like
        Input matrix of shape ``(n, p)``
    C : array_like
        Output matrix of shape ``(q, n)``
    D : array_like
        Feedthrough (or feedforward) matrix of shape ``(q, p)``
    input : int, optional
        For multiple-input systems, the index of the input to use.

    Returns
    -------
    num : 2-D ndarray
        Numerator(s) of the resulting transfer function(s). `num` has one row
        for each of the system's outputs. Each row is a sequence representation
        of the numerator polynomial.
    den : 1-D ndarray
        Denominator of the resulting transfer function(s). `den` is a sequence
        representation of the denominator polynomial.

    Examples
    --------
    Convert the state-space representation:

    .. math::

        \dot{\textbf{x}}(t) =
        \begin{bmatrix} -2 & -1 \\ 1 & 0 \end{bmatrix} \textbf{x}(t) +
        \begin{bmatrix} 1 \\ 0 \end{bmatrix} \textbf{u}(t) \\

        \textbf{y}(t) = \begin{bmatrix} 1 & 2 \end{bmatrix} \textbf{x}(t) +
        \begin{bmatrix} 1 \end{bmatrix} \textbf{u}(t)

    >>> A = [[-2, -1], [1, 0]]
    >>> B = [[1], [0]]  # 2-D column vector
    >>> C = [[1, 2]]    # 2-D row vector
    >>> D = 1

    to the transfer function:

    .. math:: H(s) = \frac{s^2 + 3s + 3}{s^2 + 2s + 1}

    >>> from scipy.signal import ss2tf
    >>> ss2tf(A, B, C, D)
    (array([[1., 3., 3.]]), array([ 1.,  2.,  1.]))
    z)System does not have the input specified.Nr   r           )r   r   r   r   sizer   ravelemptyr   ranger   r   )r*   r+   r,   r(   inputnoutninr#   r"   
num_states	type_testkCks                r-   r   r      s   t  1a++JAq!QID#||DEEE 	
!!!U519_
A	!!!U519_
A1gg    	
!!&A++hqkkFaKKafkkCCxJ!!!Q$!AAAqD'!AadG+a/#5I
(D*q.)9?
;
;C4[[ 9 9!QQQ$  a#a**n%%1S(88A8Os   A* *A98A9c                 2    t          t          | ||           S )a:  Zero-pole-gain representation to state-space representation

    Parameters
    ----------
    z, p : sequence
        Zeros and poles.
    k : float
        System gain.

    Returns
    -------
    A, B, C, D : ndarray
        State space representation of the system, in controller canonical
        form.

    )r   r   )zrI   rW   s      r-   r   r     s    " &Aq//""r.   c           	      8    t          t          | ||||           S )a  State-space representation to zero-pole-gain representation.

    A, B, C, D defines a linear state-space system with `p` inputs,
    `q` outputs, and `n` state variables.

    Parameters
    ----------
    A : array_like
        State (or system) matrix of shape ``(n, n)``
    B : array_like
        Input matrix of shape ``(n, p)``
    C : array_like
        Output matrix of shape ``(q, n)``
    D : array_like
        Feedthrough (or feedforward) matrix of shape ``(q, p)``
    input : int, optional
        For multiple-input systems, the index of the input to use.

    Returns
    -------
    z, p : sequence
        Zeros and poles.
    k : float
        System gain.

    )rR   )r   r   )r*   r+   r,   r(   rR   s        r-   r   r   1  s"    6 5Aq!511122r.   zohc                 
   t          |           dk    r|                                 S t          |           dk    r[t          t          | d         | d                   |||          }t	          |d         |d         |d         |d                   |fz   S t          |           dk    rbt          t          | d         | d         | d                   |||          }t          |d         |d         |d         |d                   |fz   S t          |           dk    r| \  }}}}nt          d          |dk    r,|t          d
          |dk     s|dk    rt          d          |dk    rt          j	        |j
        d                   ||z  |z  z
  }	t          j        |	t          j	        |j
        d                   d|z
  |z  |z  z             }
t          j        |	||z            }t          j        |	                                |                                          }|                                }||t          j        ||          z  z   }n|dk    s|dk    rt          | |dd          S |dk    s|dk    rt          | |dd          S |dk    rt          | |dd          S |dk    rt          j        ||f          }t          j        t          j        |j
        d         |j
        d         f          t          j        |j
        d         |j
        d         f          f          }t          j        ||f          }t          j        ||z            }|d	|j
        d         d	d	f         }|d	d	d|j
        d         f         }
|d	d	|j
        d         d	f         }|}|}nP|dk    r|j
        d         }|j
        d         }t          j        t          j        ||g          |z  t          j	        |                    }t!          ||d|z  z   f          }t          j        |g|gg          }t          j        |          }|d	|d|f         }|d	||||z   f         }|d	|||z   d	f         }|}
||z
  ||z  z   }|}|||z  z   }ng|dk    rNt          j        |d          st          d          t          j        ||z            }
|
|z  |z  }|}||z  |z  }nt          d| d          |
||||fS )a\  
    Transform a continuous to a discrete state-space system.

    Parameters
    ----------
    system : a tuple describing the system or an instance of `lti`
        The following gives the number of elements in the tuple and
        the interpretation:

            * 1: (instance of `lti`)
            * 2: (num, den)
            * 3: (zeros, poles, gain)
            * 4: (A, B, C, D)

    dt : float
        The discretization time step.
    method : str, optional
        Which method to use:

            * gbt: generalized bilinear transformation
            * bilinear: Tustin's approximation ("gbt" with alpha=0.5)
            * euler: Euler (or forward differencing) method ("gbt" with alpha=0)
            * backward_diff: Backwards differencing ("gbt" with alpha=1.0)
            * zoh: zero-order hold (default)
            * foh: first-order hold (*versionadded: 1.3.0*)
            * impulse: equivalent impulse response (*versionadded: 1.3.0*)

    alpha : float within [0, 1], optional
        The generalized bilinear transformation weighting parameter, which
        should only be specified with method="gbt", and is ignored otherwise

    Returns
    -------
    sysd : tuple containing the discrete system
        Based on the input type, the output will be of the form

        * (num, den, dt)   for transfer function input
        * (zeros, poles, gain, dt)   for zeros-poles-gain input
        * (A, B, C, D, dt) for state-space system input

    Notes
    -----
    By default, the routine uses a Zero-Order Hold (zoh) method to perform
    the transformation. Alternatively, a generalized bilinear transformation
    may be used, which includes the common Tustin's bilinear approximation,
    an Euler's method technique, or a backwards differencing technique.

    The Zero-Order Hold (zoh) method is based on [1]_, the generalized bilinear
    approximation is based on [2]_ and [3]_, the First-Order Hold (foh) method
    is based on [4]_.

    References
    ----------
    .. [1] https://en.wikipedia.org/wiki/Discretization#Discretization_of_linear_state_space_models

    .. [2] http://techteach.no/publications/discretetime_signals_systems/discrete.pdf

    .. [3] G. Zhang, X. Chen, and T. Chen, Digital redesign via the generalized
        bilinear transformation, Int. J. Control, vol. 82, no. 4, pp. 741-754,
        2009.
        (https://www.mypolyuweb.hk/~magzhang/Research/ZCC09_IJC.pdf)

    .. [4] G. F. Franklin, J. D. Powell, and M. L. Workman, Digital control
        of dynamic systems, 3rd ed. Menlo Park, Calif: Addison-Wesley,
        pp. 204-206, 1998.

    Examples
    --------
    We can transform a continuous state-space system to a discrete one:

    >>> import numpy as np
    >>> import matplotlib.pyplot as plt
    >>> from scipy.signal import cont2discrete, lti, dlti, dstep

    Define a continuous state-space system.

    >>> A = np.array([[0, 1],[-10., -3]])
    >>> B = np.array([[0],[10.]])
    >>> C = np.array([[1., 0]])
    >>> D = np.array([[0.]])
    >>> l_system = lti(A, B, C, D)
    >>> t, x = l_system.step(T=np.linspace(0, 5, 100))
    >>> fig, ax = plt.subplots()
    >>> ax.plot(t, x, label='Continuous', linewidth=3)

    Transform it to a discrete state-space system using several methods.

    >>> dt = 0.1
    >>> for method in ['zoh', 'bilinear', 'euler', 'backward_diff', 'foh', 'impulse']:
    ...    d_system = cont2discrete((A, B, C, D), dt, method=method)
    ...    s, x_d = dstep(d_system)
    ...    ax.step(s, np.squeeze(x_d), label=method, where='post')
    >>> ax.axis([t[0], t[-1], x[0], 1.4])
    >>> ax.legend(loc='best')
    >>> fig.tight_layout()
    >>> plt.show()

    r   r   r   )methodalpha      zKFirst argument must either be a tuple of 2 (tf), 3 (zpk), or 4 (ss) arrays.gbtNzUAlpha parameter must be specified for the generalized bilinear transform (gbt) methodzDAlpha parameter must be within the interval [0,1] for the gbt methodg      ?bilineartusting      ?eulerforward_diffrM   backward_diffr\   fohimpulsez<Impulse method is only applicable to strictly proper systemszUnknown transformation method '')r   to_discreter   r   r   r   r   r   r   r   r   r   solve	transposer   r    r	   vstackexpm
block_diagblockallclose)systemdtr^   r_   sysdabcdimaadbdcdddem_upperem_loweremmsnmms11ms12ms13s                          r-   r   r   O  s^   F 6{{a!!###
6{{aU6!9fQi88"V#(* * *T!Wd1gtAwQ88B5@@	V		VF1Ivay&)DDb$*%9 9 9d1gtAwQa99REAA	V		
1a 6 7 7 	7 = K L L LQYY%!)) 8 9 9 9 fQWQZ  58A:-\#rvagaj11SYN14DDEE\#r!t$$ \#--//1;;==99\\^^rva}}$$	:		8!3!3VRSAAAA	7		f66VRSAAAA	?	"	"VRSAAAA	59aV$$ 9bh
AGAJ'?@@ h
AGAJ'?@@B C C Y(+,,[b!! QQQ1QWQZ< 171:;;	5GAJGAJ $RXq!f%5%5%:BF1IIFF!QQY((XzH:.//[__ "1"ac'{"1"aAg+"1"a!eff*~D[4$;&T\	9		{1a   	; : ; ; ; [R  !Vb[URZ D6DDDEEEr2r2r.   )NNNN)r   )r\   N)__doc__numpyr   r   r   r   r   r   r   r	   r
   r   scipyr   _filter_designr   r   r   __all__r   r3   r6   r8   r<   r>   r   r   r   r   r   r:   r.   r-   <module>r      s   
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1       5 5 5 5 5 5 5 5 5 5  ^ ^ ^B    
      , , , ,^V V V Vr# # #(3 3 3 3<F F F F F Fr.   