5 # ifndef VCCC_MATH_PARTIAL_DIFF_HPP
6 # define VCCC_MATH_PARTIAL_DIFF_HPP
70 template<
typename T, std::size_t I,
71 typename Func,
typename VarTuple,
typename ...Args>
73 auto x1 = addEpsilon<I>(vars, epsilon<T>());
74 auto x2 = addEpsilon<I>(vars, -epsilon<T>());
75 auto dx = std::get<I>(x1) - std::get<I>(x2);
77 auto fx1 = internal::math::applyTupleAndVariadics(f, x1, args...);
78 auto fx2 = internal::math::applyTupleAndVariadics(f, x2, args...);
79 return (fx1 - fx2) / dx;
95 template<
typename T, std::size_t I,
96 typename Func,
typename VarTuple,
typename ...Args>
100 auto x1 = addEpsilon<I>(vars, epsilon<T>());
102 auto dx = std::get<I>(x1) - std::get<I>(x2);
104 auto fx1 = internal::math::applyTupleAndVariadics(f, x1, args...);
105 auto fx2 = internal::math::applyTupleAndVariadics(f, x2, args...);
106 return (fx1 - fx2) / dx;
121 template<
typename T, std::size_t I,
122 typename Func,
typename VarTuple,
typename ...Args>
126 auto x1 = addEpsilon<I>(vars, 2 * epsilon<T>());
127 auto x2 = addEpsilon<I>(vars, epsilon<T>());
128 auto x3 = addEpsilon<I>(vars, - epsilon<T>());
129 auto x4 = addEpsilon<I>(vars, -2 * epsilon<T>());
131 auto fx1 = internal::math::applyTupleAndVariadics(f, x1, args...);
132 auto fx2 = internal::math::applyTupleAndVariadics(f, x2, args...);
133 auto fx3 = internal::math::applyTupleAndVariadics(f, x3, args...);
134 auto fx4 = internal::math::applyTupleAndVariadics(f, x4, args...);
137 auto fsum = -fx1 + 8*fx2 - 8*fx3 + fx4;
138 if(std::get<I>(vars) == 0)
139 return fsum / (epsilon<T>() * 12);
140 return fsum / (std::get<I>(vars) * (epsilon<T>() * 12));
auto partialDiff(differential_symmetric_t, Func f, VarTuple vars, Args &&... args)
get partial differential value using symmetric method
Definition: partial_diff.hpp:72
Definition: directory.h:12
Definition: partial_diff.hpp:42
Definition: partial_diff.hpp:40
Definition: partial_diff.hpp:41