public static Entity Eval(List <Entity> args) { MathFunctions.AssertArgs(args.Count, 2); var r1 = args[0].InnerEval(); var r2 = args[1].InnerEval(); args = new List <Entity> { r1, r2 }; if (r1.entType == Entity.EntType.NUMBER && r2.entType == Entity.EntType.NUMBER) { return(new NumberEntity((r1 as NumberEntity).Value * (r2 as NumberEntity).Value)); } else if (MathFunctions.IsOneNumber(args, 1)) { return(MathFunctions.GetAnotherEntity(args, 1)); } else if (MathFunctions.IsOneNumber(args, 0)) { return(0); } else { return(r1 * r2); } }
public static Entity Simplify(List <Entity> args) { MathFunctions.AssertArgs(args.Count, 2); var r1 = args[0].InnerSimplify(); var r2 = args[1].InnerSimplify(); if (r1.entType == Entity.EntType.NUMBER && r2.entType == Entity.EntType.NUMBER) { // TODO: Consider cases like sqrt(12) which could be simplified to 2 sqrt(3) var(n1, n2) = ((r1 as NumberEntity).Value, (r2 as NumberEntity).Value); return(InnerSimplifyAdditionalFunctional.KeepIfBad(Number.Pow(n1, n2), MathS.Pow(r1, r2), n1, n2)); } else if (r1 == 0 || r1 == 1) { return(r1); } else if (r2 == 1) { return(r1); } else if (r2 == 0) { return(1); } else { return(r1.Pow(r2)); } }
public static Entity Simplify(List <Entity> args) { MathFunctions.AssertArgs(args.Count, 2); var r1 = args[0].InnerSimplify(); var r2 = args[1].InnerSimplify(); args = new List <Entity> { r1, r2 }; if (MathFunctions.IsOneNumber(args, 1)) { return(MathFunctions.GetAnotherEntity(args, 1)); } else if (MathFunctions.IsOneNumber(args, 0)) { return(0); } else if (r1.entType == Entity.EntType.NUMBER && r2.entType == Entity.EntType.NUMBER) { var(n1, n2) = ((r1 as NumberEntity).Value, (r2 as NumberEntity).Value); return(InnerSimplifyAdditionalFunctional.KeepIfBad(n1 * n2, r1 * r2, n1, n2)); } else { return(r1 * r2); } }
public static Entity Eval(List <Entity> args) { MathFunctions.AssertArgs(args.Count, 2); var r = args[0].InnerEval(); var n = args[1].InnerEval(); args = new List <Entity> { r, n }; if (r.entType == Entity.EntType.NUMBER && n.entType == Entity.EntType.NUMBER) { return(new NumberEntity(Number.Log((r as NumberEntity).Value.Real, (n as NumberEntity).Value))); } else if (r == n) { return(1); } else if (r == 1) { return(0); } else { return(r.Log(args[1])); } }
public static Entity Eval(List <Entity> args) { MathFunctions.AssertArgs(args.Count, 2); var r1 = args[0].InnerEval(); var r2 = args[1].InnerEval(); if (r1.entType == Entity.EntType.NUMBER && r2.entType == Entity.EntType.NUMBER) { return(new NumberEntity(Number.Pow((r1 as NumberEntity).Value, (r2 as NumberEntity).Value))); } else if (r1 == 0 || r1 == 1) { return(r1); } else if (r2 == 1) { return(r1); } else if (r2 == 0) { return(1); } else { return(r1.Pow(r2)); } }
// arccotan(x)' = -1 / (1 + x^2) public static Entity Derive(List <Entity> args, VariableEntity variable) { MathFunctions.AssertArgs(args.Count, 1); var a = args[0]; return(-1 / (1 + MathS.Sqr(a)) * a.Derive(variable)); }
// tan(a) = -1 / sin(a) ^ 2 public static Entity Derive(List <Entity> args, VariableEntity variable) { MathFunctions.AssertArgs(args.Count, 1); var a = args[0]; return(-1 / a.Sin().Pow(2) * a.Derive(variable)); }
// (a * b)' = a' * b + b' * a public static Entity Derive(List <Entity> args, VariableEntity variable) { MathFunctions.AssertArgs(args.Count, 2); var a = args[0]; var b = args[1]; return(a.Derive(variable) * b + b.Derive(variable) * a); }
// log(a, b) = (ln(a) / ln(b))' = (ln(a)' * ln(b) - ln(a) * ln(b)') / ln(b)^2 = (a' / a * ln(b) - ln(a) * b' / b) / ln(b)^2 public static Entity Derive(List <Entity> args, VariableEntity variable) { MathFunctions.AssertArgs(args.Count, 2); var a = args[0]; var b = args[1]; return((a.Derive(variable) / a * MathS.Ln(b) - MathS.Ln(a) * b.Derive(variable) / b) / (MathS.Ln(b).Pow(2))); }
public static Entity Eval(List <Entity> args) { MathFunctions.AssertArgs(args.Count, 1); var arg = args[0].InnerEval(); if (arg.entType == Entity.EntType.NUMBER) { return(new NumberEntity(Number.Arccotan((arg as NumberEntity).Value))); } else { return(Arccotanf.Hang(arg)); } }
public static Entity Eval(List <Entity> args) { MathFunctions.AssertArgs(args.Count, 1); var r = args[0].InnerEval(); if (r.entType == Entity.EntType.NUMBER) { return(new NumberEntity(Number.Cotan((r as NumberEntity).Value))); } else { return(r.Cotan()); } }
public static Entity Simplify(List <Entity> args) { MathFunctions.AssertArgs(args.Count, 1); var r = args[0].InnerSimplify(); ComplexNumber evaled = null; if (MathS.CanBeEvaluated(r)) { evaled = r.Eval(); } if (!(evaled is null)) { var n = evaled; if (InnerSimplifyAdditionalFunctional.KeepIfBad(Number.Sin(n), out var res, true, n)) { return(res); }
// (a ^ b)' = e ^ (ln(a) * b) * (a' * b / a + ln(a) * b') // (a ^ const)' = const * a ^ (const - 1) // (const ^ b)' = e^b * b' public static Entity Derive(List <Entity> args, VariableEntity variable) { MathFunctions.AssertArgs(args.Count, 2); var a = args[0]; var b = args[1]; if (b.entType == Entity.EntType.NUMBER) { var cons = (b as NumberEntity).Value - 1; var res = b * (a.Pow(cons)) * a.Derive(variable); return(res); } else if (a.entType == Entity.EntType.NUMBER) { return(a.Pow(b) * MathS.Ln(a) * b.Derive(variable)); } else { return(a.Pow(b) * (a.Derive(variable) * b / a + MathS.Ln(a) * b.Derive(variable))); } }
public static Entity Simplify(List <Entity> args) { MathFunctions.AssertArgs(args.Count, 2); var r1 = args[0].InnerSimplify(); var r2 = args[1].InnerSimplify(); if (r1.entType == Entity.EntType.NUMBER && r2.entType == Entity.EntType.NUMBER) { var(n1, n2) = ((r1 as NumberEntity).Value, (r2 as NumberEntity).Value); return(InnerSimplifyAdditionalFunctional.KeepIfBad(n1 / n2, r1 / r2, n1, n2)); } else if (r1 == 0) { return(0); } else if (r2 == 1) { return(r1); } else { return(r1 / r2); } }