1#ifndef THEORETICA_MULTIDUAL_H
2#define THEORETICA_MULTIDUAL_H
9#ifndef THEORETICA_NO_PRINT
14#include "../algebra/vec.h"
15#include "../algebra/mat.h"
25 template<
unsigned int N = 0>
38 static constexpr size_t vector_argument = N;
79 inline vec<real, N>
Dual()
const {
85 inline vec<real, N>&
Dual() {
162 return multidual(
a * other.a, other.v *
a +
v * other.a);
181 (
v * other.a - other.v *
a) / (other.a * other.a));
225 v = (other.v *
a) + (
v * other.a);
241 v = (
v * other.a - other.v *
a) / (other.a * other.a);
251 v = vec<real, N>(N,
nan());
265 return (
a == other.a) && (
v == other.v);
273 const vec<real, N>& x) {
275 vec<multidual<N>, N> arg;
278 for (
unsigned int i = 0; i < x.
size(); ++i)
279 arg[i] = multidual<N>(
290 const vec<multidual<N>, N>&
v) {
295 for (
unsigned int i = 0; i < N; ++i)
306 const vec<multidual<N>, N>&
v) {
309 J.resize(
v.size(),
v.size());
311 for (
unsigned int i = 0; i < N; ++i)
312 for (
unsigned int j = 0; j < N; ++j)
313 J(j, i) =
v[j].Dual(i);
323 const vec<multidual<N>, N>&
v,
325 mat<real, N, N>& J) {
327 for (
unsigned int i = 0; i < N; ++i) {
329 for (
unsigned int j = 0; j < N; ++j)
330 J(j, i) =
v[j].Dual(i);
371#ifndef THEORETICA_NO_PRINT
375 inline std::string
to_string(
const std::string& epsilon =
"e")
const {
377 std::stringstream res;
378 res <<
a <<
" + " <<
v << epsilon;
385 inline operator std::string() {
393 return out << obj.to_string();
Multidual number algebra for functions of the form .
Definition multidual.h:26
multidual operator+(const multidual &other) const
Sum two multidual numbers.
Definition multidual.h:131
real & Dual(unsigned int i)
Access the i-th element of the multidual part, corresponding to the i-th independent variable in auto...
Definition multidual.h:101
multidual operator+() const
Identity (for consistency)
Definition multidual.h:125
multidual operator/(const multidual &other) const
Dual division.
Definition multidual.h:173
bool operator==(const multidual &other)
Check whether two multidual numbers have the same real and multidual parts.
Definition multidual.h:264
multidual & operator*=(real r)
Multiply this multidual number by a real number.
Definition multidual.h:230
multidual & operator-=(real r)
Subtract a real number from this multidual number.
Definition multidual.h:215
multidual & operator*=(const multidual &other)
Multiply this multidual number by another one.
Definition multidual.h:222
multidual & operator/=(const multidual &other)
Divide this multidual number by another one.
Definition multidual.h:238
multidual & operator+=(const multidual &other)
Sum a real number to this one.
Definition multidual.h:191
real Dual(unsigned int i) const
Get the i-th element of the multidual part, corresponding to the i-th independent variable in automat...
Definition multidual.h:93
vec< real, N > v
The dual part of the multidimensional dual number as a real vector.
Definition multidual.h:35
multidual & operator-=(const multidual &other)
Subtract a real number from this one.
Definition multidual.h:207
friend std::ostream & operator<<(std::ostream &out, const multidual &obj)
Stream the multidual number in string representation to an output stream (std::ostream)
Definition multidual.h:392
unsigned int size() const
Get the number of independent variables associated with the multidual number.
Definition multidual.h:339
multidual operator-(real r) const
Subtract a real number from a multidual number.
Definition multidual.h:155
multidual operator*(const multidual &other) const
Multiply two multidual numbers.
Definition multidual.h:161
multidual & operator+=(real r)
Sum a real number to this multidual number.
Definition multidual.h:200
multidual operator*(real r) const
Multiply a multidual number by a real number.
Definition multidual.h:167
multidual(real r, vec< real, N > u)
Construct a multidual number from a real number and an N dimensional vector.
Definition multidual.h:48
real a
The real part of the multidimensional dual number.
Definition multidual.h:31
multidual operator/(real r) const
Divide a multidual number by a real number.
Definition multidual.h:185
multidual & operator/=(real r)
Divide a multidual number by a real number.
Definition multidual.h:246
vec< real, N > & Dual()
Access the multidual part.
Definition multidual.h:85
static vec< real, N > extract_real(const vec< multidual< N >, N > &v)
Extract the real vector from a vector of multidual numbers as a vec<real, N>
Definition multidual.h:289
static vec< multidual< N >, N > make_argument(const vec< real, N > &x)
Construct an N-dimensional vector of multidual numbers to be passed as argument to a multidual functi...
Definition multidual.h:272
vec< real, N > Dual() const
Get the multidual part.
Definition multidual.h:79
multidual(real r)
Construct a multidual number from a real number.
Definition multidual.h:53
real Re() const
Get the real part.
Definition multidual.h:67
std::string to_string(const std::string &epsilon="e") const
Convert the multidual number to string representation.
Definition multidual.h:375
static mat< real, N, N > extract_dual(const vec< multidual< N >, N > &v)
Extract the dual matrix (Jacobian) from a vector of multidual numbers as a mat<N, N>
Definition multidual.h:305
multidual inverse() const
Get the inverse of a multidual number.
Definition multidual.h:113
multidual operator+(real r) const
Sum a real number to a multidual number.
Definition multidual.h:137
multidual operator-() const
Get the opposite of a multidual number.
Definition multidual.h:143
static void extract(const vec< multidual< N >, N > &v, vec< real, N > &x, mat< real, N, N > &J)
Extract the real vector and dual matrix from a vector of multidual numbers as a vec<real,...
Definition multidual.h:322
void resize(unsigned int size)
Change the size of the dual part of the number (only for dynamically allocated vectors)
Definition multidual.h:346
multidual conjugate() const
Get the multidual conjugate.
Definition multidual.h:107
real & Re()
Access the real part.
Definition multidual.h:73
multidual()
Construct a multidual number as .
Definition multidual.h:43
multidual & operator=(real x)
Initialize a multidual number from a real number.
Definition multidual.h:59
multidual operator-(const multidual &other) const
Subtract two multidual numbers.
Definition multidual.h:149
A statically allocated N-dimensional vector with elements of the given type.
Definition vec.h:92
void resize(size_t n) const
Compatibility function to allow for allocation or resizing of dynamic vectors.
Definition vec.h:422
TH_CONSTEXPR unsigned int size() const
Returns the size of the vector (N)
Definition vec.h:412
#define TH_MATH_ERROR(F_NAME, VALUE, EXCEPTION)
TH_MATH_ERROR is a macro which throws exceptions or modifies errno (depending on which compiling opti...
Definition error.h:225
Main namespace of the library which contains all functions and objects.
Definition algebra.h:27
double real
A real number, defined as a floating point type.
Definition constants.h:198
TH_CONSTEXPR real nan()
Return a quiet NaN number in floating point representation.
Definition error.h:54