Source code for training_ml_control.models.sindy
import re
import numpy as np
from casadi import constpow
from do_mpc.model import Model
__all__ = ["build_sindy_model"]
[docs]
def build_sindy_model(
sindy_model,
) -> Model:
model = Model("continuous")
# Declare model variables
variables = dict()
for variable_name in sindy_model.feature_names:
if variable_name.startswith("x"):
variable = model.set_variable(var_type="_x", var_name=variable_name)
else:
variable = model.set_variable(var_type="_u", var_name=variable_name)
variables[variable_name] = variable
feature_regex = re.compile(r"([xu]\d+)(\^(\d+))?")
features = []
for feature in sindy_model.get_feature_names():
if feature == "1":
features.append(1.0)
continue
matches = feature_regex.findall(feature)
feature_expression = 1.0
for match in matches:
variable_name, _, power = match
if not power:
feature_expression *= variables[variable_name]
else:
feature_expression *= constpow(variables[variable_name], int(power))
features.append(feature_expression)
features = np.asarray(features)
equations = sindy_model.coefficients() @ features
for i, equation in enumerate(equations):
model.set_rhs(f"x{i}", equation)
model.setup()
return model