#include
<cmath>
double comp_ellint_3(double k, double nu) // C++17
Liefert Wert des vollständigen Elliptischen Integrals 3. Art $\Pi(k,\nu) = \int_0^{\pi/2} \frac{d\theta}{(1-\nu \sin^2 \theta)\sqrt{1-k^2 \sin^2 \theta}} = \Pi'(k,\nu,\pi/2)$.
k | Modul $|k| \leq 1$ |
nu | Charakteristik |
Rückgabewert: $\Pi(k,\nu)$.
#include <cmath> #include <iostream> int main() { std::cout << "# k n=-3 n=-0.5 n=0 n=0.5\n"; for (int i = 0; i < 100; ++i) { double k = 0.01*i; std::cout << k << '\t' << std::comp_ellint_3(k, -3.0) // << '\t' << std::comp_ellint_3(k, -1.0) // inf << '\t' << std::comp_ellint_3(k, -0.5) << '\t' << std::comp_ellint_3(k, 0.0) << '\t' << std::comp_ellint_3(k, 0.5) // << '\t' << std::comp_ellint_3(k, 1.0) // domain error // << '\t' << std::comp_ellint_3(k, 3.0) // domain error << '\n'; } }
Anmerkung: Die gcc-Bibliothek verwendete bis gcc 7.2.0 das entgegengesetzte Vorzeichen für die Charakteristik $\nu$ (GCC bug report 66689). Ab gcc 8.0.0 HEAD 201711 scheint dies behoben (C++2a, Wandbox):
#include <cmath> #include <iostream> int main() { const auto pi = std::acos(-1.0); const auto k = 0.0; std::cout << "nu\tincomp.\tcompl.\texpect\n"; for (auto nu : {-0.9, -0.5, 0.0, 0.5, 0.9}) { auto expected = pi/(2*std::sqrt(1-nu)); std::cout << nu << '\t' << std::ellint_3(k, nu, pi/2) << '\t' << std::comp_ellint_3(k, nu) << '\t' << expected << '\n'; } }