blob: 13b7be5e5939cab6796a136d050fe4237d3a71b0 [file] [log] [blame]
// Copyright ©2018 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 dualcmplx
import (
"math"
"math/cmplx"
)
// Sinh returns the hyperbolic sine of d.
//
// Special cases are:
// Sinh(±0) = (±0+Nϵ)
// Sinh(±Inf) = ±Inf
// Sinh(NaN) = NaN
func Sinh(d Number) Number {
if d.Real == 0 {
return d
}
if cmplx.IsInf(d.Real) {
// FIXME(kortschka): See golang/go#29320.
return Number{
Real: complex(math.Inf(1), math.NaN()),
Dual: complex(math.Inf(1), math.NaN()),
}
}
fn := cmplx.Sinh(d.Real)
deriv := cmplx.Cosh(d.Real)
return Number{
Real: fn,
Dual: deriv * d.Dual,
}
}
// Cosh returns the hyperbolic cosine of d.
//
// Special cases are:
// Cosh(±0) = 1
// Cosh(±Inf) = +Inf
// Cosh(NaN) = NaN
func Cosh(d Number) Number {
if cmplx.IsInf(d.Real) {
// FIXME(kortschka): See golang/go#29320.
return Number{
Real: complex(math.Inf(1), math.NaN()),
Dual: complex(math.Inf(1), math.NaN()),
}
}
fn := cmplx.Cosh(d.Real)
deriv := cmplx.Sinh(d.Real)
return Number{
Real: fn,
Dual: deriv * d.Dual,
}
}
// Tanh returns the hyperbolic tangent of d.
//
// Special cases are:
// Tanh(±0) = (±0+Nϵ)
// Tanh(±Inf) = (±1+0ϵ)
// Tanh(NaN) = NaN
func Tanh(d Number) Number {
switch {
case d.Real == 0:
return d
case cmplx.IsInf(d.Real):
return Number{
Real: 1,
Dual: 0,
}
}
fn := cmplx.Tanh(d.Real)
deriv := 1 - fn*fn
return Number{
Real: fn,
Dual: deriv * d.Dual,
}
}
// Asinh returns the inverse hyperbolic sine of d.
//
// Special cases are:
// Asinh(±0) = (±0+Nϵ)
// Asinh(±Inf) = ±Inf
// Asinh(NaN) = NaN
func Asinh(d Number) Number {
if d.Real == 0 {
return d
}
fn := cmplx.Asinh(d.Real)
deriv := 1 / cmplx.Sqrt(d.Real*d.Real+1)
return Number{
Real: fn,
Dual: deriv * d.Dual,
}
}
// Acosh returns the inverse hyperbolic cosine of d.
//
// Special cases are:
// Acosh(+Inf) = +Inf
// Acosh(1) = (0+Infϵ)
// Acosh(x) = NaN if x < 1
// Acosh(NaN) = NaN
func Acosh(d Number) Number {
fn := cmplx.Acosh(d.Real)
deriv := 1 / cmplx.Sqrt(d.Real*d.Real-1)
return Number{
Real: fn,
Dual: deriv * d.Dual,
}
}
// Atanh returns the inverse hyperbolic tangent of d.
//
// Special cases are:
// Atanh(1) = +Inf
// Atanh(±0) = (±0+Nϵ)
// Atanh(-1) = -Inf
// Atanh(x) = NaN if x < -1 or x > 1
// Atanh(NaN) = NaN
func Atanh(d Number) Number {
if d.Real == 0 {
return d
}
fn := cmplx.Atanh(d.Real)
deriv := 1 / (1 - d.Real*d.Real)
return Number{
Real: fn,
Dual: deriv * d.Dual,
}
}