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;
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();
293 J.resize(
v.size(),
v.size());
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();
355#ifndef THEORETICA_NO_PRINT
361 std::stringstream
res;
369 inline operator std::string() {
377 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: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*=(real r)
Multiply this multidual number by a real number.
Definition multidual.h:214
multidual & operator-=(real r)
Subtract a real number from this multidual number.
Definition multidual.h:199
multidual & operator*=(const multidual &other)
Multiply this multidual number by another one.
Definition multidual.h:206
multidual & operator/=(const multidual &other)
Divide this multidual number by another one.
Definition multidual.h:222
multidual & operator+=(const multidual &other)
Sum a real number to this one.
Definition multidual.h:175
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:191
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
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) const
Multiply two multidual numbers.
Definition multidual.h:145
multidual & operator+=(real r)
Sum a real number to this multidual number.
Definition multidual.h:184
multidual operator*(real r) const
Multiply a multidual number by a real number.
Definition multidual.h:151
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:169
multidual & operator/=(real r)
Divide a multidual number by a real number.
Definition multidual.h:230
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:273
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
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:359
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 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-() const
Get the opposite of a multidual number.
Definition multidual.h:127
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
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:133
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:416
Type get(unsigned int i) const
Getters and setters.
Definition vec.h:326
TH_CONSTEXPR unsigned int size() const
Returns the size of the vector (N)
Definition vec.h:406
#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
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
std::remove_reference_t< decltype(std::declval< Structure >()[0])> vector_element_t
Extract the type of a vector (or any indexable container) from its operator[].
Definition core_traits.h:134
real nan()
Return a quiet NaN number in floating point representation.
Definition error.h:54