// Complete Elliptic Integral of the First Kind // // ellint_1 - K(m) // // K(m) = ∫₀^(π/2) dθ / √(1 - m*sin²(θ)), computed via AGM // // Inputs: 1 (parameter m) // Outputs: 1 (K(m)) // Constants: 0 #include #include "ts.h" ts_parameter_t const ts_ellint_1_p = { .n_inputs = 1, .n_outputs = 1, .n_constants = 0, .params_size = 0 }; uint_t ts_ellint_1_offset( ts_constant_t const *c ) { ( void )c; return ( 0 ); } int ts_ellint_1( 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_1_p ); (void)c; /* Complete elliptic integral of the first kind K(m) */ 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] = INFINITY; } else { /* Arithmetic-geometric mean method */ fp_t a = 1.0; fp_t b = sqrt(1.0 - m); fp_t cn = (a - b) / 2.0; 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 cn_new = (a_new - b_new) / 2.0; a = a_new; b = b_new; cn = cn_new; if (cn / a < 1e-15) break; } y[0][i] = PI / (2.0 * a); } } return 0; }