def state_space(self, speed, nominal=False): """ Returns the A and B matrices for the Whipple model linearized about the upright constant velocity configuration. Parameters ---------- speed : float The speed of the bicycle. nominal : boolean, optional The default is false and uarrays are returned with the calculated uncertainties. If true ndarrays are returned without uncertainties. Returns ------- A : ndarray, shape(4,4) The state matrix. B : ndarray, shape(4,2) The input matrix. Notes ----- ``A`` and ``B`` describe the Whipple model in state space form: x' = A * x + B * u where The states are [roll angle, steer angle, roll rate, steer rate] The inputs are [roll torque, steer torque] If you have a flywheel defined, body D, it will completely be ignored in these results. These results are strictly for the Whipple bicycle model. """ M, C1, K0, K2 = self.canonical() g = self.parameters['Benchmark']['g'] A, B = bicycle.ab_matrix(M, C1, K0, K2, speed, g) if nominal is True: return (unumpy.nominal_values(A), unumpy.nominal_values(B)) elif nominal is False: return A, B else: raise ValueError('nominal must be True or False')
def eig(self, speeds): '''Returns the eigenvalues and eigenvectors of the Whipple bicycle model linearized about the nominal configuration. Parameters ---------- speeds : ndarray, shape (n,) or float The speed at which to calculate the eigenvalues. Returns ------- evals : ndarray, shape (n, 4) eigenvalues evecs : ndarray, shape (n, 4, 4) eigenvectors Notes ----- If you have a flywheel defined, body D, it will completely be ignored in these results. These results are strictly for the Whipple bicycle model. ''' # this allows you to enter a float try: speeds.shape except AttributeError: speeds = np.array([speeds]) par = io.remove_uncertainties(self.parameters['Benchmark']) M, C1, K0, K2 = bicycle.benchmark_par_to_canonical(par) m, n = 4, speeds.shape[0] evals = np.zeros((n, m), dtype='complex128') evecs = np.zeros((n, m, m), dtype='complex128') for i, speed in enumerate(speeds): A, B = bicycle.ab_matrix(M, C1, K0, K2, speed, par['g']) w, v = np.linalg.eig(A) evals[i] = w evecs[i] = v return evals, evecs