In a real environment we are using discretized system, so because of this we need to discretize our system. This page is contains a short description about the zoh and an example written in Python using numpy's.
Discretization with zero order hold element on the input
It's given the following continuous-time state space model:
$$\dot{x(t)} = Ax(t) + B u(t)$$$$y(t) = Cx(t) + Du(t)$$
It can be shown that the following discrete-time state space model expresses how the state x evolves along a discrete time axis $$x[k+1] = A_{d}x[k] + B_{d}u[k]$$$$y[k] = C_{d}x[k] + D_{d}u[k]$$
Where: $$A_{d} = e^{ATs}$$ $$B_{d} = \left( \int_{\tau=0}^{Ts}e^{A \tau}d\tau \right)B$$ $$C_{d} = C$$ $$D_{d} = D$$Where \(T_{s}\) is the sampling time
There is a trick how can we calculate the \(A_{d}, B_{d}\) discrete matrices: $$M = \left[ {\begin{array}{cc} A & B\\ 0 & 0 \end{array} } \right]$$ $$\left[ {\begin{array}{cc} M_{11} & M_{12}\\ 0 & I \end{array} } \right] = e^{MT_{s}}$$ After the calculation we can get easily the \(A_{d}, B_{d}\) discrete matrices: $$A_{d} = M_{11}, B_{d} = M_{21}$$ The following code written in Python contains the theory above.
Discretization with zero order hold element on the input
It's given the following continuous-time state space model:
$$\dot{x(t)} = Ax(t) + B u(t)$$$$y(t) = Cx(t) + Du(t)$$
It can be shown that the following discrete-time state space model expresses how the state x evolves along a discrete time axis $$x[k+1] = A_{d}x[k] + B_{d}u[k]$$$$y[k] = C_{d}x[k] + D_{d}u[k]$$
Where: $$A_{d} = e^{ATs}$$ $$B_{d} = \left( \int_{\tau=0}^{Ts}e^{A \tau}d\tau \right)B$$ $$C_{d} = C$$ $$D_{d} = D$$Where \(T_{s}\) is the sampling time
There is a trick how can we calculate the \(A_{d}, B_{d}\) discrete matrices: $$M = \left[ {\begin{array}{cc} A & B\\ 0 & 0 \end{array} } \right]$$ $$\left[ {\begin{array}{cc} M_{11} & M_{12}\\ 0 & I \end{array} } \right] = e^{MT_{s}}$$ After the calculation we can get easily the \(A_{d}, B_{d}\) discrete matrices: $$A_{d} = M_{11}, B_{d} = M_{21}$$ The following code written in Python contains the theory above.
from numpy import hstack , vstack, zeros from scipy.linalg import expm from control.matlab import tf2ss, ss2tf def c2d ( sys , Ts, method = 'ZOH' ) : """ @summary: From continuous time convert discrete time @param sys: an instance of the LTI class or a tuple describing the system. The following gives the number of elements in the tuple and the interpretation: 2: (num, den) 4: (A, B, C, D) @param Ts: Sampling time @param method: The name of the discretization method @return: The discrete system """ if(len(sys) == 2): (A, B, C, D) = tf2ss( sys ) else: (A, B, C, D) = sys n = A.shape[ 0 ] nb = B.shape[ 1 ] if(method == 'ZOH'): ztmp= zeros ( ( nb , n + nb ) ) tmp = hstack ( ( A , B ) ) tmp = vstack ( ( tmp , ztmp ) ) tmp = expm( tmp * Ts ) A = tmp [ 0 : n , 0 : n ] B = tmp [ 0 : n , n : n+nb ] sysd = ( A , B , C , D ) if(len(sys) == 2): return ss2tf ( sysd ) return sysdAlso it's possible to download from the github.
No comments:
Post a Comment