Example #1
0
        /// <summary>
        /// Solves one equation
        /// </summary>
        /// <param name="equation"></param>
        /// <param name="x"></param>
        /// <returns></returns>
        internal static Set Solve(Entity equation, VariableEntity x)
        {
            var res = new Set();

            equation = equation.DeepCopy();

            MathS.Settings.PrecisionErrorZeroRange.Set(1e-12m);
            MathS.Settings.FloatToRationalIterCount.Set(0);

            /*
             * try
             * {
             *  AnalyticalSolver.Solve(equation, x, res);
             * }
             * catch (Exception e)
             * {
             *  MathS.Settings.FloatToRationalIterCount.Unset();
             *  MathS.Settings.PrecisionErrorZeroRange.Unset();
             *  throw e;
             * }*/
            AnalyticalSolver.Solve(equation, x, res);
            MathS.Settings.FloatToRationalIterCount.Unset();
            MathS.Settings.PrecisionErrorZeroRange.Unset();

            if (res.Power == Set.PowerLevel.FINITE)
            {
                res.FiniteApply(entity => entity.InnerSimplify());
                Func <Entity, Entity> simplifier = entity => entity.InnerSimplify();
                Func <Entity, Entity> evaluator  = entity => entity.InnerEval();

                Entity collapser(Entity expr)
                {
                    if (MathS.Utils.GetUniqueVariables(equation).Count == 1)
                    {
                        return(expr.InnerEval());
                    }
                    else
                    {
                        return(expr.InnerSimplify());
                    }
                }

                var finalSet = new Set();
                finalSet.FastAddingMode = true;
                foreach (var elem in res.FiniteSet())
                {
                    if (TreeAnalyzer.IsDefinite(elem) &&
                        TreeAnalyzer.IsDefinite(collapser(equation.Substitute(x, elem)))
                        )
                    {
                        finalSet.Add(elem);
                    }
                }
                finalSet.FastAddingMode = false;
                res = finalSet;
            }

            return(res);
        }
        /// <summary>
        /// Solves one equation
        /// </summary>
        /// <param name="equation"></param>
        /// <param name="x"></param>
        /// <returns></returns>
        internal static Set Solve(Entity equation, VariableEntity x)
        {
            var res = new Set();

            equation = equation.DeepCopy();

            MathS.Settings.PrecisionErrorZeroRange.Set(1e-12m);
            MathS.Settings.FloatToRationalIterCount.Set(0);
            AnalyticalSolver.Solve(equation, x, res);
            MathS.Settings.FloatToRationalIterCount.Unset();
            MathS.Settings.PrecisionErrorZeroRange.Unset();

            res.FiniteApply(entity => entity.InnerSimplify());

            return(res);
        }