Controle Baseado em Dados
Universidade Federal do Pará
Em Koopman — Introdução, EDMD estima \(K\) tal que \(\phi(x_{k+1}) \approx K\, \phi(x_k)\). Aqui, um sistema não linear de propósito, cujo espaço de observáveis invariante é conhecido — para conferir que EDMD recupera \(K\) exatamente.
\[ x_{1,k+1} = \lambda_1 x_{1,k} \qquad x_{2,k+1} = \lambda_2 x_{2,k} + b\, x_{1,k}^2 \]
Não linear em \((x_1,x_2)\), mas linear no observável estendido \(z=(x_1,x_2,x_1^2)\), já que \(x_{1,k+1}^2=\lambda_1^2 x_{1,k}^2\):
\[ K = \begin{bmatrix} \lambda_1 & 0 & 0 \\ 0 & \lambda_2 & b \\ 0 & 0 & \lambda_1^2 \end{bmatrix} \]
K estimado:
[[ 0.9 -0. -0. ]
[-0. 0.5 1. ]
[-0. -0. 0.81]]
Nota
Sem ruído, \(K\) recupera \(K_{\text{exato}}\) até erro de ponto flutuante.
import matplotlib.pyplot as plt
x0, steps = np.array([0.5, -0.3]), 15
z = [phi(x0)]
for _ in range(steps): z.append(K @ z[-1])
z = np.array(z)
x_true = [x0]
for _ in range(steps): x_true.append(step(x_true[-1]))
x_true = np.array(x_true)
fig, ax = plt.subplots()
_ = ax.plot(x_true[:,1], "o-", label="$x_2$ verdadeiro")
_ = ax.plot(z[:,1], "x--", label="$x_2$ predito")
_ = ax.legend()
plt.tight_layout(); plt.show()Sem \(x_1^2\) (DMD comum, \(\phi(x)=(x_1,x_2)\)):
erro com x1²: 2.220446049250313e-16
erro sem x1²: 0.24072030365909527
Importante
Sem \(x_1^2\), o subespaço deixa de ser invariante: \(K_{\text{lin}}\) é a melhor aproximação linear, mas erra sistematicamente.