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.DMDPINV
— TypeDMDPINV()
Approximates the Koopman operator K
based on
K = Y / X
where Y
and X
are data matrices.
DataDrivenDiffEq.DMDSVD
— TypeDMDSVD(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.
DataDrivenDiffEq.TOTALDMD
— TypeTOTALDMD(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.
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.