def test_parametrize_control_time_dependent_polynomial(model): model.tau = SX.sym('tau') model.create_control('u', 3) # Test parametrize by a time dependent polynomial u_par = SX.sym("u_par", 3, 2) u_expr = model.tau * u_par[:, 0] + (1 - model.tau) * u_par[:, 1] model.parametrize_control(model.u, u_expr, vec(u_par)) assert is_equal(model.u_par, vec(u_par)) assert is_equal(model.u_expr, u_expr, 30) for ind in range(model.n_u): assert is_equal(model._parametrized_controls[ind], model.u[ind])
def test_parametrize_control_list_input(model): model.tau = SX.sym('tau') model.create_control('u', 3) # Test for list inputs, parametrize by a time dependent polynomial u_par = SX.sym("u_par", 3, 2) u_expr = model.tau * u_par[:, 0] + (1 - model.tau) * u_par[:, 1] model.parametrize_control( [model.u[ind] for ind in range(model.n_u)], [u_expr[ind] for ind in range(model.n_u)], [vec(u_par)[ind] for ind in range(u_par.numel())], ) assert is_equal(model.u_par, vec(u_par)) assert is_equal(model.u_expr, u_expr, 30) for ind in range(model.n_u): assert is_equal(model._parametrized_controls[ind], model.u[ind])
def create_state(self, name="x", size=1): """ Create a new state with the name "name" and size "size". Size can be an int or a tuple (e.g. (2,2)). However, the new state will be vectorized (casadi.vec) to be included in the state vector (model.x). :param name: str :param size: int|tuple :return: """ if callable(getattr(self, 'name_variable', None)): name = self.name_variable(name) new_x = SX.sym(name, size) new_x_0 = SX.sym(name + "_0_sym", size) self.include_state(vec(new_x), ode=None, x_0=vec(new_x_0)) return new_x
def create_theta(self, name="theta", size=1): """ Create a new parameter name "name" and size "size" :param name: str :param size: int :return: """ if callable(getattr(self, 'name_variable', None)): name = self.name_variable(name) new_theta = SX.sym(name, size) self.include_theta(vec(new_theta)) return new_theta
def create_control(self, name="u", size=1): """ Create a new control variable name "name" and size "size". Size can be an int or a tuple (e.g. (2,2)). However, the new control variable will be vectorized (casadi.vec) to be included in the control vector (model.u). :param name: str :param size: int :return: """ if callable(getattr(self, 'name_variable', None)): name = self.name_variable(name) new_u = SX.sym(name, size) self.include_control(vec(new_u)) return new_u
def create_algebraic_variable(self, name="y", size=1): """ Create a new algebraic variable with the name "name" and size "size". Size can be an int or a tuple (e.g. (2,2)). However, the new algebraic variable will be vectorized (casadi.vec) to be included in the algebraic vector (model.y). :param str name: :param int||tuple size: :return: """ if callable(getattr(self, 'name_variable', None)): name = self.name_variable(name) new_y = SX.sym(name, size) self.include_algebraic(vec(new_y)) return new_y