// Dawson Integral // // dawsn - Dawson function // // F(x) = e^(-x²) * ∫₀ˣ e^(t²) dt // // Inputs: 1 // Outputs: 1 // Constants: 0 #include #include "ts.h" ts_parameter_t const ts_dawsn_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 0, .params_size = 0 }; uint_t ts_dawsn_offset( ts_constant_t const *c ) { ( void )c; return ( 0 ); } int ts_dawsn( fp_t * const *y, uint_t y_n, fp_t const * const *x, uint_t x_n, uint_t n, ts_constant_t const *c ) { TS_PROLOGUE( ts_dawsn_p ); (void)c; for( uint_t i = 0; i < n; ++i ) { fp_t val = x[0][i]; fp_t ax = fabs( val ); fp_t y_val; if( ax < 3.0 ) { fp_t t = ax; fp_t s = t; for( uint_t k = 1; k < 20; ++k ) { t *= -2.0 * ax * ax / (fp_t)(2 * k + 1); s += t; } y_val = s; } else { y_val = 1.0 / ( 2.0 * ax + 1.0 / ( 2.0 * ax + 3.0 / ( 2.0 * ax + 5.0 / ( 2.0 * ax ) ) ) ); } if( val < 0 ) y_val = -y_val; y[0][i] = y_val; } return 0; }