Janus 2.0.0
High-performance C++20 dual-mode numerical framework
Loading...
Searching...
No Matches
Pseudospectral.hpp
Go to the documentation of this file.
1
5
6#pragma once
7
11#include <tuple>
12#include <vector>
13
14namespace janus {
15
21
27
35class Pseudospectral : public TranscriptionBase<Pseudospectral> {
37
38 public:
44
54 std::tuple<SymbolicMatrix, SymbolicMatrix, NumericVector>
55 setup(int n_states, int n_controls, double t0, double tf,
56 const PseudospectralOptions &opts = {}) {
57 if (opts.n_nodes < 2) {
58 throw InvalidArgument("Pseudospectral: n_nodes must be >= 2");
59 }
60 if (n_states < 1) {
61 throw InvalidArgument("Pseudospectral: n_states must be >= 1");
62 }
63 if (n_controls < 0) {
64 throw InvalidArgument("Pseudospectral: n_controls must be >= 0");
65 }
66
69 n_nodes_ = opts.n_nodes;
70 scheme_ = opts.scheme;
71 t0_ = t0;
72 tf_fixed_ = tf;
73 tf_is_variable_ = false;
74
75 NumericVector nodes;
76 switch (scheme_) {
78 nodes = lgl_nodes(n_nodes_);
79 weights_ = lgl_weights(n_nodes_, nodes);
80 break;
82 nodes = cgl_nodes(n_nodes_);
83 weights_ = cgl_weights(n_nodes_, nodes);
84 break;
85 default:
86 throw RuntimeError("Pseudospectral: unsupported PseudospectralScheme value");
87 }
88
89 tau_ = (nodes.array() + 1.0) * 0.5;
90 D_ = spectral_diff_matrix(nodes);
91
93 for (int k = 0; k < n_nodes_; ++k) {
94 for (int i = 0; i < n_states_; ++i) {
95 states_(k, i) = opti_.variable(0.0);
96 }
97 }
98
100 for (int k = 0; k < n_nodes_; ++k) {
101 for (int i = 0; i < n_controls_; ++i) {
102 controls_(k, i) = opti_.variable(0.0);
103 }
104 }
105
106 setup_complete_ = true;
107 dynamics_set_ = false;
109 return {states_, controls_, tau_};
110 }
111
121 std::tuple<SymbolicMatrix, SymbolicMatrix, NumericVector>
122 setup(int n_states, int n_controls, double t0, const SymbolicScalar &tf,
123 const PseudospectralOptions &opts = {}) {
124 auto result = setup(n_states, n_controls, t0, 1.0, opts);
125 tf_symbolic_ = tf;
126 tf_is_variable_ = true;
127 return result;
128 }
129
132 const NumericMatrix &diff_matrix() const { return D_; }
135 const NumericVector &quadrature_weights() const { return weights_; }
136
142 SymbolicScalar quadrature(const SymbolicVector &integrand) const {
143 if (!setup_complete_) {
144 throw RuntimeError("Pseudospectral: call setup() before quadrature()");
145 }
146 if (integrand.size() != n_nodes_) {
147 throw InvalidArgument("Pseudospectral: integrand size mismatch");
148 }
149
150 SymbolicScalar weighted_sum = SymbolicScalar(0.0);
151 for (int k = 0; k < n_nodes_; ++k) {
152 weighted_sum = weighted_sum + weights_(k) * integrand(k);
153 }
154 return get_duration() / 2.0 * weighted_sum;
155 }
156
157 private:
159 NumericMatrix D_;
160 NumericVector weights_;
161
162 void add_dynamics_constraints_impl() {
163 if (!dynamics_set_) {
164 throw RuntimeError(
165 "Pseudospectral: call set_dynamics() before add_dynamics_constraints()");
166 }
167
168 const SymbolicScalar half_dt = get_duration() / 2.0;
169
170 std::vector<SymbolicVector> f(static_cast<std::size_t>(n_nodes_));
171 for (int k = 0; k < n_nodes_; ++k) {
175 f[static_cast<std::size_t>(k)] = dynamics_(x_k, u_k, t_k);
176 }
177
178 for (int s = 0; s < n_states_; ++s) {
179 for (int i = 0; i < n_nodes_; ++i) {
180 SymbolicScalar Dx_i = SymbolicScalar(0.0);
181 for (int j = 0; j < n_nodes_; ++j) {
182 Dx_i = Dx_i + D_(i, j) * states_(j, s);
183 }
184 opti_.subject_to(Dx_i == half_dt * f[static_cast<std::size_t>(i)](s));
185 }
186 }
187 }
188};
189
190} // namespace janus
Custom exception hierarchy for Janus framework.
Orthogonal polynomial evaluation, spectral nodes, weights, and differentiation matrices.
Shared CRTP base for trajectory transcription methods.
Input validation failed (e.g., mismatched sizes, invalid parameters).
Definition JanusError.hpp:31
Main optimization environment class.
Definition Opti.hpp:167
const NumericMatrix & diff_matrix() const
Get the spectral differentiation matrix.
Definition Pseudospectral.hpp:132
Pseudospectral(Opti &opti)
Construct with a reference to the optimization environment.
Definition Pseudospectral.hpp:43
const NumericVector & quadrature_weights() const
Get the quadrature weights.
Definition Pseudospectral.hpp:135
std::tuple< SymbolicMatrix, SymbolicMatrix, NumericVector > setup(int n_states, int n_controls, double t0, double tf, const PseudospectralOptions &opts={})
Set up the pseudospectral problem with fixed final time.
Definition Pseudospectral.hpp:55
std::tuple< SymbolicMatrix, SymbolicMatrix, NumericVector > setup(int n_states, int n_controls, double t0, const SymbolicScalar &tf, const PseudospectralOptions &opts={})
Set up the pseudospectral problem with variable final time.
Definition Pseudospectral.hpp:122
SymbolicScalar quadrature(const SymbolicVector &integrand) const
Compute quadrature of an integrand over the time domain.
Definition Pseudospectral.hpp:142
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
NumericVector cgl_weights(int N, const NumericVector &nodes)
CGL (Clenshaw-Curtis) quadrature weights on [-1, 1].
Definition OrthogonalPolynomials.hpp:224
JanusMatrix< NumericScalar > NumericMatrix
Eigen::MatrixXd equivalent.
Definition JanusTypes.hpp:66
NumericVector lgl_weights(int N, const NumericVector &nodes)
LGL quadrature weights.
Definition OrthogonalPolynomials.hpp:200
JanusVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition JanusTypes.hpp:67
@ CGL
Chebyshev-Gauss-Lobatto nodes.
Definition BirkhoffPseudospectral.hpp:19
@ LGL
Legendre-Gauss-Lobatto nodes.
Definition BirkhoffPseudospectral.hpp:18
PseudospectralScheme
Available pseudospectral node distributions.
Definition Pseudospectral.hpp:17
@ CGL
Chebyshev-Gauss-Lobatto.
Definition Pseudospectral.hpp:19
@ LGL
Legendre-Gauss-Lobatto.
Definition Pseudospectral.hpp:18
JanusMatrix< SymbolicScalar > SymbolicMatrix
Eigen matrix of MX elements.
Definition JanusTypes.hpp:71
NumericMatrix spectral_diff_matrix(const NumericVector &nodes)
Spectral differentiation matrix using barycentric weights.
Definition OrthogonalPolynomials.hpp:412
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 Pseudospectral setup.
Definition Pseudospectral.hpp:23
int n_nodes
Number of collocation nodes (including endpoints).
Definition Pseudospectral.hpp:25
PseudospectralScheme scheme
Definition Pseudospectral.hpp:24
JanusVector< SymbolicScalar > SymbolicVector
Eigen vector of MX elements.
Definition JanusTypes.hpp:72
casadi::MX SymbolicScalar
CasADi MX symbolic scalar.
Definition JanusTypes.hpp:70