예제 #1
0
파일: DivTest.cs 프로젝트: sys27/xFunc
        public void ExecuteTest6()
        {
            var exp = new Div(new Sqrt(new Number(-16)), new Number(2));
            var expected = new Complex(0, 2);

            Assert.Equal(expected, exp.Execute());
        }
예제 #2
0
파일: DivTest.cs 프로젝트: sys27/xFunc
        public void ExecuteTest3()
        {
            var exp = new Div(new Number(3), new ComplexNumber(2, 4));
            var expected = new Complex(0.3, -0.6);

            Assert.Equal(expected, exp.Execute());
        }
예제 #3
0
파일: DivTest.cs 프로젝트: sys27/xFunc
        public void ExecuteTest4()
        {
            var exp = new Div(new ComplexNumber(3, 2), new Number(2));
            var expected = new Complex(1.5, 1);

            Assert.Equal(expected, exp.Execute());
        }
예제 #4
0
파일: DivTest.cs 프로젝트: sys27/xFunc
        public void ExecuteTest2()
        {
            var exp = new Div(new ComplexNumber(3, 2), new ComplexNumber(2, 4));
            var expected = new Complex(0.7, -0.4);

            Assert.Equal(expected, exp.Execute());
        }
예제 #5
0
 public void PartialDerivativeTest1()
 {
     // (y + x ^ 2) / x
     IExpression exp = new Div(new Add(new Variable("y"), new Pow(new Variable("x"), new Number(2))), new Variable("x"));
     IExpression deriv = exp.Differentiate();
     Assert.AreEqual("(((1 * (2 * (x ^ (2 - 1)))) * x) - ((y + (x ^ 2)) * 1)) / (x ^ 2)", deriv.ToString());
 }
예제 #6
0
        public void DerivativeTest1()
        {
            IExpression exp = new Div(new Number(1), new Variable("x"));
            IExpression deriv = exp.Differentiate();

            Assert.AreEqual("-(1 * 1) / (x ^ 2)", deriv.ToString());
        }
예제 #7
0
        public void DerivativeTest2()
        {
            // sin(x) / x
            IExpression exp = new Div(new Sin(new Variable("x")), new Variable("x"));
            IExpression deriv = exp.Differentiate();

            Assert.AreEqual("(((cos(x) * 1) * x) - (sin(x) * 1)) / (x ^ 2)", deriv.ToString());
        }
예제 #8
0
파일: DivTest.cs 프로젝트: sys27/xFunc
        public void ResultTypeComplexNumberComplexNumberTest()
        {
            var exp = new Div(new ComplexNumber(3, 2), new ComplexNumber(2, 4));

            Assert.Equal(ExpressionResultType.Number | ExpressionResultType.ComplexNumber, exp.LeftType);
            Assert.Equal(ExpressionResultType.Number | ExpressionResultType.ComplexNumber, exp.RightType);
            Assert.Equal(ExpressionResultType.ComplexNumber, exp.ResultType);
        }
예제 #9
0
        public void DerivativeTest3()
        {
            // (2x) / (3x)
            Number num1 = new Number(2);
            Variable x = new Variable("x");
            Mul mul1 = new Mul(num1, x);

            Number num2 = new Number(3);
            Mul mul2 = new Mul(num2, x.Clone());

            IExpression exp = new Div(mul1, mul2);
            IExpression deriv = exp.Differentiate();

            Assert.AreEqual("(((2 * 1) * (3 * x)) - ((2 * x) * (3 * 1))) / ((3 * x) ^ 2)", deriv.ToString());

            num1.Value = 4;
            num2.Value = 5;
            Assert.AreEqual("(4 * x) / (5 * x)", exp.ToString());
            Assert.AreEqual("(((2 * 1) * (3 * x)) - ((2 * x) * (3 * 1))) / ((3 * x) ^ 2)", deriv.ToString());
        }
예제 #10
0
        public void MulDiffl_NumDivVar_MulNum()
        {
            // (2 / x) * 2
            var mul = new Mul(new Div(new Number(2), new Variable("x")), new Number(2));
            var expected = new Div(new Number(4), new Variable("x"));

            SimpleTest(mul, expected);
        }
예제 #11
0
        public void DivTwoNumbers()
        {
            var div = new Div(new Number(8), new Number(2));
            var expected = new Number(4);

            SimpleTest(div, expected);
        }
예제 #12
0
        public void DivDiff_VarMulNum_DivNum()
        {
            // (x * 2) / 4
            var div = new Div(new Mul(new Variable("x"), new Number(2)), new Number(4));
            var expected = new Div(new Variable("x"), new Number(2));

            SimpleTest(div, expected);
        }
예제 #13
0
        public void DivDiff_NumDivVar_DivNum()
        {
            // (2 / x) / 2
            var div = new Div(new Div(new Number(2), new Variable("x")), new Number(2));
            var expected = new Div(new Number(1), new Variable("x"));

            SimpleTest(div, expected);
        }
예제 #14
0
        public void DivDiffNumDiv_VarDivNum_()
        {
            // 2 / (x / 2)
            var div = new Div(new Number(2), new Div(new Variable("x"), new Number(2)));
            var expected = new Div(new Number(4), new Variable("x"));

            SimpleTest(div, expected);
        }
예제 #15
0
        public void DivByZero()
        {
            var div = new Div(new Variable("x"), new Number(0));

            Assert.Throws<DivideByZeroException>(() => SimpleTest(div, null));
        }
예제 #16
0
        public void ZeroDivByZero()
        {
            var div = new Div(new Number(0), new Number(0));
            var expected = new Number(double.NaN);

            SimpleTest(div, expected);
        }
예제 #17
0
        public void DivByOne()
        {
            var div = new Div(new Variable("x"), new Number(1));
            var expected = new Variable("x");

            SimpleTest(div, expected);
        }
예제 #18
0
        public void DivDerivativeTest2()
        {
            // sin(x) / x
            var exp = new Div(new Sin(new Variable("x")), new Variable("x"));
            var deriv = Differentiate(exp);

            Assert.Equal("((cos(x) * 1 * x) - (sin(x) * 1)) / (x ^ 2)", deriv.ToString());
        }
예제 #19
0
        public void DivDiffNumDiv_NumDivVar_()
        {
            // 2 / (2 / x)
            var div = new Div(new Number(2), new Div(new Number(2), new Variable("x")));
            var expected = new Variable("x");

            SimpleTest(div, expected);
        }
예제 #20
0
        public void DivDerivativeTest3()
        {
            // (2x) / (3x)
            var num1 = new Number(2);
            var x = new Variable("x");
            var mul1 = new Mul(num1, x);

            var num2 = new Number(3);
            var mul2 = new Mul(num2, x.Clone());

            var exp = new Div(mul1, mul2);
            var deriv = Differentiate(exp);

            Assert.Equal("((2 * 1 * 3 * x) - (2 * x * 3 * 1)) / ((3 * x) ^ 2)", deriv.ToString());

            num1.Value = 4;
            num2.Value = 5;
            Assert.Equal("(4 * x) / (5 * x)", exp.ToString());
            Assert.Equal("((2 * 1 * 3 * x) - (2 * x * 3 * 1)) / ((3 * x) ^ 2)", deriv.ToString());
        }
예제 #21
0
        public void DivDiffNumDiv_VarMulNum_()
        {
            // 2 / (2 * x)
            var div = new Div(new Number(2), new Mul(new Variable("x"), new Number(2)));
            var expected = new Div(new Number(1), new Variable("x"));

            SimpleTest(div, expected);
        }
예제 #22
0
 public void DivPartialDerivativeTest1()
 {
     // (y + x ^ 2) / x
     var exp = new Div(new Add(new Variable("y"), new Pow(new Variable("x"), new Number(2))), new Variable("x"));
     var deriv = Differentiate(exp);
     Assert.Equal("((1 * 2 * (x ^ (2 - 1)) * x) - ((y + (x ^ 2)) * 1)) / (x ^ 2)", deriv.ToString());
 }
예제 #23
0
        public void DivDiff_NumMulVar_DivNum()
        {
            // (2 * x) / 4
            var div = new Div(new Mul(new Number(2), new Variable("x")), new Number(4));
            var expected = new Div(new Variable("x"), new Number(2));

            SimpleTest(div, expected);
        }
예제 #24
0
 public void DivPartialDerivativeTest3()
 {
     var exp = new Div(new Variable("y"), new Variable("x"));
     var deriv = Differentiate(exp, new Variable("y"));
     Assert.Equal("1 / x", deriv.ToString());
 }
예제 #25
0
        public void DivSameVars()
        {
            var x = new Variable("x");
            var div = new Div(x, x);
            var expected = new Number(1);

            SimpleTest(div, expected);
        }
예제 #26
0
 public void DivPartialDerivativeTest4()
 {
     // (x + 1) / x
     var exp = new Div(new Add(new Variable("x"), new Number(1)), new Variable("x"));
     var deriv = Differentiate(exp, new Variable("y"));
     Assert.Equal("0", deriv.ToString());
 }
예제 #27
0
        public void DivZero()
        {
            var div = new Div(new Number(0), new Variable("x"));
            var expected = new Number(0);

            SimpleTest(div, expected);
        }
예제 #28
0
        private IExpression SimplifyDiv(Div div)
        {
            // 0 / x
            if (div.Left.Equals(zero) && !div.Right.Equals(zero))
                return zero;
            // x / 0
            if (div.Right.Equals(zero) && !div.Left.Equals(zero))
                throw new DivideByZeroException();
            // x / 1
            if (div.Right.Equals(one))
                return div.Left;

            if (div.Left is Number && div.Right is Number)
                return new Number((double)div.Calculate());

            // (2 * x) / 2
            // (x * 2) / 2
            if (div.Left is Mul && div.Right is Number)
            {
                var bracketMul = div.Left as Mul;
                var firstNumber = div.Right as Number;

                if (bracketMul.Left is Number)
                {
                    var secondNumber = bracketMul.Left as Number;
                    var result = new Div(bracketMul.Right, new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate()));

                    return _Simplify(result);
                }
                if (bracketMul.Right is Number)
                {
                    var secondNumber = bracketMul.Right as Number;
                    var result = new Div(bracketMul.Left, new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate()));

                    return _Simplify(result);
                }
            }
            // 2 / (2 * x)
            // 2 / (x * 2)
            else if (div.Right is Mul && div.Left is Number)
            {
                var bracketMul = div.Right as Mul;
                var firstNumber = div.Left as Number;

                if (bracketMul.Left is Number)
                {
                    var secondNumber = bracketMul.Left as Number;
                    var result = new Div(new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate()), bracketMul.Right);

                    return _Simplify(result);
                }
                if (bracketMul.Right is Number)
                {
                    var secondNumber = bracketMul.Right as Number;
                    var result = new Div(new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate()), bracketMul.Left);

                    return _Simplify(result);
                }
            }
            // (2 / x) / 2
            // (x / 2) / 2
            else if (div.Left is Div && div.Right is Number)
            {
                var bracketDiv = div.Left as Div;
                var firstNumber = div.Right as Number;

                if (bracketDiv.Left is Number)
                {
                    var secondNumber = bracketDiv.Left as Number;
                    var result = new Div(new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate()), bracketDiv.Right);

                    return _Simplify(result);
                }
                if (bracketDiv.Right is Number)
                {
                    var secondNumber = bracketDiv.Right as Number;
                    var result = new Div(bracketDiv.Left, new Number((double)firstNumber.Calculate() * (double)secondNumber.Calculate()));

                    return _Simplify(result);
                }
            }
            // 2 / (2 / x)
            // 2 / (x / 2)
            else if (div.Right is Div && div.Left is Number)
            {
                var bracketDiv = div.Right as Div;
                var firstNumber = div.Left as Number;

                if (bracketDiv.Left is Number)
                {
                    var secondNumber = bracketDiv.Left as Number;
                    var result = new Mul(new Number((double)firstNumber.Calculate() / (double)secondNumber.Calculate()), bracketDiv.Right);

                    return _Simplify(result);
                }
                if (bracketDiv.Right is Number)
                {
                    var secondNumber = bracketDiv.Right as Number;
                    var result = new Div(new Number((double)firstNumber.Calculate() * (double)secondNumber.Calculate()), bracketDiv.Left);

                    return _Simplify(result);
                }
            }

            return div;
        }
예제 #29
0
        public void MulDiffNumMul_NumDivVar_()
        {
            // 2 * (2 / x)
            var mul = new Mul(new Number(2), new Div(new Number(2), new Variable("x")));
            var expected = new Div(new Number(4), new Variable("x"));

            SimpleTest(mul, expected);
        }
예제 #30
0
        private IExpression SimplifyMul(Mul mul)
        {
            // mul by zero
            if (mul.Left.Equals(zero) || mul.Right.Equals(zero))
                return zero;

            // mul by 1
            if (mul.Left.Equals(one))
                return mul.Right;
            if (mul.Right.Equals(one))
                return mul.Left;

            if (mul.Left is Number && mul.Right is Number)
                return new Number((double)mul.Calculate());

            // 2 * (2 * x)
            // 2 * (x * 2)
            // (2 * x) * 2
            // (x * 2) * 2
            Mul bracketMul = null;
            Number firstNumber = null;
            if (mul.Left is Mul && mul.Right is Number)
            {
                bracketMul = mul.Left as Mul;
                firstNumber = mul.Right as Number;
            }
            else if (mul.Right is Mul && mul.Left is Number)
            {
                bracketMul = mul.Right as Mul;
                firstNumber = mul.Left as Number;
            }
            if (bracketMul != null)
            {
                if (bracketMul.Left is Number)
                {
                    var secondNumber = bracketMul.Left as Number;
                    var result = new Mul(new Number(firstNumber.Value * secondNumber.Value), bracketMul.Right);

                    return _Simplify(result);
                }
                if (bracketMul.Right is Number)
                {
                    var secondNumber = bracketMul.Right as Number;
                    var result = new Mul(new Number(firstNumber.Value * secondNumber.Value), bracketMul.Left);

                    return _Simplify(result);
                }
            }

            // 2 * (2 / x)
            // 2 * (x / 2)
            // (2 / x) * 2
            // (x / 2) * 2
            Div bracketDiv = null;
            if (mul.Left is Div && mul.Right is Number)
            {
                bracketDiv = mul.Left as Div;
                firstNumber = mul.Right as Number;
            }
            else if (mul.Right is Div && mul.Left is Number)
            {
                bracketDiv = mul.Right as Div;
                firstNumber = mul.Left as Number;
            }
            if (bracketDiv != null)
            {
                if (bracketDiv.Left is Number)
                {
                    var secondNumber = bracketDiv.Left as Number;
                    var result = new Div(new Number(firstNumber.Value * secondNumber.Value), bracketDiv.Right);

                    return _Simplify(result);
                }
                if (bracketDiv.Right is Number)
                {
                    var secondNumber = bracketDiv.Right as Number;
                    var result = new Mul(new Number(firstNumber.Value / secondNumber.Value), bracketDiv.Left);

                    return _Simplify(result);
                }
            }

            return mul;
        }