2
0
mirror of https://github.com/boostorg/math.git synced 2026-01-29 19:52:08 +00:00

Consist input parameters for Bessel/Airy zeros.

This commit is contained in:
Christopher Kormanyos
2013-12-28 19:23:37 +01:00
parent e8a72fe32d
commit ce39ae3802
4 changed files with 69 additions and 55 deletions

View File

@@ -154,10 +154,17 @@ T airy_bi_prime_imp(T x, const Policy& pol)
}
template <class T, class Policy>
T airy_ai_zero_imp(unsigned m, const Policy& pol)
T airy_ai_zero_imp(int m, const Policy& pol)
{
BOOST_MATH_STD_USING // ADL of std names, needed for log, sqrt.
// Handle cases when a negative zero (negative rank) is requested.
if(m < 0)
{
return policies::raise_domain_error<T>("boost::math::airy_ai_zero<%1%>(%1%, int)",
"Requested the %1%'th zero, but the rank must be 1 or more !", m, pol);
}
// Handle case when the zero'th zero is requested.
if(m == 0U)
{
@@ -180,10 +187,10 @@ T airy_ai_zero_imp(unsigned m, const Policy& pol)
// Use a dynamic tolerance because the roots get closer the higher m gets.
T tolerance;
if (m <= 10U) { tolerance = T(0.3F); }
else if(m <= 100U) { tolerance = T(0.1F); }
else if(m <= 1000U) { tolerance = T(0.05F); }
else { tolerance = T(1) / sqrt(T(m)); }
if (m <= 10) { tolerance = T(0.3F); }
else if(m <= 100) { tolerance = T(0.1F); }
else if(m <= 1000) { tolerance = T(0.05F); }
else { tolerance = T(1) / sqrt(T(m)); }
// Perform the root-finding using Newton-Raphson iteration from Boost.Math.
const T am =
@@ -201,10 +208,17 @@ T airy_ai_zero_imp(unsigned m, const Policy& pol)
}
template <class T, class Policy>
T airy_bi_zero_imp(unsigned m, const Policy& pol)
T airy_bi_zero_imp(int m, const Policy& pol)
{
BOOST_MATH_STD_USING // ADL of std names, needed for log, sqrt.
// Handle cases when a negative zero (negative rank) is requested.
if(m < 0)
{
return policies::raise_domain_error<T>("boost::math::airy_bi_zero<%1%>(%1%, int)",
"Requested the %1%'th zero, but the rank must 1 or more !", m, pol);
}
// Handle case when the zero'th zero is requested.
if(m == 0U)
{
@@ -226,10 +240,10 @@ T airy_bi_zero_imp(unsigned m, const Policy& pol)
// Use a dynamic tolerance because the roots get closer the higher m gets.
T tolerance;
if (m <= 10U) { tolerance = T(0.3F); }
else if(m <= 100U) { tolerance = T(0.1F); }
else if(m <= 1000U) { tolerance = T(0.05F); }
else { tolerance = T(1) / sqrt(T(m)); }
if (m <= 10) { tolerance = T(0.3F); }
else if(m <= 100) { tolerance = T(0.1F); }
else if(m <= 1000) { tolerance = T(0.05F); }
else { tolerance = T(1) / sqrt(T(m)); }
// Perform the root-finding using Newton-Raphson iteration from Boost.Math.
const T bm =
@@ -337,7 +351,7 @@ inline typename tools::promote_args<T>::type airy_bi_prime(T x)
}
template <class T, class Policy>
inline T airy_ai_zero(unsigned m, const Policy& /*pol*/)
inline T airy_ai_zero(int m, const Policy& /*pol*/)
{
BOOST_FPU_EXCEPTION_GUARD
typedef typename policies::evaluation<T, Policy>::type value_type;
@@ -352,14 +366,14 @@ inline T airy_ai_zero(unsigned m, const Policy& /*pol*/)
}
template <class T>
inline T airy_ai_zero(unsigned m)
inline T airy_ai_zero(int m)
{
return airy_ai_zero<T>(m, policies::policy<>());
}
template <class T, class OutputIterator, class Policy>
inline OutputIterator airy_ai_zero(
unsigned start_index,
int start_index,
unsigned number_of_zeros,
OutputIterator out_it,
const Policy& pol)
@@ -367,7 +381,7 @@ inline OutputIterator airy_ai_zero(
typedef T result_type;
BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<result_type>::is_integer, "Airy return type must be a floating-point type.");
for(unsigned i = 0; i < number_of_zeros; ++i)
for(unsigned i = 0; i < static_cast<int>(number_of_zeros); ++i)
{
*out_it = boost::math::airy_ai_zero<result_type>(start_index + i, pol);
++out_it;
@@ -377,7 +391,7 @@ inline OutputIterator airy_ai_zero(
template <class T, class OutputIterator>
inline OutputIterator airy_ai_zero(
unsigned start_index,
int start_index,
unsigned number_of_zeros,
OutputIterator out_it)
{
@@ -385,7 +399,7 @@ inline OutputIterator airy_ai_zero(
}
template <class T, class Policy>
inline T airy_bi_zero(unsigned m, const Policy& /*pol*/)
inline T airy_bi_zero(int m, const Policy& /*pol*/)
{
BOOST_FPU_EXCEPTION_GUARD
typedef typename policies::evaluation<T, Policy>::type value_type;
@@ -407,7 +421,7 @@ inline T airy_bi_zero(unsigned m)
template <class T, class OutputIterator, class Policy>
inline OutputIterator airy_bi_zero(
unsigned start_index,
int start_index,
unsigned number_of_zeros,
OutputIterator out_it,
const Policy& pol)
@@ -415,7 +429,7 @@ inline OutputIterator airy_bi_zero(
typedef T result_type;
BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<result_type>::is_integer, "Airy return type must be a floating-point type.");
for(unsigned i = 0; i < number_of_zeros; ++i)
for(int i = 0; i < static_cast<int>(number_of_zeros); ++i)
{
*out_it = boost::math::airy_bi_zero<result_type>(start_index + i, pol);
++out_it;
@@ -425,7 +439,7 @@ inline OutputIterator airy_bi_zero(
template <class T, class OutputIterator>
inline OutputIterator airy_bi_zero(
unsigned start_index,
int start_index,
unsigned number_of_zeros,
OutputIterator out_it)
{

View File

@@ -693,7 +693,7 @@ inline OutputIterator cyl_bessel_j_zero(T v,
const Policy& pol)
{
BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<T>::is_integer, "Order must be a floating-point type.");
for(unsigned i = 0; i < number_of_zeros; ++i)
for(int i = 0; i < static_cast<int>(number_of_zeros); ++i)
{
*out_it = boost::math::cyl_bessel_j_zero(v, start_index + i, pol);
++out_it;
@@ -741,7 +741,7 @@ inline OutputIterator cyl_neumann_zero(T v,
const Policy& pol)
{
BOOST_STATIC_ASSERT_MSG(false == std::numeric_limits<T>::is_integer, "Order must be a floating-point type.");
for(unsigned i = 0; i < number_of_zeros; ++i)
for(int i = 0; i < static_cast<int>(number_of_zeros); ++i)
{
*out_it = boost::math::cyl_neumann_zero(v, start_index + i, pol);
++out_it;

View File

@@ -54,26 +54,26 @@
namespace airy_ai_zero_detail
{
template<class T>
T initial_guess(const unsigned m)
T initial_guess(const int m)
{
T guess;
switch(m)
{
case 0U: { guess = T(0); break; }
case 1U: { guess = T(-2.33810741045976703849); break; }
case 2U: { guess = T(-4.08794944413097061664); break; }
case 3U: { guess = T(-5.52055982809555105913); break; }
case 4U: { guess = T(-6.78670809007175899878); break; }
case 5U: { guess = T(-7.94413358712085312314); break; }
case 6U: { guess = T(-9.02265085334098038016); break; }
case 7U: { guess = T(-10.0401743415580859306); break; }
case 8U: { guess = T(-11.0085243037332628932); break; }
case 9U: { guess = T(-11.9360155632362625170); break; }
case 10U:{ guess = T(-12.8287767528657572004); break; }
case 0: { guess = T(0); break; }
case 1: { guess = T(-2.33810741045976703849); break; }
case 2: { guess = T(-4.08794944413097061664); break; }
case 3: { guess = T(-5.52055982809555105913); break; }
case 4: { guess = T(-6.78670809007175899878); break; }
case 5: { guess = T(-7.94413358712085312314); break; }
case 6: { guess = T(-9.02265085334098038016); break; }
case 7: { guess = T(-10.0401743415580859306); break; }
case 8: { guess = T(-11.0085243037332628932); break; }
case 9: { guess = T(-11.9360155632362625170); break; }
case 10:{ guess = T(-12.8287767528657572004); break; }
default:
{
const T t(((boost::math::constants::pi<T>() * 3U) * ((T(m) * 4U) - 1)) / 8U);
const T t(((boost::math::constants::pi<T>() * 3) * ((T(m) * 4) - 1)) / 8);
guess = -boost::math::detail::airy_zero::equation_as_10_4_105(t);
break;
}
@@ -105,26 +105,26 @@
namespace airy_bi_zero_detail
{
template<class T>
T initial_guess(const unsigned m)
T initial_guess(const int m)
{
T guess;
switch(m)
{
case 0U: { guess = T(0); break; }
case 1U: { guess = T(-1.17371322270912792492); break; }
case 2U: { guess = T(-3.27109330283635271568); break; }
case 3U: { guess = T(-4.83073784166201593267); break; }
case 4U: { guess = T(-6.16985212831025125983); break; }
case 5U: { guess = T(-7.37676207936776371360); break; }
case 6U: { guess = T(-8.49194884650938801345); break; }
case 7U: { guess = T(-9.53819437934623888663); break; }
case 8U: { guess = T(-10.5299135067053579244); break; }
case 9U: { guess = T(-11.4769535512787794379); break; }
case 10U:{ guess = T(-12.3864171385827387456); break; }
case 0: { guess = T(0); break; }
case 1: { guess = T(-1.17371322270912792492); break; }
case 2: { guess = T(-3.27109330283635271568); break; }
case 3: { guess = T(-4.83073784166201593267); break; }
case 4: { guess = T(-6.16985212831025125983); break; }
case 5: { guess = T(-7.37676207936776371360); break; }
case 6: { guess = T(-8.49194884650938801345); break; }
case 7: { guess = T(-9.53819437934623888663); break; }
case 8: { guess = T(-10.5299135067053579244); break; }
case 9: { guess = T(-11.4769535512787794379); break; }
case 10: { guess = T(-12.3864171385827387456); break; }
default:
{
const T t(((boost::math::constants::pi<T>() * 3U) * ((T(m) * 4U) - 3)) / 8U);
const T t(((boost::math::constants::pi<T>() * 3) * ((T(m) * 4) - 3)) / 8);
guess = -boost::math::detail::airy_zero::equation_as_10_4_105(t);
break;
}

View File

@@ -701,35 +701,35 @@ namespace boost
typename tools::promote_args<T>::type airy_bi_prime(T x);
template <class T>
T airy_ai_zero(unsigned m);
T airy_ai_zero(int m);
template <class T, class Policy>
T airy_ai_zero(unsigned m, const Policy&);
T airy_ai_zero(int m, const Policy&);
template <class OutputIterator>
OutputIterator airy_ai_zero(
unsigned start_index,
int start_index,
unsigned number_of_zeros,
OutputIterator out_it);
template <class OutputIterator, class Policy>
OutputIterator airy_ai_zero(
unsigned start_index,
int start_index,
unsigned number_of_zeros,
OutputIterator out_it,
const Policy&);
template <class T>
T airy_bi_zero(unsigned m);
T airy_bi_zero(int m);
template <class T, class Policy>
T airy_bi_zero(unsigned m, const Policy&);
T airy_bi_zero(int m, const Policy&);
template <class OutputIterator>
OutputIterator airy_bi_zero(
unsigned start_index,
int start_index,
unsigned number_of_zeros,
OutputIterator out_it);
template <class OutputIterator, class Policy>
OutputIterator airy_bi_zero(
unsigned start_index,
int start_index,
unsigned number_of_zeros,
OutputIterator out_it,
const Policy&);