Algorithms for Estimation

There are different variants of estimation of the Koopman Operator, see e.g., here, here or here.

Currently, DataDrivenDiffEq implements the following AbstractKoopmanAlgorithms to use with DMD, EDMD, and DMDc.

Functions

DataDrivenDiffEq.DMDSVDType
DMDSVD(rtol)

Approximates the Koopman operator K based on the singular value decomposition of X such that:

K = Y*V*Σ*U'

where Y and X = U*Σ*V' are data matrices. If rtol ∈ (0, 1) is given, the singular value decomposition is reduced to include only entries bigger than rtol*maximum(Σ). If rtol is an integer, the reduced SVD up to rtol is used for computation.

source
DataDrivenDiffEq.TOTALDMDType
TOTALDMD(rtol, alg)

Approximates the Koopman operator K with the algorithm alg over the rank-reduced data matrices Xᵣ = X Qᵣ and Yᵣ = Y Qᵣ, where Qᵣ originates from the singular value decomposition of the joint data Z = [X; Y]. Based on this paper.

If rtol ∈ (0, 1) is given, the singular value decomposition is reduced to include only entries bigger than rtol*maximum(Σ). If rtol is an integer, the reduced SVD up to rtol is used for computation.

source

Implementing New Algorithms

Is pretty straightforward. The implementation of DMDPINV looks like:


mutable struct DMDPINV <: AbstractKoopmanAlgorithm end;

(x::DMDPINV)(X::AbstractArray, Y::AbstractArray) = Y / X

So, right now, all you have to do is to implement a struct which is callable with the data matrices X and Y. Possible Parameters should be stored in the fields of the algorithm.