Janus 2.0.0
High-performance C++20 dual-mode numerical framework
Loading...
Searching...
No Matches
BirkhoffPseudospectral.hpp
Go to the documentation of this file.
1
5
6#pragma once
7
11#include <tuple>
12#include <vector>
13
14namespace janus {
15
17enum class BirkhoffScheme {
20};
21
27
37class BirkhoffPseudospectral : public TranscriptionBase<BirkhoffPseudospectral> {
39
40 public:
46
56 std::tuple<SymbolicMatrix, SymbolicMatrix, NumericVector>
57 setup(int n_states, int n_controls, double t0, double tf,
58 const BirkhoffPseudospectralOptions &opts = {}) {
59 if (opts.n_nodes < 2) {
60 throw InvalidArgument("BirkhoffPseudospectral: n_nodes must be >= 2");
61 }
62 if (n_states < 1) {
63 throw InvalidArgument("BirkhoffPseudospectral: n_states must be >= 1");
64 }
65 if (n_controls < 0) {
66 throw InvalidArgument("BirkhoffPseudospectral: n_controls must be >= 0");
67 }
68
71 n_nodes_ = opts.n_nodes;
72 scheme_ = opts.scheme;
73 t0_ = t0;
74 tf_fixed_ = tf;
75 tf_is_variable_ = false;
76
77 NumericVector nodes;
78 switch (scheme_) {
80 nodes = lgl_nodes(n_nodes_);
81 break;
83 nodes = cgl_nodes(n_nodes_);
84 break;
85 default:
86 throw RuntimeError("BirkhoffPseudospectral: unsupported BirkhoffScheme value");
87 }
88
89 tau_ = (nodes.array() + 1.0) * 0.5;
91 bk_weights_ = B_.row(n_nodes_ - 1).transpose();
92
94 for (int k = 0; k < n_nodes_; ++k) {
95 for (int i = 0; i < n_states_; ++i) {
96 states_(k, i) = opti_.variable(0.0);
97 }
98 }
99
101 for (int k = 0; k < n_nodes_; ++k) {
102 for (int i = 0; i < n_controls_; ++i) {
103 controls_(k, i) = opti_.variable(0.0);
104 }
105 }
106
108 for (int k = 0; k < n_nodes_; ++k) {
109 for (int i = 0; i < n_states_; ++i) {
110 V_(k, i) = opti_.variable(0.0);
111 }
112 }
113
114 setup_complete_ = true;
115 dynamics_set_ = false;
117 return {states_, controls_, tau_};
118 }
119
129 std::tuple<SymbolicMatrix, SymbolicMatrix, NumericVector>
130 setup(int n_states, int n_controls, double t0, const SymbolicScalar &tf,
131 const BirkhoffPseudospectralOptions &opts = {}) {
132 auto result = setup(n_states, n_controls, t0, 1.0, opts);
133 tf_symbolic_ = tf;
134 tf_is_variable_ = true;
135 return result;
136 }
137
140 const NumericMatrix &integration_matrix() const { return B_; }
143 const NumericVector &quadrature_weights() const { return bk_weights_; }
146 const SymbolicMatrix &virtual_vars() const { return V_; }
147
153 SymbolicScalar quadrature(const SymbolicVector &integrand) const {
154 if (!setup_complete_) {
155 throw RuntimeError("BirkhoffPseudospectral: call setup() before quadrature()");
156 }
157 if (integrand.size() != n_nodes_) {
158 throw InvalidArgument("BirkhoffPseudospectral: integrand size mismatch");
159 }
160
161 SymbolicScalar weighted_sum = SymbolicScalar(0.0);
162 for (int k = 0; k < n_nodes_; ++k) {
163 weighted_sum = weighted_sum + bk_weights_(k) * integrand(k);
164 }
165 return get_duration() / 2.0 * weighted_sum;
166 }
167
168 private:
170 NumericMatrix B_;
171 NumericVector bk_weights_;
173
174 void add_dynamics_constraints_impl() {
175 if (!dynamics_set_) {
176 throw RuntimeError(
177 "BirkhoffPseudospectral: call set_dynamics() before add_dynamics_constraints()");
178 }
179
180 const SymbolicScalar half_dt = get_duration() / 2.0;
181
182 std::vector<SymbolicVector> f(static_cast<std::size_t>(n_nodes_));
183 for (int k = 0; k < n_nodes_; ++k) {
184 f[static_cast<std::size_t>(k)] =
186 }
187
188 for (int s = 0; s < n_states_; ++s) {
189 // Pointwise nonlinear dynamics: V_i = (dt/2) * f_i(X_i, U_i, t_i)
190 for (int i = 0; i < n_nodes_; ++i) {
191 opti_.subject_to(V_(i, s) == half_dt * f[static_cast<std::size_t>(i)](s));
192 }
193
194 // Linear state recovery for interior nodes.
195 for (int i = 1; i < n_nodes_ - 1; ++i) {
196 SymbolicScalar Bv_i = SymbolicScalar(0.0);
197 for (int j = 0; j < n_nodes_; ++j) {
198 Bv_i = Bv_i + B_(i, j) * V_(j, s);
199 }
200 opti_.subject_to(states_(i, s) == states_(0, s) + Bv_i);
201 }
202
203 // Right boundary grid-equivalency.
205 for (int j = 0; j < n_nodes_; ++j) {
206 wv = wv + bk_weights_(j) * V_(j, s);
207 }
208 opti_.subject_to(states_(n_nodes_ - 1, s) == states_(0, s) + wv);
209 }
210 }
211};
212
213} // namespace janus
Custom exception hierarchy for Janus framework.
Orthogonal polynomial evaluation, spectral nodes, weights, and differentiation matrices.
Shared CRTP base for trajectory transcription methods.
BirkhoffPseudospectral(Opti &opti)
Construct with a reference to the optimization environment.
Definition BirkhoffPseudospectral.hpp:45
std::tuple< SymbolicMatrix, SymbolicMatrix, NumericVector > setup(int n_states, int n_controls, double t0, const SymbolicScalar &tf, const BirkhoffPseudospectralOptions &opts={})
Set up the Birkhoff problem with variable final time.
Definition BirkhoffPseudospectral.hpp:130
SymbolicScalar quadrature(const SymbolicVector &integrand) const
Compute quadrature of an integrand over the time domain.
Definition BirkhoffPseudospectral.hpp:153
const NumericVector & quadrature_weights() const
Get the Birkhoff quadrature weights.
Definition BirkhoffPseudospectral.hpp:143
std::tuple< SymbolicMatrix, SymbolicMatrix, NumericVector > setup(int n_states, int n_controls, double t0, double tf, const BirkhoffPseudospectralOptions &opts={})
Set up the Birkhoff problem with fixed final time.
Definition BirkhoffPseudospectral.hpp:57
const NumericMatrix & integration_matrix() const
Get the Birkhoff integration matrix.
Definition BirkhoffPseudospectral.hpp:140
const SymbolicMatrix & virtual_vars() const
Get the virtual (derivative) decision variables.
Definition BirkhoffPseudospectral.hpp:146
Input validation failed (e.g., mismatched sizes, invalid parameters).
Definition JanusError.hpp:31
Main optimization environment class.
Definition Opti.hpp:167
Operation failed at runtime (e.g., CasADi eval with free variables).
Definition JanusError.hpp:41
bool tf_is_variable_
Definition TranscriptionBase.hpp:161
SymbolicMatrix controls_
Definition TranscriptionBase.hpp:169
int n_controls_
Definition TranscriptionBase.hpp:155
int n_controls() const
Definition TranscriptionBase.hpp:136
int n_states_
Definition TranscriptionBase.hpp:154
double t0_
Definition TranscriptionBase.hpp:158
int n_states() const
Definition TranscriptionBase.hpp:133
NumericVector tau_
Definition TranscriptionBase.hpp:167
TranscriptionBase(Opti &opti)
Definition TranscriptionBase.hpp:34
double tf_fixed_
Definition TranscriptionBase.hpp:159
std::function< SymbolicVector(const SymbolicVector &, const SymbolicVector &, const SymbolicScalar &)> dynamics_
Definition TranscriptionBase.hpp:173
SymbolicScalar tf_symbolic_
Definition TranscriptionBase.hpp:160
SymbolicMatrix states_
Definition TranscriptionBase.hpp:168
bool setup_complete_
Definition TranscriptionBase.hpp:163
int n_nodes_
Definition TranscriptionBase.hpp:156
SymbolicVector get_state_at_node(int k) const
Definition TranscriptionBase.hpp:189
SymbolicScalar get_duration() const
Definition TranscriptionBase.hpp:175
SymbolicVector get_control_at_node(int k) const
Definition TranscriptionBase.hpp:200
bool dynamics_constraints_added_
Definition TranscriptionBase.hpp:165
SymbolicScalar get_time_at_node(int k) const
Definition TranscriptionBase.hpp:182
bool dynamics_set_
Definition TranscriptionBase.hpp:164
Opti & opti_
Definition TranscriptionBase.hpp:153
Definition Diagnostics.hpp:19
JanusVector< SymbolicScalar > SymbolicVector
Eigen vector of MX elements.
Definition JanusTypes.hpp:72
NumericMatrix birkhoff_integration_matrix(const NumericVector &nodes)
Compute Birkhoff integration matrix B^a for the node set.
Definition OrthogonalPolynomials.hpp:354
JanusMatrix< NumericScalar > NumericMatrix
Eigen::MatrixXd equivalent.
Definition JanusTypes.hpp:66
JanusVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition JanusTypes.hpp:67
BirkhoffScheme
Available Birkhoff node distributions.
Definition BirkhoffPseudospectral.hpp:17
@ CGL
Chebyshev-Gauss-Lobatto nodes.
Definition BirkhoffPseudospectral.hpp:19
@ LGL
Legendre-Gauss-Lobatto nodes.
Definition BirkhoffPseudospectral.hpp:18
JanusMatrix< SymbolicScalar > SymbolicMatrix
Eigen matrix of MX elements.
Definition JanusTypes.hpp:71
NumericVector lgl_nodes(int N)
Compute Legendre-Gauss-Lobatto nodes on [-1, 1].
Definition OrthogonalPolynomials.hpp:138
NumericVector cgl_nodes(int N)
Compute Chebyshev-Gauss-Lobatto nodes on [-1, 1].
Definition OrthogonalPolynomials.hpp:181
casadi::MX SymbolicScalar
CasADi MX symbolic scalar.
Definition JanusTypes.hpp:70
Options for BirkhoffPseudospectral setup.
Definition BirkhoffPseudospectral.hpp:23
BirkhoffScheme scheme
Definition BirkhoffPseudospectral.hpp:24
int n_nodes
Number of collocation nodes (including endpoints).
Definition BirkhoffPseudospectral.hpp:25
casadi::MX SymbolicScalar
CasADi MX symbolic scalar.
Definition JanusTypes.hpp:70