48 if (method ==
"trapezoidal" || method ==
"trapezoid" || method ==
"midpoint") {
50 }
else if (method ==
"forward_euler" || method ==
"forward euler") {
52 }
else if (method ==
"backward_euler" || method ==
"backward euler" ||
53 method ==
"backwards_euler" || method ==
"backwards euler") {
74 return {-Scalar(1) / h, Scalar(1) / h};
88 return {-Scalar(1) / h, Scalar(1) / h};
102 return {-Scalar(1) / (Scalar(2) * h), Scalar(1) / (Scalar(2) * h)};
116 return {Scalar(0.5) * h, Scalar(0.5) * h};
133template <
typename Scalar>
135 Eigen::Index n = f.size();
138 throw InvalidArgument(
"forward_difference: f and x must have same size");
147 return (df.array() / dx.array()).matrix();
160template <
typename Scalar>
176template <
typename Scalar>
178 Eigen::Index n = f.size();
181 throw InvalidArgument(
"central_difference: f and x must have same size");
190 return (df.array() / dx.array()).matrix();
208template <
typename Scalar>
213 Eigen::Index n = x.size();
215 if (n != xdot.size() || n != t.size()) {
216 throw InvalidArgument(
"integration_defects: x, xdot, t must have same size");
228 defects = dx - (xdot.head(n - 1).array() * dt.array()).matrix();
232 defects = dx - (xdot.tail(n - 1).array() * dt.array()).matrix();
239 (Scalar(0.5) * (xdot.head(n - 1) + xdot.tail(n - 1)).array() * dt.array()).matrix();
257template <
typename Scalar>
259 Scalar x0 = Scalar(0.0),
260 int derivative_degree = 1) {
261 if (derivative_degree < 0) {
262 throw InvalidArgument(
"finite_difference_coefficients: derivative_degree must be >= 0");
265 int n_points =
static_cast<int>(x.size());
266 if (n_points < derivative_degree + 1) {
268 "finite_difference_coefficients: need at least (derivative_degree + 1) grid points");
271 int N = n_points - 1;
272 int M = derivative_degree;
274 auto get_idx = [&](
int m,
int n,
int v) {
return m * (N + 1) * (N + 1) + n * (N + 1) + v; };
276 std::vector<Scalar> delta((M + 1) * (N + 1) * (N + 1), Scalar(0.0));
277 delta[get_idx(0, 0, 0)] = Scalar(1.0);
279 Scalar c1 = Scalar(1.0);
281 for (
int n = 1; n <= N; ++n) {
282 Scalar c2 = Scalar(1.0);
283 for (
int v = 0; v < n; ++v) {
284 Scalar c3 = x(n) - x(v);
287 for (
int m = 0; m <= std::min(n, M); ++m) {
288 Scalar term1 = (x(n) - x0) * delta[get_idx(m, n - 1, v)];
289 Scalar term2 = Scalar(0.0);
291 term2 =
static_cast<Scalar
>(m) * delta[get_idx(m - 1, n - 1, v)];
293 delta[get_idx(m, n, v)] = (term1 - term2) / c3;
297 for (
int m = 0; m <= std::min(n, M); ++m) {
298 Scalar term1 = Scalar(0.0);
300 term1 =
static_cast<Scalar
>(m) * delta[get_idx(m - 1, n - 1, n - 1)];
302 Scalar term2 = (x(n - 1) - x0) * delta[get_idx(m, n - 1, n - 1)];
304 delta[get_idx(m, n, n)] = (c1 / c2) * (term1 - term2);
310 for (
int i = 0; i < n_points; ++i) {
311 coeffs(i) = delta[get_idx(M, N, i)];
Custom exception hierarchy for Janus framework.
Core type aliases for numeric and symbolic Eigen/CasADi interop.
Input validation failed (e.g., mismatched sizes, invalid parameters).
Definition JanusError.hpp:31
Definition Diagnostics.hpp:19
JanusVector< Scalar > central_difference(const JanusVector< Scalar > &f, const JanusVector< Scalar > &x)
Compute derivative using central difference.
Definition FiniteDifference.hpp:177
JanusVector< Scalar > forward_difference(const JanusVector< Scalar > &f, const JanusVector< Scalar > &x)
Compute derivative using forward difference.
Definition FiniteDifference.hpp:134
JanusVector< Scalar > finite_difference_coefficients(const JanusVector< Scalar > &x, Scalar x0=Scalar(0.0), int derivative_degree=1)
Computes finite difference coefficients for arbitrary grids.
Definition FiniteDifference.hpp:258
std::pair< Scalar, Scalar > forward_euler_weights(Scalar h)
Forward Euler (explicit) differentiation weights.
Definition FiniteDifference.hpp:73
std::pair< Scalar, Scalar > trapezoidal_weights(Scalar h)
Trapezoidal integration weights.
Definition FiniteDifference.hpp:115
JanusVector< Scalar > backward_difference(const JanusVector< Scalar > &f, const JanusVector< Scalar > &x)
Compute derivative using backward difference.
Definition FiniteDifference.hpp:161
IntegrationMethod
Integration/differentiation method for trajectory optimization.
Definition FiniteDifference.hpp:24
@ BackwardEuler
First-order backward difference: x[i+1] - x[i] = xdot[i+1] * dt.
Definition FiniteDifference.hpp:26
@ ForwardEuler
First-order forward difference: x[i+1] - x[i] = xdot[i] * dt.
Definition FiniteDifference.hpp:25
@ Midpoint
Alias for Trapezoidal (same formula).
Definition FiniteDifference.hpp:28
@ Trapezoidal
Second-order trapezoidal: x[i+1] - x[i] = 0.5 * (xdot[i] + xdot[i+1]) * dt.
Definition FiniteDifference.hpp:27
std::pair< Scalar, Scalar > central_difference_weights(Scalar h)
Central difference differentiation weights.
Definition FiniteDifference.hpp:101
std::pair< Scalar, Scalar > backward_euler_weights(Scalar h)
Backward Euler (implicit) differentiation weights.
Definition FiniteDifference.hpp:87
JanusVector< Scalar > integration_defects(const JanusVector< Scalar > &x, const JanusVector< Scalar > &xdot, const JanusVector< Scalar > &t, IntegrationMethod method=IntegrationMethod::Trapezoidal)
Compute integration defects for derivative constraints.
Definition FiniteDifference.hpp:209
IntegrationMethod parse_integration_method(const std::string &method)
Parse integration method from string.
Definition FiniteDifference.hpp:47
Eigen::Matrix< Scalar, Eigen::Dynamic, 1 > JanusVector
Dynamic-size column vector for both numeric and symbolic backends.
Definition JanusTypes.hpp:49