# 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`

— Type`DMDPINV()`

Approximates the Koopman operator `K`

based on

`K = Y / X`

where `Y`

and `X`

are data matrices.

`DataDrivenDiffEq.DMDSVD`

— Type`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.

`DataDrivenDiffEq.TOTALDMD`

— Type`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.

## 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.