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;
165 (
v * other.
a - other.
v *
a) / (other.
a * other.
a));
209 v = (other.
v *
a) + (
v * other.
a);
225 v = (
v * other.
a - other.
v *
a) / (other.
a * other.
a);
249 return (
a == other.
a) && (
v == other.
v);
262 for (
unsigned int i = 0; i < x.
size(); ++i)
279 for (
unsigned int i = 0; i < N; ++i)
280 x[i] =
v.get(i).Re();
295 for (
unsigned int i = 0; i < N; ++i)
296 for (
unsigned int j = 0; j < N; ++j)
297 J.
at(j, i) =
v.get(j).Dual().get(i);
311 for (
unsigned int i = 0; i < N; ++i) {
313 for (
unsigned int j = 0; j < N; ++j)
314 J.
at(j, i) =
v.get(j).Dual().get(i);
316 x[i] =
v.get(i).Re();
351 return a * d.inverse();
355 #ifndef THEORETICA_NO_PRINT
361 std::stringstream res;
362 res <<
a <<
" + " <<
v << epsilon;
A generic matrix with a fixed number of rows and columns.
Definition: mat.h:132
mat< Type, N, K > resize(unsigned int n, unsigned int k) const
Compatibility function to allow for allocation or resizing of dynamic matrices.
Definition: mat.h:579
Type & at(unsigned int i, unsigned int j)
Access the element at the i-th row and j-th column.
Definition: mat.h:386
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:115
multidual operator+() const
Identity (for consistency)
Definition: multidual.h:109
multidual operator/(const multidual &other) const
Dual division.
Definition: multidual.h:157
bool operator==(const multidual &other)
Check whether two multidual numbers have the same real and multidual parts.
Definition: multidual.h:248
multidual & operator+=(const multidual &other)
Sum a real number to this one.
Definition: multidual.h:175
multidual & operator/=(const multidual &other)
Divide this multidual number by another one.
Definition: multidual.h:222
vec< real, N > v
The dual part of the multidimensional dual number as a real vector.
Definition: multidual.h:35
unsigned int size() const
Get the number of independent variables associated with the multidual number.
Definition: multidual.h:323
multidual operator-(real r) const
Subtract a real number from a multidual number.
Definition: multidual.h:139
multidual & operator-=(const multidual &other)
Subtract a real number from this one.
Definition: multidual.h:191
multidual operator*(const multidual &other) const
Multiply two multidual numbers.
Definition: multidual.h:145
real & Re()
Access the real part.
Definition: multidual.h:73
multidual operator*(real r) const
Multiply a multidual number by a real number.
Definition: multidual.h:151
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:289
multidual(real r, vec< real, N > u)
Construct a multidual number from a real number and an N dimensional vector.
Definition: multidual.h:48
multidual & operator*=(real r)
Multiply this multidual number by a real number.
Definition: multidual.h:214
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:169
multidual & operator+=(real r)
Sum a real number to this multidual number.
Definition: multidual.h:184
vec< real, N > Dual() const
Get the multidual part.
Definition: multidual.h:79
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:256
multidual & operator*=(const multidual &other)
Multiply this multidual number by another one.
Definition: multidual.h:206
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:359
vec< real, N > & Dual()
Access the multidual part.
Definition: multidual.h:85
multidual & operator/=(real r)
Divide a 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:199
multidual inverse() const
Get the inverse of a multidual number.
Definition: multidual.h:97
multidual operator+(real r) const
Sum a real number to a multidual number.
Definition: multidual.h:121
multidual & operator=(real x)
Initialize a multidual number from a real number.
Definition: multidual.h:59
multidual operator-() const
Get the opposite of a multidual number.
Definition: multidual.h:127
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:376
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:306
void resize(unsigned int size)
Change the size of the dual part of the number (only for dynamically allocated vectors)
Definition: multidual.h:330
multidual conjugate() const
Get the multidual conjugate.
Definition: multidual.h:91
multidual()
Construct a multidual number as .
Definition: multidual.h:43
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:273
multidual operator-(const multidual &other) const
Subtract two multidual numbers.
Definition: multidual.h:133
A statically allocated N-dimensional vector with elements of the given type.
Definition: vec.h:88
void resize(size_t n) const
Compatibility function to allow for allocation or resizing of dynamic vectors.
Definition: vec.h:412
TH_CONSTEXPR unsigned int size() const
Returns the size of the vector (N)
Definition: vec.h:402
#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:219
std::string string(size_t length)
Generate a random string made of human-readable ASCII characters.
Definition: random.h:102
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:188
real nan()
Return a quiet NaN number in floating point representation.
Definition: error.h:54