1 #ifndef STAN_MATH_PRIM_SCAL_FUN_INC_BETA_DDA_HPP
2 #define STAN_MATH_PRIM_SCAL_FUN_INC_BETA_DDA_HPP
14 T digamma_b, T digamma_ab);
40 T digamma_a, T digamma_ab) {
44 if ((0.1 < z && z <= 0.75 && b > 500)
45 || (0.01 < z && z <= 0.1 && b > 2500)
46 || (0.001 < z && z <= 0.01 && b > 1e5))
47 return -
inc_beta_ddb(b, a, 1 - z, digamma_a, digamma_ab);
49 if (z > 0.75 && a < 500)
50 return -
inc_beta_ddb(b, a, 1 - z, digamma_a, digamma_ab);
51 if (z > 0.9 && a < 2500)
52 return -
inc_beta_ddb(b, a, 1 - z, digamma_a, digamma_ab);
53 if (z > 0.99 && a < 1e5)
54 return -
inc_beta_ddb(b, a, 1 - z, digamma_a, digamma_ab);
56 return -
inc_beta_ddb(b, a, 1 - z, digamma_a, digamma_ab);
58 double threshold = 1
e-10;
63 T prefactor = (a + 1) / (a + b);
64 prefactor = prefactor * prefactor * prefactor;
66 T sum_numer = (digamma_ab - digamma_a) * prefactor;
67 T sum_denom = prefactor;
69 T summand = prefactor * z * (a + b) / (a + 1);
72 digamma_ab += 1.0 / (a + b);
73 digamma_a += 1.0 / (a + 1);
75 while (
fabs(summand) > threshold) {
76 sum_numer += (digamma_ab - digamma_a) * summand;
79 summand *= (1 + (a + b) / k) * (1 + k) / (1 + (a + 1) / k);
80 digamma_ab += 1.0 / (a + b + k);
81 digamma_a += 1.0 / (a + 1 + k);
87 "not converge within 100000 iterations");
89 return inc_beta(a, b, z) * (
log(z) + sum_numer / sum_denom);
fvar< T > fabs(const fvar< T > &x)
T inc_beta_dda(T a, T b, T z, T digamma_a, T digamma_ab)
Returns the partial derivative of the regularized incomplete beta function, I_{z}(a, b) with respect to a.
fvar< T > log(const fvar< T > &x)
T inc_beta_ddb(T a, T b, T z, T digamma_b, T digamma_ab)
Returns the partial derivative of the regularized incomplete beta function, I_{z}(a, b) with respect to b.
fvar< T > inc_beta(const fvar< T > &a, const fvar< T > &b, const fvar< T > &x)
void domain_error(const char *function, const char *name, const T &y, const char *msg1, const char *msg2)
Throw a domain error with a consistently formatted message.
double e()
Return the base of the natural logarithm.