Beispiel #1
0
        /// <summary>
        /// Substitutes all symbolic scalars for doubles (as evaluated by <paramref name="E"/>)
        /// and evaluates the symbolic ScalarOps. E.g. sqrt(2.0) would evaluate to 1.4142...
        /// </summary>
        /// <param name="E">SymbolicEvaluator used to evaluate the symbolic scalars</param>
        /// <returns></returns>
        public double SymbolicEval(RefGA.Symbolic.SymbolicEvaluator E)
        {
            Multivector A = m_value1.SymbolicEval(E);
            Multivector B = m_value2.SymbolicEval(E);

            if (!(A.IsScalar() && B.IsScalar()))
            {
                throw new ArgumentException("BinaryScalarOp.SymbolicEval: argument is not scalar");
            }
            double a = A.RealScalarPart();
            double b = B.RealScalarPart();

            if (m_opName == ATAN2)
            {
                return(Math.Atan2(a, b));
            }
            else
            {
                throw new ArgumentException("BinaryScalarOp.SymbolicEval: unknown opname " + m_opName);
            }
        }
Beispiel #2
0
        /// <summary>
        /// Substitutes all symbolic scalars for doubles (as evaluated by <paramref name="E"/>)
        /// and evaluates the symbolic ScalarOps. E.g. sqrt(2.0) would evaluate to 1.4142...
        /// </summary>
        /// <param name="E">SymbolicEvaluator used to evaluate the symbolic scalars</param>
        /// <returns></returns>
        public double SymbolicEval(RefGA.Symbolic.SymbolicEvaluator E)
        {
            Multivector V = m_value.SymbolicEval(E);

            if (!V.IsScalar())
            {
                throw new ArgumentException("UnaryScalarOp.SymbolicEval: argument is not scalar");
            }
            double v = V.RealScalarPart();

            if (m_opName == INVERSE)
            {
                if (v == 0.0)
                {
                    throw new ArgumentException("UnaryScalarOp.SymbolicEval: divide by zero");
                }
                return(1.0 / v);
            }
            else if (m_opName == SQRT)
            {
                if (v < 0.0)
                {
                    throw new ArgumentException("UnaryScalarOp.SymbolicEval: square root of negative value");
                }
                else
                {
                    return(Math.Sqrt(v));
                }
            }
            else if (m_opName == EXP)
            {
                return(Math.Exp(v));
            }
            else if (m_opName == LOG)
            {
                if (v <= 0.0)
                {
                    throw new ArgumentException("UnaryScalarOp.SymbolicEval: logarithm of value <= 0");
                }
                else
                {
                    return(Math.Log(v));
                }
            }
            else if (m_opName == SIN)
            {
                return(Math.Sin(v));
            }
            else if (m_opName == COS)
            {
                return(Math.Cos(v));
            }
            else if (m_opName == TAN)
            {
                // how to detect bad input (1/2 pi, etc)?
                return(Math.Tan(v));
            }
            else if (m_opName == SINH)
            {
                return(Math.Sinh(v));
            }
            else if (m_opName == COSH)
            {
                return(Math.Cosh(v));
            }
            else if (m_opName == TANH)
            {
                return(Math.Tanh(v));
            }
            else if (m_opName == ABS)
            {
                return(Math.Abs(v));
            }
            else
            {
                throw new ArgumentException("UnaryScalarOp.SymbolicEval: unknown opname " + m_opName);
            }
        }