Exemple #1
0
        public static Entity Eval(List <Entity> args)
        {
            MathFunctions.AssertArgs(args.Count, 2);
            var r1 = args[0].InnerEval();
            var r2 = args[1].InnerEval();

            args = new List <Entity> {
                r1, r2
            };
            if (r1.entType == Entity.EntType.NUMBER && r2.entType == Entity.EntType.NUMBER)
            {
                return(new NumberEntity((r1 as NumberEntity).Value * (r2 as NumberEntity).Value));
            }
            else if (MathFunctions.IsOneNumber(args, 1))
            {
                return(MathFunctions.GetAnotherEntity(args, 1));
            }
            else if (MathFunctions.IsOneNumber(args, 0))
            {
                return(0);
            }
            else
            {
                return(r1 * r2);
            }
        }
Exemple #2
0
        public static Entity Simplify(List <Entity> args)
        {
            MathFunctions.AssertArgs(args.Count, 2);
            var r1 = args[0].InnerSimplify();
            var r2 = args[1].InnerSimplify();

            if (r1.entType == Entity.EntType.NUMBER && r2.entType == Entity.EntType.NUMBER)
            {
                // TODO: Consider cases like sqrt(12) which could be simplified to 2 sqrt(3)
                var(n1, n2) = ((r1 as NumberEntity).Value, (r2 as NumberEntity).Value);
                return(InnerSimplifyAdditionalFunctional.KeepIfBad(Number.Pow(n1, n2), MathS.Pow(r1, r2), n1, n2));
            }
            else if (r1 == 0 || r1 == 1)
            {
                return(r1);
            }
            else if (r2 == 1)
            {
                return(r1);
            }
            else if (r2 == 0)
            {
                return(1);
            }
            else
            {
                return(r1.Pow(r2));
            }
        }
Exemple #3
0
        public static Entity Simplify(List <Entity> args)
        {
            MathFunctions.AssertArgs(args.Count, 2);
            var r1 = args[0].InnerSimplify();
            var r2 = args[1].InnerSimplify();

            args = new List <Entity> {
                r1, r2
            };
            if (MathFunctions.IsOneNumber(args, 1))
            {
                return(MathFunctions.GetAnotherEntity(args, 1));
            }
            else if (MathFunctions.IsOneNumber(args, 0))
            {
                return(0);
            }
            else if (r1.entType == Entity.EntType.NUMBER && r2.entType == Entity.EntType.NUMBER)
            {
                var(n1, n2) = ((r1 as NumberEntity).Value, (r2 as NumberEntity).Value);
                return(InnerSimplifyAdditionalFunctional.KeepIfBad(n1 * n2, r1 * r2, n1, n2));
            }
            else
            {
                return(r1 * r2);
            }
        }
Exemple #4
0
        public static Entity Eval(List <Entity> args)
        {
            MathFunctions.AssertArgs(args.Count, 2);
            var r = args[0].InnerEval();
            var n = args[1].InnerEval();

            args = new List <Entity> {
                r, n
            };
            if (r.entType == Entity.EntType.NUMBER && n.entType == Entity.EntType.NUMBER)
            {
                return(new NumberEntity(Number.Log((r as NumberEntity).Value.Real, (n as NumberEntity).Value)));
            }
            else if (r == n)
            {
                return(1);
            }
            else if (r == 1)
            {
                return(0);
            }
            else
            {
                return(r.Log(args[1]));
            }
        }
Exemple #5
0
        public static Entity Eval(List <Entity> args)
        {
            MathFunctions.AssertArgs(args.Count, 2);
            var r1 = args[0].InnerEval();
            var r2 = args[1].InnerEval();

            if (r1.entType == Entity.EntType.NUMBER && r2.entType == Entity.EntType.NUMBER)
            {
                return(new NumberEntity(Number.Pow((r1 as NumberEntity).Value, (r2 as NumberEntity).Value)));
            }
            else if (r1 == 0 || r1 == 1)
            {
                return(r1);
            }
            else if (r2 == 1)
            {
                return(r1);
            }
            else if (r2 == 0)
            {
                return(1);
            }
            else
            {
                return(r1.Pow(r2));
            }
        }
Exemple #6
0
        // arccotan(x)' = -1 / (1 + x^2)
        public static Entity Derive(List <Entity> args, VariableEntity variable)
        {
            MathFunctions.AssertArgs(args.Count, 1);
            var a = args[0];

            return(-1 / (1 + MathS.Sqr(a)) * a.Derive(variable));
        }
Exemple #7
0
        // tan(a) = -1 / sin(a) ^ 2
        public static Entity Derive(List <Entity> args, VariableEntity variable)
        {
            MathFunctions.AssertArgs(args.Count, 1);
            var a = args[0];

            return(-1 / a.Sin().Pow(2) * a.Derive(variable));
        }
Exemple #8
0
        // (a * b)' = a' * b + b' * a
        public static Entity Derive(List <Entity> args, VariableEntity variable)
        {
            MathFunctions.AssertArgs(args.Count, 2);
            var a = args[0];
            var b = args[1];

            return(a.Derive(variable) * b + b.Derive(variable) * a);
        }
Exemple #9
0
        // log(a, b) = (ln(a) / ln(b))' = (ln(a)' * ln(b) - ln(a) * ln(b)') / ln(b)^2 = (a' / a * ln(b) - ln(a) * b' / b) / ln(b)^2
        public static Entity Derive(List <Entity> args, VariableEntity variable)
        {
            MathFunctions.AssertArgs(args.Count, 2);
            var a = args[0];
            var b = args[1];

            return((a.Derive(variable) / a * MathS.Ln(b) - MathS.Ln(a) * b.Derive(variable) / b) / (MathS.Ln(b).Pow(2)));
        }
Exemple #10
0
        public static Entity Eval(List <Entity> args)
        {
            MathFunctions.AssertArgs(args.Count, 1);
            var arg = args[0].InnerEval();

            if (arg.entType == Entity.EntType.NUMBER)
            {
                return(new NumberEntity(Number.Arccotan((arg as NumberEntity).Value)));
            }
            else
            {
                return(Arccotanf.Hang(arg));
            }
        }
Exemple #11
0
        public static Entity Eval(List <Entity> args)
        {
            MathFunctions.AssertArgs(args.Count, 1);
            var r = args[0].InnerEval();

            if (r.entType == Entity.EntType.NUMBER)
            {
                return(new NumberEntity(Number.Cotan((r as NumberEntity).Value)));
            }
            else
            {
                return(r.Cotan());
            }
        }
Exemple #12
0
        public static Entity Simplify(List <Entity> args)
        {
            MathFunctions.AssertArgs(args.Count, 1);
            var           r      = args[0].InnerSimplify();
            ComplexNumber evaled = null;

            if (MathS.CanBeEvaluated(r))
            {
                evaled = r.Eval();
            }
            if (!(evaled is null))
            {
                var n = evaled;
                if (InnerSimplifyAdditionalFunctional.KeepIfBad(Number.Sin(n), out var res, true, n))
                {
                    return(res);
                }
Exemple #13
0
        // (a ^ b)' = e ^ (ln(a) * b) * (a' * b / a + ln(a) * b')
        // (a ^ const)' = const * a ^ (const - 1)
        // (const ^ b)' = e^b * b'
        public static Entity Derive(List <Entity> args, VariableEntity variable)
        {
            MathFunctions.AssertArgs(args.Count, 2);
            var a = args[0];
            var b = args[1];

            if (b.entType == Entity.EntType.NUMBER)
            {
                var cons = (b as NumberEntity).Value - 1;
                var res  = b * (a.Pow(cons)) * a.Derive(variable);
                return(res);
            }
            else if (a.entType == Entity.EntType.NUMBER)
            {
                return(a.Pow(b) * MathS.Ln(a) * b.Derive(variable));
            }
            else
            {
                return(a.Pow(b) * (a.Derive(variable) * b / a + MathS.Ln(a) * b.Derive(variable)));
            }
        }
Exemple #14
0
        public static Entity Simplify(List <Entity> args)
        {
            MathFunctions.AssertArgs(args.Count, 2);
            var r1 = args[0].InnerSimplify();
            var r2 = args[1].InnerSimplify();

            if (r1.entType == Entity.EntType.NUMBER && r2.entType == Entity.EntType.NUMBER)
            {
                var(n1, n2) = ((r1 as NumberEntity).Value, (r2 as NumberEntity).Value);
                return(InnerSimplifyAdditionalFunctional.KeepIfBad(n1 / n2, r1 / r2, n1, n2));
            }
            else if (r1 == 0)
            {
                return(0);
            }
            else if (r2 == 1)
            {
                return(r1);
            }
            else
            {
                return(r1 / r2);
            }
        }