def check_kdmd_computation_simple(exact, total): """ Check DMD computations on a problem where the true solution is known. All variants of DMD should identify the original eigenvalues """ num_snapshots = 50 A = np.array([[0.9, 0.1], [0.0, 0.8]]) X = np.random.randn(2, num_snapshots) Y = A.dot(X) ADMD = Y.dot(np.linalg.pinv(X)) vals, vecs = np.linalg.eig(ADMD) inds = np.argsort(np.abs(vals))[::-1] vals = vals[inds] vecs = vecs[:, inds] # DMD class with rank 2 poly = dmdtools.PolyKernel(5) KDMD = dmdtools.KDMD(poly, None, exact, total) KDMD.fit(X, Y) for ii in range(len(vals)): dmd_vals, dmd_modes = dmdtools.sort_modes_evals(KDMD, sortby="closest", target=vals[ii]) assert np.abs(dmd_vals[0] - vals[ii]) < 1e-10 check_eigenvectors(vecs[:, ii], dmd_modes[:, 0])
def check_dmd_computation_simple_timeseries(exact, total): """ Check DMD computations on a problem where the true solution is known. All variants of DMD should give identical outputs. """ num_snapshots = 10 A = np.array([[0.9, 0.1], [0.0, 0.8]]) # Create a time series of data data = np.zeros((2, num_snapshots + 1)) data[:, 0] = np.random.randn(2) for ii in range(num_snapshots): data[:, ii + 1] = A.dot(data[:, ii]) X = data[:, :-1] Y = data[:, 1:] ADMD = Y.dot(np.linalg.pinv(X)) vals, vecs = np.linalg.eig(ADMD) inds = np.argsort(np.abs(vals))[::-1] vals = vals[inds] vecs = vecs[:, inds] # DMD class with rank 2 DMD = dmdtools.DMD(2, exact, total) DMD.fit(data) dmd_vals, dmd_modes = dmdtools.sort_modes_evals(DMD) for ii in range(len(vals)): assert np.abs(dmd_vals[ii] - vals[ii]) < 1e-10 check_eigenvectors(vecs[:, ii], dmd_modes[:, ii])
def check_dmd_computation_simple_timeseries(exact, total): """ Check DMD computations on a problem where the true solution is known. All variants of DMD should give identical outputs. """ num_snapshots = 10 A = np.array([[0.9, 0.1], [0.0, 0.8]]) # Create a time series of data data = np.zeros((2, num_snapshots+1)) data[:, 0] = np.random.randn(2) for ii in range(num_snapshots): data[:, ii + 1] = A.dot(data[:, ii]) X = data[:, :-1] Y = data[:, 1:] ADMD = Y.dot(np.linalg.pinv(X)) vals, vecs = np.linalg.eig(ADMD) inds = np.argsort(np.abs(vals))[::-1] vals = vals[inds] vecs = vecs[:, inds] # DMD class with rank 2 DMD = dmdtools.DMD(2, exact, total) DMD.fit(data) dmd_vals, dmd_modes = dmdtools.sort_modes_evals(DMD) for ii in range(len(vals)): assert np.abs(dmd_vals[ii] - vals[ii]) < 1e-10 check_eigenvectors(vecs[:, ii], dmd_modes[:, ii])