1#ifndef CLASSIC_FTpsMath_HH
2#define CLASSIC_FTpsMath_HH
37template<
class T>
struct is_complex<
std::complex<T>> : std::true_type {};
45template <
class T,
int N>
49template <
class T,
int N>
53template <
class T,
int N>
57template <
class T,
int N>
61template <
class T,
int N>
65template <
class T,
int N>
69template <
class T,
int N>
73template <
class T,
int N>
77template <
class T,
int N>
81template <
class T,
int N>
85template <
class T,
int N>
89template <
class T,
int N>
93template <
class T,
int N>
97template <
class T,
int N>
101template <
class T,
int N>
105template <
class T,
int N>
109template <
class T,
int N>
113template <
class T,
int N>
120template <
class T,
int N>
127 while(y-- > 0) z = z.
multiply(x, trunc);
132 while(y++ < 0) z = z.
multiply(t, trunc);
139template <
class T,
int N>
146 "Square-root of EXACT polynomial must be truncated.");
149 if( ( std::real(aZero) <= std::real(T(0)) &&
150 std::imag(aZero) <= std::real(T(0))
153 std::cerr <<
"FTps::sqrt(x) called with\nconstant term = " << aZero
155 <<
"x = " << x << std::endl;
159 T two_aZero = T(2) * aZero;
161 series[0] =
sqrt(aZero);
162 for(
int i = 1; i <= trcOrder; i++) {
163 series[i] = series[i-1] * double(3 - 2 * i) / (two_aZero * double(i));
166 return x.
taylor(series, trcOrder);
170template <
class T,
int N>
177 "Sine of EXACT polynomial must be truncated.");
183 series[0] =
sin(aZero);
184 series[1] =
cos(aZero);
185 for(
int i = 2; i <= trcOrder; i++) {
186 series[i] = - series[i-2] / double(i * (i - 1));
189 return x.
taylor(series, trcOrder);
193template <
class T,
int N>
200 "Cosine of EXACT polynomial must be truncated.");
206 series[0] =
cos(aZero);
207 series[1] = -
sin(aZero);
208 for(
int i = 2; i <= trcOrder; i++) {
209 series[i] = - series[i-2] / double(i * (i - 1));
212 return x.
taylor(series, trcOrder);
216template <
class T,
int N>
221 return sin(x, trunc) /
cos(x, trunc);
224template <
class T,
int N>
231 return cos(x, trunc) /
sin(x, trunc);
235template <
class T,
int N>
243template <
class T,
int N>
250 return sin(x, trunc).inverse();
254template <
class T,
int N>
261 "Exponential of EXACT polynomial must be truncated.");
267 series[0] =
exp(aZero);
268 for(
int i = 1; i <= trcOrder; i++) {
269 series[i] = series[i-1] / double(i);
272 return x.
taylor(series, trcOrder);
276template <
class T,
int N>
283 "Logarithm of EXACT polynomial must be truncated.");
289 T a0inv = T(1) / aZero;
292 series[0] = std::log(aZero);
294 for(
int i = 2; i <= trcOrder; i++) {
296 series[i] = ain / double(i);
299 return x.
taylor(series, trcOrder);
303template <
class T,
int N>
310 "Hyperbolic sine of EXACT polynomial must be truncated.");
316 series[0] =
sinh(aZero);
317 series[1] =
cosh(aZero);
318 for(
int i = 2; i <= trcOrder; i++) {
319 series[i] = series[i-2] / double(i * (i - 1));
322 return x.
taylor(series, trcOrder);
326template <
class T,
int N>
333 "Hyperbolic cosine of EXACT polynomial must be truncated.");
339 series[0] =
cosh(aZero);
340 series[1] =
sinh(aZero);
341 for(
int i = 2; i <= trcOrder; i++) {
342 series[i] = series[i-2] / double(i * (i - 1));
345 return x.
taylor(series, trcOrder);
349template <
class T,
int N>
353 return sinh(x, trunc) /
cosh(x, trunc);
357template <
class T,
int N>
364 return cosh(x, trunc) /
sinh(x, trunc);
368template <
class T,
int N>
376template <
class T,
int N>
383 return sinh(x, trunc).inverse();
387template <
class T,
int N>
392 "Error function does not support complex numbers.");
399 "Error function of EXACT polynomial must be truncated.");
405 series[0] = std::erf(std::real(aZero));
406 series[1] = 2.0 / std::sqrt(
Physics::pi) * std::exp(-aZero*aZero);
408 for(
int i = 2; i <= trcOrder; ++i) {
409 series[i] = - 2.0 / double(i-1) * double((i-2)) * series[i-2] / double(i);
412 return x.
taylor(series, trcOrder);
416template <
class T,
int N>
420 return T(1) -
erf(x, trunc);
FTps< T, N > csc(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Cosecant.
FTps< T, N > exp(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Exponential.
FTps< T, N > pow(const FTps< T, N > &x, int y, int trunc=(FTps< T, N >::EXACT))
Tps x to the power (int y).
FTps< T, N > cot(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Cotangent.
FTps< T, N > sqrt(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Square root.
FTps< T, N > sech(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Hyperbolic secant.
FTps< T, N > erf(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Error function.
FTps< T, N > sin(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Sine.
FTps< T, N > erfc(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Complementary error function.
FTps< T, N > tan(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Tangent.
FTps< T, N > log(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Natural logarithm.
FTps< T, N > csch(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Hyperbolic cosecant.
FTps< T, N > tanh(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Hyperbolic tangent.
FTps< T, N > sinh(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Hyperbolic sine.
FTps< T, N > sec(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Secant.
FTps< T, N > cos(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Cosine.
FTps< T, N > cosh(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Hyperbolic cosine.
FTps< T, N > coth(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Hyperbolic cotangent.
constexpr double pi
The value of.
Truncated power series in N variables of type T.
FTps inverse(int trunc=EXACT) const
Reciprocal, 1/(*this).
FTps taylor(const Array1D< T > &series, int order) const
Taylor series.
int getMinOrder() const
Get minimum order.
int getTruncOrder() const
Get truncation order.
FTps multiply(const FTps &y, int trunc=EXACT) const
Multiplication.