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