mirror of
https://github.com/gonum/gonum.git
synced 2025-10-06 23:52:47 +08:00
45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
// Copyright ©2016 The Gonum Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package mathext
|
|
|
|
import (
|
|
"math"
|
|
)
|
|
|
|
// Digamma returns the logorithmic derivative of the gamma function at x.
|
|
// ψ(x) = d/dx (Ln (Γ(x)).
|
|
func Digamma(x float64) float64 {
|
|
// This is adapted from
|
|
// http://web.science.mq.edu.au/~mjohnson/code/digamma.c
|
|
var result float64
|
|
switch {
|
|
case math.IsNaN(x), math.IsInf(x, 1):
|
|
return x
|
|
case math.IsInf(x, -1):
|
|
return math.NaN()
|
|
case x == 0:
|
|
return math.Copysign(math.Inf(1), -x)
|
|
case x < 0:
|
|
if x == math.Floor(x) {
|
|
return math.NaN()
|
|
}
|
|
// Reflection formula, http://dlmf.nist.gov/5.5#E4
|
|
_, r := math.Modf(x)
|
|
result = -math.Pi / math.Tan(math.Pi*r)
|
|
x = 1 - x
|
|
}
|
|
for ; x < 7; x++ {
|
|
// Recurrence relation, http://dlmf.nist.gov/5.5#E2
|
|
result -= 1 / x
|
|
}
|
|
x -= 0.5
|
|
xx := 1 / x
|
|
xx2 := xx * xx
|
|
xx4 := xx2 * xx2
|
|
// Asymptotic expansion, http://dlmf.nist.gov/5.11#E2
|
|
result += math.Log(x) + (1.0/24.0)*xx2 - (7.0/960.0)*xx4 + (31.0/8064.0)*xx4*xx2 - (127.0/30720.0)*xx4*xx4
|
|
return result
|
|
}
|