1#ifndef __JMATH__JMATHLIB__
2#define __JMATH__JMATHLIB__
20namespace JPP {
using namespace JMATH; }
31 template<
class JF1_t,
size_t N>
43 template<
typename U,
typename V,
typename W,
size_t ...i>
45 const std::index_sequence<i...>& ls,
46 double W::* parameter)
48 return {parameters[i]..., parameter};
59 template<
typename U,
typename V,
size_t N,
typename W>
61 double W::* parameter)
63 return join<U>(parameters, std::make_index_sequence<N>{}, parameter);
76 template<
typename U,
typename V,
typename W,
size_t ...iv,
size_t ...iw>
78 const std::index_sequence<iv...>& lv,
80 const std::index_sequence<iw...>& lw)
82 return {v[iv]..., w[iw]... };
93 template<
typename U,
typename V,
size_t NV,
typename W,
size_t NW>
97 return join<U>(v, std::make_index_sequence<NV>{},
98 w, std::make_index_sequence<NW>{});
109 template<
typename U,
typename V,
size_t ...i>
111 const std::index_sequence<i...>& ls)
113 return {parameters[i]...};
123 template<
typename U,
typename V,
size_t N>
126 return convert<U>(parameters, std::make_index_sequence<N>{});
135 template<
class JF1_t>
138 return JF1_t::parameters.size();
148 template<
class JF1_t>
151 if (f1 != NULL && values != NULL) {
153 (*f1)[i] = values[i];
162 template<
class JF1_t>
172 for (
const auto& i : JF1_t::parameters) {
173 static_cast<JF1_t&
>(*this).*i = -(
static_cast<JF1_t&
>(*this).*i);
176 return static_cast<JF1_t&
>(*this);
186 JF1_t&
add(
const JF1_t& f1)
188 for (
const auto& i : JF1_t::parameters) {
189 static_cast<JF1_t&
>(*this).*i += f1.*i;
192 return static_cast<JF1_t&
>(*this);
202 JF1_t&
sub(
const JF1_t& f1)
204 for (
const auto& i : JF1_t::parameters) {
205 static_cast<JF1_t&
>(*this).*i -= f1.*i;
208 return static_cast<JF1_t&
>(*this);
218 JF1_t&
mul(
const double factor)
220 for (
const auto& i : JF1_t::parameters) {
221 static_cast<JF1_t&
>(*this).*i *= factor;
224 return static_cast<JF1_t&
>(*this);
234 JF1_t&
div(
const double factor)
236 for (
const auto& i : JF1_t::parameters) {
237 static_cast<JF1_t&
>(*this).*i /= factor;
240 return static_cast<JF1_t&
>(*this);
251 friend JF1_t&
operator+=(JF1_t& function,
const JF1_t& value)
253 return function.add(value);
264 friend JF1_t&
operator-=(JF1_t& function,
const JF1_t& value)
266 return function.sub(value);
277 friend JF1_t&
operator*=(JF1_t& function,
const double factor)
279 return function.mul(factor);
290 friend JF1_t&
operator/=(JF1_t& function,
const double factor)
292 return function.div(factor);
297 template<
class JF1_t>
300 template<
class JF1_t,
class JF2_t =
double>
303 template<
class JF1_t,
class JF2_t =
double>
306 template<
class JF1_t,
class JF2_t =
double>
309 template<
class JF1_t,
class JF2_t =
double>
312 template<
class JF1_t>
315 template<
class JF1_t>
322 template<
class JF1_t>
330 template<
class ...Args>
333 return static_cast<const JF1_t&
>(*this).getValue(args...);
459 template<
class JF2_t>
473 template<
class JF2_t>
487 template<
class JF2_t>
501 template<
class JF2_t>
540 return JF1_t::parameters.size();
552 return static_cast<const JF1_t&
>(*this).*JF1_t::parameters[i];
564 return static_cast<JF1_t&
>(*this).*JF1_t::parameters[i];
572 template<
class JF1_t>
604 template<
class ...Args>
607 return -
static_cast<const JF1_t&
>(*this).getValue(args...);
619 return -
static_cast<const JF1_t&
>(*this).getDerivative(x);
629 template<
class ...Args>
634 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
635 static_cast<JF1_t&
>(gradient).negate();
645 template<
class JF1_t>
647 public JMathlib< JAdd<JF1_t, double> >,
667 JAdd(
const JF1_t&
f1,
const double value) :
679 template<
class ...Args>
682 return static_cast<const JF1_t&
>(*this).getValue(args...) + value;
694 return static_cast<const JF1_t&
>(*this).getDerivative(x);
704 template<
class ...Args>
709 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
722 template<
class JF1_t>
724 public JMathlib< JSub<JF1_t, double> >,
744 JSub(
const JF1_t&
f1,
const double value) :
756 template<
class ...Args>
759 return static_cast<const JF1_t&
>(*this).getValue(args...) - value;
771 return static_cast<const JF1_t&
>(*this).getDerivative(x);
781 template<
class ...Args>
786 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
799 template<
class JF1_t>
801 public JMathlib< JMul<JF1_t, double> >,
821 JMul(
const JF1_t&
f1,
const double value) :
833 template<
class ...Args>
836 return static_cast<const JF1_t&
>(*this).getValue(args...) * value;
848 return static_cast<const JF1_t&
>(*this).getDerivative(x) * value;
858 template<
class ...Args>
863 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
864 static_cast<JF1_t&
>(gradient) *= value;
877 template<
class JF1_t>
879 public JMathlib< JDiv<JF1_t, double> >,
899 JDiv(
const JF1_t&
f1,
const double value) :
911 template<
class ...Args>
914 return static_cast<const JF1_t&
>(*this).getValue(args...) / value;
926 return static_cast<const JF1_t&
>(*this).getDerivative(x) / value;
936 template<
class ...Args>
941 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(args...);
942 static_cast<JF1_t&
>(gradient) /= value;
955 template<
class JF1_t,
class JF2_t,
956 bool vf1 = JF1_t::parameters.size() != 0,
957 bool vf2 = JF2_t::parameters.size() != 0>
981 const JF1_t&
f1()
const {
return static_cast<const JF1_t&
>(*this); }
982 const JF2_t&
f2()
const {
return static_cast<const JF2_t&
>(*this); }
984 JF1_t&
f1() {
return static_cast<JF1_t&
>(*this); }
985 JF2_t&
f2() {
return static_cast<JF2_t&
>(*this); }
995 template<
class JF1_t,
class JF2_t>
996 struct JPair<JF1_t, JF2_t, true, false> :
1018 const JF1_t&
f1()
const {
return static_cast<const JF1_t&
>(*this); }
1019 const JF2_t&
f2()
const {
return _f2; }
1021 JF1_t&
f1() {
return static_cast<JF1_t&
>(*this); }
1022 JF2_t&
f2() {
return _f2; }
1035 template<
class JF1_t,
class JF2_t>
1036 struct JPair<JF1_t, JF2_t, false, true> :
1058 const JF1_t&
f1()
const {
return _f1; }
1059 const JF2_t&
f2()
const {
return static_cast<const JF2_t&
>(*this); }
1061 JF1_t&
f1() {
return _f1; }
1062 JF2_t&
f2() {
return static_cast<JF2_t&
>(*this); }
1075 template<
class JF1_t,
class JF2_t>
1076 struct JPair<JF1_t, JF2_t, false, false>
1097 const JF1_t&
f1()
const {
return _f1; }
1098 const JF2_t&
f2()
const {
return _f2; }
1100 JF1_t&
f1() {
return _f1; }
1101 JF2_t&
f2() {
return _f2; }
1114 template<
class JF1_t,
class JF2_t>
1116 public JPair<JF1_t, JF2_t>,
1117 public JCalculus< JPair_t<JF1_t, JF2_t> >
1148 template<
class JF1_t,
class JF2_t>
1150 public JMathlib< JAdd<JF1_t, JF2_t> >,
1181 template<
class ...Args>
1185 this->f2().getValue(args...));
1208 template<
class ...Args>
1213 gradient.
f1() = this->
f1().getGradient(args...);
1214 gradient.
f2() = this->
f2().getGradient(args...);
1224 template<
class JF1_t,
class JF2_t>
1226 public JMathlib< JSub<JF1_t, JF2_t> >,
1257 template<
class ...Args>
1261 this->f2().getValue(args...));
1284 template<
class ...Args>
1289 gradient.
f1() = this->
f1().getGradient(args...);
1290 gradient.
f2() = this->
f2().getGradient(args...);
1291 gradient.
f2().negate();
1301 template<
class JF1_t,
class JF2_t>
1303 public JMathlib< JMul<JF1_t, JF2_t> >,
1334 template<
class ...Args>
1338 this->f2().getValue(args...));
1361 template<
class ...Args>
1366 gradient.
f1() = this->
f1().getGradient(args...);
1367 gradient.
f1() *= this->
f2().getValue(args...);
1368 gradient.
f2() = this->
f2().getGradient(args...);
1369 gradient.
f2() *= this->
f1().getValue(args...);
1379 template<
class JF1_t,
class JF2_t>
1381 public JMathlib< JDiv<JF1_t, JF2_t> >,
1412 template<
class ...Args>
1416 this->f2().getValue(args...));
1428 const double v = this->
f1().getValue(x);
1429 const double w = this->
f2().getValue(x);
1442 template<
class ...Args>
1447 const double v = this->
f1().getValue(args...);
1448 const double w = this->
f2().getValue(args...);
1450 gradient.
f1() = this->
f1().getGradient(args...);
1451 gradient.
f1() *= 1.0/w;
1452 gradient.
f2() = this->
f2().getGradient(args...);
1453 gradient.
f2() *= -v/(w*w);
1463 template<
class JF1_t>
1487 JFn(
const JF1_t& f1,
const int N) :
1499 template<
class ...Args>
1502 const double u =
static_cast<const JF1_t&
>(*this).getValue(args...);
1516 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
1517 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
1519 return N *
pow(u,
N - 1) * v;
1529 template<
class ...Args>
1534 const double u =
static_cast<const JF1_t&
>(*this).
getValue(args...);
1535 const double w =
N *
pow(u,
N - 1);
1537 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(args...);
1538 static_cast<JF1_t&
>(gradient) *= w;
1641 return N *
pow(x, N - 1);
1673 template<
class JF1_t>
1706 template<
class ...Args>
1709 return f1->getValue(args...);
1721 return f1->getDerivative(x);
1731 template<
class ...Args>
1749 template<
int ID_t,
size_t N>
1751 public JMathlib < JPolynome<ID_t, N> >,
1755 static const int ID = ID_t;
1782 template<
class ...Args>
1786 set(
std::array<std::tuple_element_t<0, std::tuple<Args...> >,
sizeof...(Args)>{args...});
1813 set(args, std::make_index_sequence<N>{});
1851 gradient.
a =
pow(x,N);
1870 template<
class T,
size_t ...i>
1884 public JMathlib < JPolynome<ID_t, 0> >,
1887 static const int ID = ID_t;
1996 template<
int ID_t,
bool normalised = false>
2001 static const int ID = ID_t;
2020 const double sigma) :
2048 const double w = 1.0 /
sigma;
2051 return get(u) * -u * w;
2065 const double w = 1.0 /
sigma;
2066 const double u = (x -
center) * w;
2067 const double f0 =
get(u);
2087 inline double get(
const double u)
const
2089 return exp(-0.5*u*u);
2099 public JMathlib < JGauss<ID_t, true> >,
2102 static const int ID = ID_t;
2121 const double sigma) :
2149 const double w = 1.0 /
sigma;
2152 return get(u) * -u * w;
2166 const double w = 1.0 /
sigma;
2167 const double u = (x -
center) * w;
2168 const double f0 =
get(u);
2188 inline double get(
const double u)
const
2190 static const double W = 1.0 / sqrt(2.0 * acos(-1.0));
2192 return exp(-0.5*u*u) * W /
sigma;
2200 template<
int ID_t,
class JF1_t = JX>
2202 public JMathlib < JPow<ID_t, JF1_t> >,
2205 static const int ID = ID_t;
2251 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2265 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2266 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2282 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2285 gradient.
alpha = w * log(u);
2287 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2288 static_cast<JF1_t&
>(gradient) *=
alpha * w / u;
2306 template<
class JF1_t>
2316 template<
class JF1_t = JX>
2351 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2365 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2366 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2368 return 0.5 * v / sqrt(u);
2382 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2384 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2385 static_cast<JF1_t&
>(gradient) *= 0.5 / sqrt(u);
2398 template<
class JF1_t>
2408 template<
class JF1_t = JX>
2443 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2457 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2458 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2474 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2476 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2477 static_cast<JF1_t&
>(gradient) *= cos(u);
2490 template<
class JF1_t>
2500 template<
class JF1_t = JX>
2535 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2549 const double u =
static_cast<const JF1_t&
>(*this).getValue(x);
2550 const double v =
static_cast<const JF1_t&
>(*this).getDerivative(x);
2566 const double u =
static_cast<const JF1_t&
>(*this).
getValue(x);
2568 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).getGradient(x);
2569 static_cast<JF1_t&
>(gradient) *= -sin(u);
2582 template<
class JF1_t>
2592 template<
class JF1_t = JX>
2627 return exp(
static_cast<const JF1_t&
>(*this).getValue(x));
2639 return static_cast<const JF1_t&
>(*this).getDerivative(x) *
getValue(x);
2653 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(x);
2654 static_cast<JF1_t&
>(gradient) *=
getValue(x);
2666 public JMathlib< JExp< JPolynome<ID_t, 0> > >,
2736 template<
class JF1_t>
2746 template<
class JF1_t = JX>
2781 return log(
static_cast<const JF1_t&
>(*this).getValue(x));
2793 return static_cast<const JF1_t&
>(*this).getDerivative(x) /
static_cast<const JF1_t&
>(*this).getValue(x);
2807 static_cast<JF1_t&
>(gradient) =
static_cast<const JF1_t&
>(*this).
getGradient(x);
2808 static_cast<JF1_t&
>(gradient) /= (
static_cast<const JF1_t&
>(*this).getValue(x));
2821 template<
class JF1_t>
constexpr size_t getNumberOfParameters()
Get number of parameters.
void setParameters(JF1_t *f1, const double *values)
Set values of all parameters.
JPow< JF1_t::ID, JF1_t > Pow(const JF1_t &f1, const double alpha)
Power of function.
static const JXn< 5 > X5
Function object for x^4;.
JSqrt< JF1_t > Sqrt(const JF1_t &f1)
Square root of function.
JExp< JF1_t > Exp(const JF1_t &f1)
Exponent of function.
static const JXn< 3 > X3
Function object for x^2;.
T pow(const T &x, const double y)
Power .
static const JXn< 4 > X4
Function object for x^3;.
JCos< JF1_t > Cos(const JF1_t &f1)
Cosine of function.
constexpr parameter_list< U, sizeof...(i)> convert(const parameter_list< V, sizeof...(i)> ¶meters, const std::index_sequence< i... > &ls)
Auxiliary method to convert parameter list.
constexpr parameter_list< U, sizeof...(i)+1 > join(const parameter_list< V, sizeof...(i)> ¶meters, const std::index_sequence< i... > &ls, double W::*parameter)
Auxiliary method to join parameter and list of parameters.
static const JXn< 2 > X2
Invalidate x^0.
JSin< JF1_t > Sin(const JF1_t &f1)
Sine of function.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
double getDerivative(const double x) const
Derivative value.
JAdd getGradient(const Args &...args) const
Get gradient.
JAdd()
Default constructor.
JAdd(const JF1_t &f1, const double value)
Constructor.
double getValue(const Args &...args) const
Function value.
Addition of two functions.
JAdd getGradient(const Args &...args) const
Get gradient.
double getDerivative(const double x) const
Derivative value.
JAdd()
Default constructor.
double getValue(const Args &...args) const
Function value.
JAdd(const JF1_t &f1, const JF2_t &f2)
Constructor.
Auxiliary base class for mathematical operations on parameters of function.
JF1_t & div(const double factor)
Scale function.
JF1_t & mul(const double factor)
Scale function.
JF1_t & add(const JF1_t &f1)
Add function.
friend JF1_t & operator+=(JF1_t &function, const JF1_t &value)
Add function.
friend JF1_t & operator/=(JF1_t &function, const double factor)
Scale function.
friend JF1_t & operator*=(JF1_t &function, const double factor)
Scale function.
JF1_t & sub(const JF1_t &f1)
Subtract function.
JF1_t & negate()
Negate function.
friend JF1_t & operator-=(JF1_t &function, const JF1_t &value)
Subtract function.
JCos(const JF1_t &f1)
Constructor.
double getDerivative(const double x) const
Derivative value.
JCos getGradient(const double x) const
Get gradient.
double getValue(const double x) const
Function value.
JCos()
Default constructor.
JDiv(const JF1_t &f1, const double value)
Constructor.
double getValue(const Args &...args) const
Function value.
JDiv getGradient(const Args &...args) const
Get gradient.
JDiv()
Default constructor.
double getDerivative(const double x) const
Derivative value.
Division of two functions.
double getValue(const Args &...args) const
Function value.
JDiv getGradient(const Args &...args) const
Get gradient.
JDiv()
Default constructor.
JDiv(const JF1_t &f1, const JF2_t &f2)
Constructor.
double getDerivative(const double x) const
Derivative value.
double getDerivative(...) const
Derivative value.
double getValue(...) const
Function value.
JExp()
Default constructor.
JExp(const JPolynome< ID_t, 0 > &f1)
Constructor.
JExp getGradient(...) const
Get gradient.
JExp()
Default constructor.
JExp getGradient(const double x) const
Get gradient.
double getDerivative(const double x) const
Derivative value.
double getValue(const double x) const
Function value.
JExp(const JF1_t &f1)
Constructor.
JFn()
Default constructor.
JFn(const JF1_t &f1, const int N)
Constructor.
double getDerivative(const double x) const
Derivative value.
JFn getGradient(const Args &...args) const
Get gradient.
double getValue(const Args &...args) const
Function value.
JGauss(const double center, const double sigma)
Constructor.
JGauss getGradient(const double x) const
Get gradient.
JGauss()
Default constructor.
double getValue(const double x) const
Function value.
double getDerivative(const double x) const
Derivative value.
double get(const double u) const
Get ordinate value.
double getDerivative(const double x) const
Derivative value.
JGauss()
Default constructor.
static constexpr parameter_list< JGauss, 2 > parameters
double getValue(const double x) const
Function value.
JGauss getGradient(const double x) const
Get gradient.
double get(const double u) const
Get ordinate value.
JGauss(const double center, const double sigma)
Constructor.
double getValue(const double x) const
Function value.
JLog getGradient(const double x) const
Get gradient.
JLog()
Default constructor.
JLog(const JF1_t &f1)
Constructor.
double getDerivative(const double x) const
Derivative value.
Auxiliary base class for mathematical operations on functions.
friend JMul< JF1_t, JF2_t > operator*(const JF1_t &f1, const JF2_t &f2)
Multiplication of two functions.
friend JDiv< JF1_t, JF2_t > operator/(const JF1_t &f1, const JF2_t &f2)
Division of two functions.
friend JAdd< JNegate< JF1_t > > operator-(const double value, const JF1_t &f1)
Subtraction of constant value.
friend JFn< JF1_t > operator^(const JF1_t &f1, int N)
Power-of operator.
double operator[](const size_t i) const
Get value of parameter at given index.
double & operator[](const size_t i)
Get value of parameter at given index.
friend JAdd< JF1_t > operator+(const double value, const JF1_t &f1)
Addition of constant value.
friend JSub< JF1_t > operator-(const JF1_t &f1, const double value)
Subtraction of constant value.
friend const JF1_t & operator+(const JF1_t &function)
Affirm operator.
friend JMul< JF1_t > operator*(const double value, const JF1_t &f1)
Multiplication of constant value.
friend JSub< JF1_t, JF2_t > operator-(const JF1_t &f1, const JF2_t &f2)
Subtraction of two functions.
friend JDiv< JF1_t > operator/(const JF1_t &f1, const double value)
Division of constant value.
double operator()(const Args &...args) const
Function value.
friend JAdd< JF1_t > operator+(const JF1_t &f1, const double value)
Addition of constant value.
static size_t size()
Get size of parameter.
friend JPf< JF1_t > operator&(const JF1_t &f1)
Address-of operator.
friend JNegate< JF1_t > operator-(const JF1_t &function)
Negate operator.
friend JAdd< JF1_t, JF2_t > operator+(const JF1_t &f1, const JF2_t &f2)
Addition of two functions.
friend JMul< JF1_t > operator*(const JF1_t &f1, const double value)
Multiplication of constant value.
double getValue(const Args &...args) const
Function value.
JMul(const JF1_t &f1, const double value)
Constructor.
double getDerivative(const double x) const
Derivative value.
JMul getGradient(const Args &...args) const
Get gradient.
JMul()
Default constructor.
Multiplication of two functions.
double getValue(const Args &...args) const
Function value.
JMul()
Default constructor.
JMul(const JF1_t &f1, const JF2_t &f2)
Constructor.
JMul getGradient(const Args &...args) const
Get gradient.
double getDerivative(const double x) const
Derivative value.
double getValue(const Args &...args) const
Function value.
JNegate()
Default constructor.
JNegate(const JF1_t &f1)
Constructor.
JNegate getGradient(const Args &...args) const
Get gradient.
double getDerivative(const double x) const
Derivative value.
JPair()
Default constructor.
JPair(const JF1_t &f1, const JF2_t &f2)
Constructor.
JPair()
Default constructor.
JPair(const JF1_t &f1, const JF2_t &f2)
Constructor.
JPair(const JF1_t &f1, const JF2_t &f2)
Constructor.
JPair()
Default constructor.
Auxiliary data structure for pair of functions.
JPair_t()
Default constructor.
JPair_t(const JF1_t &f1, const JF2_t &f2)
Constructor.
Auxiliary data structure for pair of functions.
JPair(const JF1_t &f1, const JF2_t &f2)
Constructor.
JPair()
Default constructor.
static constexpr parameter_list< JPair, JF1_t::parameters.size()+JF2_t::parameters.size()> parameters
Function object for x^5;.
JPf getGradient(const Args &...args) const
Get gradient.
JPf()
Default constructor.
JPf(const JF1_t *f1)
Constructor.
double getValue(const Args &...args) const
Function value.
static constexpr parameter_list< JPf, 0 > parameters
double getDerivative(const double x) const
Derivative value.
Termination class for polynomial function.
JPolynome(const std::array< T, 1 > &args)
Constructor.
void set(const std::array< T, 1 > &args)
Set value.
JPolynome getGradient(...) const
Get gradient.
double getValue(...) const
Function value.
double getDerivative(...) const
Derivative value.
JPolynome()
Default constructor.
JPolynome(const double a)
Constructor.
JPolynome_t & mul(const double factor)
Scale polynome.
JPolynome_t & sub(const JPolynome_t &polynome)
Subtract polynome.
JPolynome_t & add(const JPolynome_t &polynome)
Add polynome.
Recursive template class for polynomial function.
static const size_t NUMBER_OF_DEGREES
JPolynome()
Default constructor.
JPolynome(const Args &...args)
Constructor.
double getValue(const double x) const
Function value.
void set(const std::array< T, N+1 > &args, const std::index_sequence< i... > &ls)
Set values.
void set(const std::array< T, N+1 > &args)
Set values.
JPolynome getGradient(const double x) const
Get gradient.
double getDerivative(const double x) const
Derivative value.
static constexpr parameter_list< JPolynome, N+1 > parameters
JPolynome(const std::array< T, N+1 > &args)
Constructor.
double getValue(const double x) const
Function value.
JPow(const JF1_t &f1, const double alpha)
Constructor.
JPow getGradient(const double x) const
Get gradient.
JPow(const double alpha)
Constructor.
JPow()
Default constructor.
static constexpr parameter_list< JPow, JF1_t::parameters.size()+1 > parameters
double getDerivative(const double x) const
Derivative value.
JSin()
Default constructor.
double getDerivative(const double x) const
Derivative value.
double getValue(const double x) const
Function value.
JSin getGradient(const double x) const
Get gradient.
JSin(const JF1_t &f1)
Constructor.
JSqrt()
Default constructor.
double getValue(const double x) const
Function value.
double getDerivative(const double x) const
Derivative value.
JSqrt getGradient(const double x) const
Get gradient.
JSqrt(const JF1_t &f1)
Constructor.
double getValue(const Args &...args) const
Function value.
JSub getGradient(const Args &...args) const
Get gradient.
JSub()
Default constructor.
double getDerivative(const double x) const
Derivative value.
JSub(const JF1_t &f1, const double value)
Constructor.
Subtraction of two functions.
double getDerivative(const double x) const
Derivative value.
double getValue(const Args &...args) const
Function value.
JSub getGradient(const Args &...args) const
Get gradient.
JSub()
Default constructor.
JSub(const JF1_t &f1, const JF2_t &f2)
Constructor.
double getValue(const double x) const
Function value.
JX getGradient(const double x) const
Get gradient.
static constexpr parameter_list< JX, 0 > parameters
double getDerivative(const double x) const
Derivative value.
double getValue(const double x) const
Function value.
double getDerivative(const double x) const
Derivative value.
JXn()
Default constructor.
JXn getGradient(const double x) const
Get gradient.
static constexpr parameter_list< JXn, 0 > parameters