Source code for skfuzzy.fuzzymath._continuous_to_discrete

import scipy.linalg
import numpy as np


[docs]def continuous_to_discrete(a, b, sampling_rate): """ Converts a continuous-time system to its equivalent discrete-time version. Parameters ---------- a : (N, N) array of floats State variable coefficients describing the continuous-time system. b : (N,) or (N, 1) array of floats Constant coefficients describing the continuous-time system. Can be either a rank-1 array or a rank-2 array of shape (N, 1). sampling_rate : float Rate in Hz at which the continuous-time system is to be sampled. Returns ------- phi : (N, N) array of floats Variable coefficients describing the discrete-time system. gamma : (N,) or (N, 1) array of floats Constant coefficients describing the discrete-time system. Shape of this output maintains the shape passed as `b`. """ a = a.astype(float) b = b.astype(float) phi = scipy.linalg.expm(a * sampling_rate) a_pinv = scipy.linalg.pinv2(a) gamma = np.dot(np.dot(a_pinv, phi - np.eye(a.shape[0])), b) return phi, gamma