25 #ifndef SRC_NUMERICS_INCLUDE_CORBO_NUMERICS_FINITE_DIFFERENCES_COLLOCATION_H_
26 #define SRC_NUMERICS_INCLUDE_CORBO_NUMERICS_FINITE_DIFFERENCES_COLLOCATION_H_
33 #ifdef MESSAGE_SUPPORT
34 #include <corbo-communication/messages/numerics/finite_differences_collocation.pb.h>
60 class FiniteDifferencesCollocationInterface
63 using Ptr = std::shared_ptr<FiniteDifferencesCollocationInterface>;
64 using UPtr = std::unique_ptr<FiniteDifferencesCollocationInterface>;
94 #ifdef MESSAGE_SUPPORT
95 virtual void toMessage(corbo::messages::FiniteDifferencesCollocation& message)
const {}
98 virtual void fromMessage(
const corbo::messages::FiniteDifferencesCollocation& message, std::stringstream* issues =
nullptr) {}
103 #define FACTORY_REGISTER_FD_COLLOCATION(type) FACTORY_REGISTER_OBJECT(type, FiniteDifferencesCollocationInterface)
129 assert(error.size() == x1.size());
132 system.dynamics(x1, u1, error);
133 error -= (x2 - x1) / dt;
153 class BackwardDiffCollocation :
public FiniteDifferencesCollocationInterface
163 assert(error.size() == x1.size());
164 assert(dt > 0 &&
"dt must be greater then zero!");
166 system.dynamics(x2, u1, error);
167 error -= (x2 - x1) / dt;
187 class MidpointDiffCollocation :
public FiniteDifferencesCollocationInterface
197 assert(error.size() == x1.size());
198 assert(dt > 0 &&
"dt must be greater then zero!");
200 system.dynamics(0.5 * (x1 + x2), u1, error);
201 error -= (x2 - x1) / dt;
221 class CrankNicolsonDiffCollocation :
public FiniteDifferencesCollocationInterface
231 assert(error.size() == x1.size());
232 assert(dt > 0 &&
"dt must be greater then zero!");
234 Eigen::VectorXd f1(x1.size());
235 system.dynamics(x1, u1, f1);
236 system.dynamics(x2, u1, error);
237 error = (x2 - x1) / dt - 0.5 * (f1 + error);
245 #endif // SRC_NUMERICS_INCLUDE_CORBO_NUMERICS_FINITE_DIFFERENCES_COLLOCATION_H_