/// <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); } }
/// <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); } }