【问题标题】:C# Math class questionC#数学课题
【发布时间】:2011-02-19 21:54:38
【问题描述】:

我需要在 C# 中计算 Tanh-1
(以及 Sinh-1 和 Cosh-1)

我在数学库中没有找到它。有什么建议吗?

编辑: 不是谭!!

【问题讨论】:

    标签: c# .net math .net-3.5


    【解决方案1】:

    您需要自己定义它们。

    http://en.wikipedia.org/wiki/Hyperbolic_function#Inverse_functions_as_logarithms

        -1     1    1 + x
    tanh   x = — ln —————
               2    1 - x
    
        -1               _______
    sinh   x = ln ( x + √ x² + 1 )
    
        -1               _______
    cosh   x = ln ( x + √ x² - 1 )
    

    【讨论】:

    • 请注意,自然对数在标准数学类中也不是函数,但是,一般对数是。您可以只使用以 e 为底的一般对数(这是数学类中的常量)。这当然正是自然对数的定义。为了完整起见,请注意@KennyTM +1 数学艺术 :)
    • 你说得对,我太快了 :) 事实上,Math.Log 的默认重载只需要一个 double 是自然对数。
    【解决方案2】:

    您需要使用现有函数自己派生它们,例如数学.sin

    您可能会发现这很有用:

    Secant Sec(X) = 1 / Cos(X) 
    Cosecant Cosec(X) = 1 / Sin(X) 
    Cotangent Cotan(X) = 1 / Tan(X) 
    Inverse Sine Arcsin(X) = Atn(X / Sqr(-X * X + 1)) 
    Inverse Cosine Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1) 
    Inverse Secant Arcsec(X) = 2 * Atn(1) - Atn(Sgn(X) / Sqr(X * X - 1)) 
    Inverse Cosecant Arccosec(X) = Atn(Sgn(X) / Sqr(X * X - 1)) 
    Inverse Cotangent Arccotan(X) = 2 * Atn(1) - Atn(X) 
    Hyperbolic Sine HSin(X) = (Exp(X) - Exp(-X)) / 2 
    Hyperbolic Cosine HCos(X) = (Exp(X) + Exp(-X)) / 2 
    Hyperbolic Tangent HTan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X)) 
    Hyperbolic Secant HSec(X) = 2 / (Exp(X) + Exp(-X)) 
    Hyperbolic Cosecant HCosec(X) = 2 / (Exp(X) - Exp(-X)) 
    Hyperbolic Cotangent HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X)) 
    Inverse Hyperbolic Sine HArcsin(X) = Log(X + Sqr(X * X + 1)) 
    Inverse Hyperbolic Cosine HArccos(X) = Log(X + Sqr(X * X - 1)) 
    Inverse Hyperbolic Tangent HArctan(X) = Log((1 + X) / (1 - X)) / 2 
    Inverse Hyperbolic Secant HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X) 
    Inverse Hyperbolic Cosecant HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X) 
    Inverse Hyperbolic Cotangent HArccotan(X) = Log((X + 1) / (X - 1)) / 2 
    Logarithm to base N LogN(X) = Log(X) / Log(N)
    

    【讨论】:

    • 只想添加:asec(x) = acos(1 / x), acsc(x) = asin(1 / x), acot(x) = atan(1 / x)
    【解决方案3】:

    对 David Relihan 的公式进行 .NET 化:

    public static class MathHelper
    {
        // Secant 
        public static double Sec(double x)
        {
            return 1/Math.Cos(x);
        }
    
        // Cosecant
        public static double Cosec(double x)
        {
            return 1/Math.Sin(x);
        }
    
        // Cotangent 
        public static double Cotan(double x)
        {
            return 1/Math.Tan(x);
        }
    
        // Inverse Sine 
        public static double Arcsin(double x)
        {
            return Math.Atan(x / Math.Sqrt(-x * x + 1));
        }
    
        // Inverse Cosine 
        public static double Arccos(double x)
        {
            return Math.Atan(-x / Math.Sqrt(-x * x + 1)) + 2 * Math.Atan(1);
        }
    
    
        // Inverse Secant 
        public static double Arcsec(double x)
        {
            return 2 * Math.Atan(1) - Math.Atan(Math.Sign(x) / Math.Sqrt(x * x - 1));
        }
    
        // Inverse Cosecant 
        public static double Arccosec(double x)
        {
            return Math.Atan(Math.Sign(x) / Math.Sqrt(x * x - 1));
        }
    
        // Inverse Cotangent 
        public static double Arccotan(double x)
        {
            return 2 * Math.Atan(1) - Math.Atan(x);
        } 
    
        // Hyperbolic Sine 
        public static double HSin(double x)
        {
            return (Math.Exp(x) - Math.Exp(-x)) / 2 ;
        }
    
        // Hyperbolic Cosine 
        public static double HCos(double x)
        {
            return (Math.Exp(x) + Math.Exp(-x)) / 2 ;
        }
    
        // Hyperbolic Tangent 
        public static double HTan(double x)
        {
            return (Math.Exp(x) - Math.Exp(-x)) / (Math.Exp(x) + Math.Exp(-x));
        } 
    
        // Hyperbolic Secant 
        public static double HSec(double x)
        {
            return 2 / (Math.Exp(x) + Math.Exp(-x));
        } 
    
        // Hyperbolic Cosecant 
        public static double HCosec(double x)
        {
            return 2 / (Math.Exp(x) - Math.Exp(-x));
        } 
    
        // Hyperbolic Cotangent 
        public static double HCotan(double x)
        {
            return (Math.Exp(x) + Math.Exp(-x)) / (Math.Exp(x) - Math.Exp(-x));
        } 
    
        // Inverse Hyperbolic Sine 
        public static double HArcsin(double x)
        {
            return Math.Log(x + Math.Sqrt(x * x + 1)) ;
        }
    
        // Inverse Hyperbolic Cosine 
        public static double HArccos(double x)
        {
            return Math.Log(x + Math.Sqrt(x * x - 1));
        }
    
        // Inverse Hyperbolic Tangent 
        public static double HArctan(double x)
        {
            return Math.Log((1 + x) / (1 - x)) / 2 ;
        }
    
        // Inverse Hyperbolic Secant 
        public static double HArcsec(double x)
        {
            return Math.Log((Math.Sqrt(-x * x + 1) + 1) / x);
        } 
    
        // Inverse Hyperbolic Cosecant 
        public static double HArccosec(double x)
        {
            return Math.Log((Math.Sign(x) * Math.Sqrt(x * x + 1) + 1) / x) ;
        }
    
        // Inverse Hyperbolic Cotangent 
        public static double HArccotan(double x)
        {
            return Math.Log((x + 1) / (x - 1)) / 2;
        } 
    
        // Logarithm to base N 
        public static double LogN(double x, double n)
        {
            return Math.Log(x) / Math.Log(n);
        }
    }
    

    【讨论】:

      【解决方案4】:

      还有更快的计算tanh的公式,只需要一个exp(),因为tanh与逻辑函数有关:

      tanh(x) = 2 / (1 + exp(-2 * x)) - 1
      还有
      tanh(x) = 1 - 2 / (1 + exp(2 * x))

      见:http://en.wikipedia.org/wiki/Logistic_function

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 2019-11-30
        • 2011-08-30
        • 1970-01-01
        相关资源
        最近更新 更多