Exemplo n.º 1
0
        public static SymbolicVariable DiffBFunction(SymbolicVariable fv, string parameter)
        {
            var pa = fv.GetFunctionParameters()[0];

            var ps = SymbolicVariable.Multiply(pa, pa);

            var func = fv.FunctionName;

            var dpa = pa.Differentiate(parameter);


            if (string.Equals(func, "asin", StringComparison.OrdinalIgnoreCase))
            {
                //asin(x) → 1 / sqrt(1-x^2)

                return(SymbolicVariable.Parse(dpa.ToString() + "/sqrt(1-(" + ps.ToString() + "))"));
            }

            if (string.Equals(func, "acos", StringComparison.OrdinalIgnoreCase))
            {
                return(SymbolicVariable.Parse("-" + dpa.ToString() + "/sqrt(1-(" + ps.ToString() + "))"));
            }

            if (string.Equals(func, "atan", StringComparison.OrdinalIgnoreCase))
            {
                return(SymbolicVariable.Parse(dpa.ToString() + "/(" + ps.ToString() + "+1)"));
            }

            if (string.Equals(func, "acot", StringComparison.OrdinalIgnoreCase))
            {
                return(SymbolicVariable.Parse("-" + dpa.ToString() + "/(" + ps.ToString() + "+1)"));
            }

            if (string.Equals(func, "asec", StringComparison.OrdinalIgnoreCase))
            {
                return(SymbolicVariable.Parse(dpa.ToString() + "/(sqrt(1-1/(" + ps.ToString() + "))*" + ps.ToString() + ")"));
            }

            if (string.Equals(func, "acsc", StringComparison.OrdinalIgnoreCase))
            {
                return(SymbolicVariable.Parse("-" + dpa.ToString() + "/(sqrt(1-1/(" + ps.ToString() + "))*" + ps.ToString() + ")"));
            }



            #region hyperbolic functions
            if (string.Equals(func, "asinh", StringComparison.OrdinalIgnoreCase))
            {
                //asin(x) → 1 / sqrt(x^2+1)

                return(SymbolicVariable.Parse(dpa.ToString() + "/sqrt(" + ps.ToString() + "+1)"));
            }

            if (string.Equals(func, "acosh", StringComparison.OrdinalIgnoreCase))
            {
                return(SymbolicVariable.Parse("-" + dpa.ToString() + "/sqrt(" + ps.ToString() + "-1)"));
            }

            if (string.Equals(func, "atanh", StringComparison.OrdinalIgnoreCase))
            {
                return(SymbolicVariable.Parse(dpa.ToString() + "/(1-(" + ps.ToString() + "))"));
            }

            if (string.Equals(func, "acoth", StringComparison.OrdinalIgnoreCase))
            {
                return(SymbolicVariable.Parse("-" + dpa.ToString() + "/(" + ps.ToString() + "-1)"));
            }

            if (string.Equals(func, "asech", StringComparison.OrdinalIgnoreCase))
            {
                return(SymbolicVariable.Parse("-" + dpa.ToString() + "/(sqrt(1/" + ps.ToString() + "-1)*" + ps.ToString() + ")"));
            }

            if (string.Equals(func, "acsch", StringComparison.OrdinalIgnoreCase))
            {
                return(SymbolicVariable.Parse("-" + dpa.ToString() + "/(sqrt(1/" + ps.ToString() + "+1)*" + ps.ToString() + ")"));
            }

            #endregion
            throw new SymbolicException(fv.FunctionName + " differentiation not implemented yet");
        }