1 #ifndef CLASSIC_FTpsMath_HH
2 #define CLASSIC_FTpsMath_HH
29 #include <type_traits>
33 template<
class T>
struct is_complex : std::false_type {};
42 template <
class T,
int N>
46 template <
class T,
int N>
50 template <
class T,
int N>
54 template <
class T,
int N>
58 template <
class T,
int N>
62 template <
class T,
int N>
66 template <
class T,
int N>
70 template <
class T,
int N>
74 template <
class T,
int N>
78 template <
class T,
int N>
82 template <
class T,
int N>
86 template <
class T,
int N>
90 template <
class T,
int N>
94 template <
class T,
int N>
98 template <
class T,
int N>
102 template <
class T,
int N>
106 template <
class T,
int N>
110 template <
class T,
int N>
117 template <
class T,
int N>
124 while(y-- > 0) z = z.
multiply(x, trunc);
129 while(y++ < 0) z = z.
multiply(t, trunc);
136 template <
class T,
int N>
143 "Square-root of EXACT polynomial must be truncated.");
150 std::cerr <<
"FTps::sqrt(x) called with\nconstant term = " << aZero
156 T two_aZero =
T(2) * aZero;
158 series[0] =
sqrt(aZero);
159 for(
int i = 1; i <= trcOrder; i++) {
160 series[i] = series[i-1] * double(3 - 2 * i) / (two_aZero * double(i));
163 return x.
taylor(series, trcOrder);
167 template <
class T,
int N>
174 "Sine of EXACT polynomial must be truncated.");
180 series[0] =
sin(aZero);
181 series[1] =
cos(aZero);
182 for(
int i = 2; i <= trcOrder; i++) {
183 series[i] = - series[i-2] / double(i * (i - 1));
186 return x.
taylor(series, trcOrder);
190 template <
class T,
int N>
197 "Cosine of EXACT polynomial must be truncated.");
203 series[0] =
cos(aZero);
204 series[1] = -
sin(aZero);
205 for(
int i = 2; i <= trcOrder; i++) {
206 series[i] = - series[i-2] / double(i * (i - 1));
209 return x.
taylor(series, trcOrder);
213 template <
class T,
int N>
218 return sin(x, trunc) /
cos(x, trunc);
221 template <
class T,
int N>
228 return cos(x, trunc) /
sin(x, trunc);
232 template <
class T,
int N>
236 return cos(x, trunc).inverse();
240 template <
class T,
int N>
247 return sin(x, trunc).inverse();
251 template <
class T,
int N>
258 "Exponential of EXACT polynomial must be truncated.");
264 series[0] =
exp(aZero);
265 for(
int i = 1; i <= trcOrder; i++) {
266 series[i] = series[i-1] / double(i);
269 return x.
taylor(series, trcOrder);
273 template <
class T,
int N>
280 "Logarithm of EXACT polynomial must be truncated.");
286 T a0inv =
T(1) / aZero;
289 series[0] =
log(aZero);
291 for(
int i = 2; i <= trcOrder; i++) {
293 series[i] = ain / double(i);
296 return x.
taylor(series, trcOrder);
300 template <
class T,
int N>
307 "Hyperbolic sine of EXACT polynomial must be truncated.");
313 series[0] =
sinh(aZero);
314 series[1] =
cosh(aZero);
315 for(
int i = 2; i <= trcOrder; i++) {
316 series[i] = series[i-2] / double(i * (i - 1));
319 return x.
taylor(series, trcOrder);
323 template <
class T,
int N>
330 "Hyperbolic cosine of EXACT polynomial must be truncated.");
336 series[0] =
cosh(aZero);
337 series[1] =
sinh(aZero);
338 for(
int i = 2; i <= trcOrder; i++) {
339 series[i] = series[i-2] / double(i * (i - 1));
342 return x.
taylor(series, trcOrder);
346 template <
class T,
int N>
350 return sinh(x, trunc) /
cosh(x, trunc);
354 template <
class T,
int N>
361 return cosh(x, trunc) /
sinh(x, trunc);
365 template <
class T,
int N>
369 return cosh(x, trunc).inverse();
373 template <
class T,
int N>
380 return sinh(x, trunc).inverse();
384 template <
class T,
int N>
389 "Error function does not support complex numbers.");
396 "Error function of EXACT polynomial must be truncated.");
405 for(
int i = 2; i <= trcOrder; ++i) {
406 series[i] = - 2.0 / double(i-1) * double((i-2)) * series[i-2] / double(i);
409 return x.
taylor(series, trcOrder);
413 template <
class T,
int N>
417 return T(1) -
erf(x, trunc);
420 #endif // CLASSIC_FTpsMath_HH
Tps< T > sinh(const Tps< T > &x)
Hyperbolic sine.
Tps< T > sqrt(const Tps< T > &x)
Square root.
Tps< T > tan(const Tps< T > &x)
Tangent.
Truncated power series in N variables of type T.
FTps< T, N > erf(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Error function.
FLieGenerator< T, N > imag(const FLieGenerator< std::complex< T >, N > &)
Take imaginary part of a complex generator.
FTps multiply(const FTps &y, int trunc=EXACT) const
Multiplication.
Tps< T > exp(const Tps< T > &x)
Exponential.
int getTruncOrder() const
Get truncation order.
Inform & endl(Inform &inf)
FTps inverse(int trunc=EXACT) const
Reciprocal, 1/(*this).
T::PETE_Expr_t::PETE_Return_t min(const PETE_Expr< T > &expr, NDIndex< D > &loc)
Tps< T > tanh(const Tps< T > &x)
Hyperbolic tangent.
int getMinOrder() const
Get minimum order.
FTps< T, N > sech(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Hyperbolic secant.
FTps< T, N > coth(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Hyperbolic cotangent.
Tps< T > cos(const Tps< T > &x)
Cosine.
FTps< T, N > erfc(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Complementary error function.
Tps< T > log(const Tps< T > &x)
Natural logarithm.
FTps taylor(const Array1D< T > &series, int order) const
Taylor series.
Tps< T > cot(const Tps< T > &x)
Cotangent.
Tps< T > sec(const Tps< T > &x)
Secant.
Tps< T > csc(const Tps< T > &x)
Cosecant.
Tps< T > pow(const Tps< T > &x, int y)
Integer power.
Tps< T > sin(const Tps< T > &x)
Sine.
Tps< T > cosh(const Tps< T > &x)
Hyperbolic cosine.
MMatrix< m_complex > complex(MMatrix< double > real)
FLieGenerator< T, N > real(const FLieGenerator< std::complex< T >, N > &)
Take real part of a complex generator.
FTps< T, N > csch(const FTps< T, N > &x, int trunc=(FTps< T, N >::EXACT))
Hyperbolic cosecant.