#include <boost/math/special_functions/ellint_d.hpp>
namespace boost { namespace math {
template <class T1, class T2>
calculated-result-type ellint_d(T1 k, T2 phi);
template <class T1, class T2, class Policy>
calculated-result-type ellint_d(T1 k, T2 phi, const Policy&);
template <class T1>
calculated-result-type ellint_d(T1 k);
template <class T1, class Policy>
calculated-result-type ellint_d(T1 k, const Policy&);
}}
Эти две функции оценивают неполный эллиптический интеграл D(φ, k) и его полный аналог D(k) = D(π/2, k).
Тип возврата этих функций вычисляется с помощью правил __arg_pomotion_, когда аргументы имеют разные типы: когда они одинаковый тип, то результат такой же тип, как и аргументы.
template <class T1, class T2>
calculated-result-type ellint_d(T1 k, T2 phi);
template <class T1, class T2, class Policy>
calculated-result-type ellint_3(T1 k, T2 phi, const Policy&);
Возвращает неполный эллиптический интеграл:

Требуется -1 <= k <=1, в противном случае возвращается результат domain_error (за пределами этого диапазона результат будет сложным).
Окончательный аргумент Политика является необязательным и может использоваться для контроля поведения функции: как он обрабатывает ошибки, какой уровень точности использовать и т.д. См. документ политики для более подробной информации.
template <class T1>
calculated-result-type ellint_d(T1 k);
template <class T1, class Policy>
calculated-result-type ellint_d(T1 k, const Policy&);
Возвращает полный эллиптический интеграл D(k) = D(π/2, k)
Требование -1 <= k <=1 в противном случае возвращает результат domain_error (за пределами этого диапазона результат будет сложным).
Окончательный аргумент Политика является необязательным и может использоваться для контроля поведения функции: как он обрабатывает ошибки, какой уровень точности использовать и т.д. См. документ политики для более подробной информации.
Эти функции тривиально вычислены с точки зрения других эллиптических интегралов и, как правило, имеют очень низкие показатели ошибок (несколько эпсилонов), если параметр φ не является очень большим, в этом случае применяются обычные тригонометрические проблемы снижения аргументов.
Table 6.66. Error rates for ellint_d (complete)
|
|
Microsoft Visual C++ версии 12.0 Win32 двойной
|
GNU C++ версия 5.1.0 linux двойной
|
GNU C++ версия 5.1.0 linux длинный двойной
|
Солнечная компиляторная версия 0x5130 Sun Solaris длинный двойной
|
Elliptic Integral E: Mathworld Data |
Max = 0,637ε (Mean = 0,368ε) |
Max = 0,637ε (Mean = 0,368ε) |
Max = 1,27ε (Mean = 0,735ε) |
Max = 1,27ε (Mean = 0,735ε) |
Elliptic Integral D: Случайные данные |
Max = 1,27ε (Mean = 0,355ε) |
Max = 0ε (Mean = 0ε) |
Max = 1,27ε (Mean = 0,334ε) |
Max = 1,27ε (Mean = 0,334ε) |
Table 6.67. Error rates for ellint_d
|
|
Microsoft Visual C++ версии 12.0 Win32 двойной
|
GNU C++ версия 5.1.0 linux двойной
|
GNU C++ версия 5.1.0 linux длинный двойной
|
Солнечная компиляторная версия 0x5130 Sun Solaris длинный двойной
|
Elliptic Integral E: Mathworld Data |
Max = 0,862ε (Mean = 0,457ε) |
Max = 0ε (Mean = 0ε) (GSL 1.16: Max = 0.862ε (Mean = 0.568&949;) |
Max = 1,3ε (Mean = 0,813ε) |
Max = 1,3ε (Mean = 0,813ε) |
Elliptic Integral D: Случайные данные |
Max = 2,87ε (Mean = 0,805ε) |
Max = 0ε (Mean = 0ε) (GSL 1.16: Max = 3.01ε (Mean = 0.928ε) |
Max = 2,51ε (Mean = 0,883ε) |
Max = 2,51ε (Mean = 0,883ε) |
Испытания используют смесь спотовых тестовых значений, рассчитанных с использованием значений, рассчитанных на wolframalpha.com, и случайных тестовых данных, полученных с использованием MPFR с 1000-битной точностью, и преднамеренно наивной реализации с точки зрения интегралов Legendre.
Реализация D(φ, k) сначала выполняет снижение аргументов, используя отношения:
D(-φ, k) = -D(φ, k)
и
D(nπ+φ, k) = 2nD(k) + D(φ, k)
to move φ to the range [0, π/2].
Функции затем реализуются с точки зрения интегрального RD Карлсона, используя отношение:
