Metis 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 metis {
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 metis
Custom exception hierarchy for Metis 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 MetisError.hpp:31
Main optimization environment class.
Definition Opti.hpp:167
Pseudospectral(Opti &opti)
Construct with a reference to the optimization environment.
Definition Pseudospectral.hpp:43
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
const NumericVector & quadrature_weights() const
Get the quadrature weights.
Definition Pseudospectral.hpp:135
SymbolicScalar quadrature(const SymbolicVector &integrand) const
Compute quadrature of an integrand over the time domain.
Definition Pseudospectral.hpp:142
const NumericMatrix & diff_matrix() const
Get the spectral differentiation matrix.
Definition Pseudospectral.hpp:132
Operation failed at runtime (e.g., CasADi eval with free variables).
Definition MetisError.hpp:41
double t0_
Definition TranscriptionBase.hpp:158
SymbolicMatrix states_
Definition TranscriptionBase.hpp:168
int n_states() const
Definition TranscriptionBase.hpp:133
NumericVector tau_
Definition TranscriptionBase.hpp:167
int n_controls_
Definition TranscriptionBase.hpp:155
SymbolicMatrix controls_
Definition TranscriptionBase.hpp:169
TranscriptionBase(Opti &opti)
Definition TranscriptionBase.hpp:34
SymbolicScalar get_duration() const
Definition TranscriptionBase.hpp:175
SymbolicVector get_state_at_node(int k) const
Definition TranscriptionBase.hpp:189
bool setup_complete_
Definition TranscriptionBase.hpp:163
int n_states_
Definition TranscriptionBase.hpp:154
double tf_fixed_
Definition TranscriptionBase.hpp:159
Opti & opti_
Definition TranscriptionBase.hpp:153
SymbolicScalar get_time_at_node(int k) const
Definition TranscriptionBase.hpp:182
int n_controls() const
Definition TranscriptionBase.hpp:136
int n_nodes_
Definition TranscriptionBase.hpp:156
std::function< SymbolicVector(const SymbolicVector &, const SymbolicVector &, const SymbolicScalar &)> dynamics_
Definition TranscriptionBase.hpp:173
SymbolicScalar tf_symbolic_
Definition TranscriptionBase.hpp:160
bool dynamics_set_
Definition TranscriptionBase.hpp:164
bool dynamics_constraints_added_
Definition TranscriptionBase.hpp:165
bool tf_is_variable_
Definition TranscriptionBase.hpp:161
SymbolicVector get_control_at_node(int k) const
Definition TranscriptionBase.hpp:200
Definition Diagnostics.hpp:19
MetisVector< SymbolicScalar > SymbolicVector
Eigen vector of MX elements.
Definition MetisTypes.hpp:72
NumericMatrix spectral_diff_matrix(const NumericVector &nodes)
Spectral differentiation matrix using barycentric weights.
Definition OrthogonalPolynomials.hpp:412
MetisVector< NumericScalar > NumericVector
Eigen::VectorXd equivalent.
Definition MetisTypes.hpp:67
casadi::MX SymbolicScalar
CasADi MX symbolic scalar.
Definition MetisTypes.hpp:70
@ 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
NumericVector cgl_weights(int N, const NumericVector &nodes)
CGL (Clenshaw-Curtis) quadrature weights on [-1, 1].
Definition OrthogonalPolynomials.hpp:224
NumericVector cgl_nodes(int N)
Compute Chebyshev-Gauss-Lobatto nodes on [-1, 1].
Definition OrthogonalPolynomials.hpp:181
NumericVector lgl_weights(int N, const NumericVector &nodes)
LGL quadrature weights.
Definition OrthogonalPolynomials.hpp:200
NumericVector lgl_nodes(int N)
Compute Legendre-Gauss-Lobatto nodes on [-1, 1].
Definition OrthogonalPolynomials.hpp:138
MetisMatrix< SymbolicScalar > SymbolicMatrix
Eigen matrix of MX elements.
Definition MetisTypes.hpp:71
MetisMatrix< NumericScalar > NumericMatrix
Eigen::MatrixXd equivalent.
Definition MetisTypes.hpp:66
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
MetisVector< SymbolicScalar > SymbolicVector
Eigen vector of MX elements.
Definition MetisTypes.hpp:72
casadi::MX SymbolicScalar
CasADi MX symbolic scalar.
Definition MetisTypes.hpp:70