// Complete Elliptic Integral of the Second Kind // // ellint_2 - E(m) // // E(m) = ∫₀^(π/2) √(1 - m*sin²(θ)) dθ, computed via AGM // // Inputs: 1 (parameter m) // Outputs: 1 (E(m)) // Constants: 0 #include #include "ts.h" ts_parameter_t const ts_ellint_2_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 0, .params_size = 0 }; uint_t ts_ellint_2_offset( ts_constant_t const *c ) { ( void )c; return ( 0 ); } int ts_ellint_2( 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_ellint_2_p ); (void)c; for (uint_t i = 0; i < n; ++i) { fp_t m = x[0][i]; if (m <= 0.0) { y[0][i] = PI / 2.0; } else if (m >= 1.0) { y[0][i] = 1.0; } else { fp_t a = 1.0; fp_t b = sqrt(1.0 - m); fp_t s = 0.0; fp_t scale = 0.5; for (uint_t j = 0; j < 30; ++j) { fp_t a_new = (a + b) / 2.0; fp_t b_new = sqrt(a * b); fp_t c_new = (a - b) / 2.0; s += scale * c_new * c_new; a = a_new; b = b_new; scale *= 2.0; if (c_new < 1e-15) break; } y[0][i] = (PI / (2.0 * a)) * (1.0 - s); } } return 0; }