def _set_optimization_variables_initials(self, pinit, xinit): xinit = inputchecks.check_states_data(xinit, \ self._discretization.system.nx, \ self._discretization.number_of_intervals) repretitions_xinit = \ self._discretization.optimization_variables["X"][:,:-1].shape[1] / \ self._discretization.number_of_intervals Xinit = ci.repmat(xinit[:, :-1], repretitions_xinit, 1) Xinit = ci.horzcat([ \ Xinit.reshape((self._discretization.system.nx, \ Xinit.size() / self._discretization.system.nx)), xinit[:, -1], ]) pinit = inputchecks.check_parameter_data(pinit, \ self._discretization.system.np) Pinit = pinit Vinit = np.zeros(self._discretization.optimization_variables["V"].shape) EPS_Uinit = np.zeros( \ self._discretization.optimization_variables["EPS_U"].shape) self._optimization_variables_initials = ci.veccat([ \ Pinit, Xinit, EPS_Uinit, Vinit, ])
def run_system_simulation(self, x0, time_points, udata = None, \ integrator_options = {}, print_status = True): r''' :param x0: state values :math:`x_0 \in \mathbb{R}^{\text{n}_\text{x}}` at the first time point :math:`t_0` :type x0: numpy.ndarray, casadi.DMatrix, list :param time_points: switching time points for the controls :math:`t_\text{N} \in \mathbb{R}^\text{N}` :type time_points: numpy.ndarray, casadi.DMatrix, list :param udata: optional, values for the time-varying controls at the first :math:`N-1` switching time points :math:`u_\text{N} \in \mathbb{R}^{\text{n}_\text{u} \times \text{N}-1}`; if no values are given, 0 will be used :type udata: numpy.ndarray, casadi.DMatrix :param integrator_options: optional, options to be passed to the CasADi integrator (see the CasADi documentation for a list of all possible options) :type integrator_options: dict :param print_status: optional, set to ``True`` (default) or ``False`` to enable or disable console printing. :type print_status: bool This function will run a system simulation for the specified initial state values and control data from :math:`t_0` to :math:`t_\text{N}`. If you receive integrator-related error messages during the simulation, please check the corresponding parts of the CasADi documentation. After the simulation has finished, the simulation results :math:`x_\text{N}` can be accessed via the class attribute ``Simulation.simulation_results``. ''' if print_status: print('\n' + '# ' + 23 * '-' + \ ' casiopeia system simulation ' + 22 * '-' + ' #') print('\nRunning system simulation, this might take some time ...') self.__initialize_simulation(x0 = x0, time_points = time_points, \ udata = udata, integrator_options_user = integrator_options) self.__simulation_results = ci.horzcat([ \ self.__x0, self.__simulation(x0 = self.__x0, p = self.__simulation_input)["xf"] ]) if print_status: print("\nSystem simulation finished.")
def run_system_simulation(self, x0, time_points, udata=None, integrator_options={}, print_status=True): r""" :param x0: state values :math:`x_0 \in \mathbb{R}^{\text{n}_\text{x}}` at the first time point :math:`t_0` :type x0: numpy.ndarray, casadi.DMatrix, list :param time_points: switching time points for the controls :math:`t_\text{N} \in \mathbb{R}^\text{N}` :type time_points: numpy.ndarray, casadi.DMatrix, list :param udata: optional, values for the time-varying controls at the first :math:`N-1` switching time points :math:`u_\text{N} \in \mathbb{R}^{\text{n}_\text{u} \times \text{N}-1}`; if no values are given, 0 will be used :type udata: numpy.ndarray, casadi.DMatrix :param integrator_options: optional, options to be passed to the CasADi integrator (see the CasADi documentation for a list of all possible options) :type integrator_options: dict :param print_status: optional, set to ``True`` (default) or ``False`` to enable or disable console printing. :type print_status: bool This function will run a system simulation for the specified initial state values and control data from :math:`t_0` to :math:`t_\text{N}`. If you receive integrator-related error messages during the simulation, please check the corresponding parts of the CasADi documentation. After the simulation has finished, the simulation results :math:`x_\text{N}` can be accessed via the class attribute ``Simulation.simulation_results``. """ if print_status: print("\n" + "# " + 23 * "-" + " casiopeia system simulation " + 22 * "-" + " #") print("\nRunning system simulation, this might take some time ...") self.__initialize_simulation( x0=x0, time_points=time_points, udata=udata, integrator_options_user=integrator_options ) self.__simulation_results = ci.horzcat( [self.__x0, self.__simulation(x0=self.__x0, p=self.__simulation_input)["xf"]] ) if print_status: print("\nSystem simulation finished.")
def _set_optimization_variables_initials(self, qinit, x0, uinit): self.simulation = Simulation(self._discretization.system, \ self._pdata, qinit) self.simulation.run_system_simulation(x0, \ self._discretization.time_points, uinit, print_status = False) xinit = self.simulation.simulation_results repretitions_xinit = \ self._discretization.optimization_variables["X"][:,:-1].shape[1] / \ self._discretization.number_of_intervals Xinit = ci.repmat(xinit[:, :-1], repretitions_xinit, 1) Xinit = ci.horzcat([ \ Xinit.reshape((self._discretization.system.nx, \ Xinit.size() / self._discretization.system.nx)), xinit[:, -1], ]) uinit = inputchecks.check_controls_data(uinit, \ self._discretization.system.nu, \ self._discretization.number_of_intervals) Uinit = uinit qinit = inputchecks.check_constant_controls_data(qinit, \ self._discretization.system.nq) Qinit = qinit self._optimization_variables_initials = ci.veccat([ \ Uinit, Qinit, Xinit, ])
def _set_optimization_variables_initials(self, qinit, x0, uinit): self.simulation = Simulation(self._discretization.system, \ self._pdata, qinit) self.simulation.run_system_simulation(x0, \ self._discretization.time_points, uinit, print_status = False) xinit = self.simulation.simulation_results repretitions_xinit = \ self._discretization.optimization_variables["X"][:,:-1].shape[1] / \ self._discretization.number_of_intervals Xinit = ci.repmat(xinit[:, :-1], repretitions_xinit, 1) Xinit = ci.horzcat([ \ Xinit.reshape((self._discretization.system.nx, \ Xinit.numel() / self._discretization.system.nx)), xinit[:, -1], ]) uinit = inputchecks.check_controls_data(uinit, \ self._discretization.system.nu, \ self._discretization.number_of_intervals) Uinit = uinit qinit = inputchecks.check_constant_controls_data(qinit, \ self._discretization.system.nq) Qinit = qinit self._optimization_variables_initials = ci.veccat([ \ Uinit, Qinit, Xinit, ])
def _set_optimization_variables_initials(self, pinit, xinit): xinit = inputchecks.check_states_data(xinit, \ self._discretization.system.nx, \ self._discretization.number_of_intervals) repretitions_xinit = \ self._discretization.optimization_variables["X"][:,:-1].shape[1] / \ self._discretization.number_of_intervals Xinit = ci.repmat(xinit[:, :-1], repretitions_xinit, 1) Xinit = ci.horzcat([ \ Xinit.reshape((self._discretization.system.nx, \ Xinit.numel() / self._discretization.system.nx)), xinit[:, -1], ]) pinit = inputchecks.check_parameter_data(pinit, \ self._discretization.system.np) Pinit = pinit Vinit = np.zeros( self._discretization.optimization_variables["V"].shape) EPS_Uinit = np.zeros( \ self._discretization.optimization_variables["EPS_U"].shape) self._optimization_variables_initials = ci.veccat([ \ Pinit, Xinit, Vinit, EPS_Uinit, ])