public static IEnumerable <FunctionTerm> GetDerivatives(this FunctionTerm term) { if (term is Sum) { Variable x = new Variable(1, "x"); Variable y = new Variable(1, "y"); return(Enumerables.Create ( Term.Constant(1).Abstract(x, y), Term.Constant(1).Abstract(x, y) )); } if (term is Product) { Variable x = new Variable(1, "x"); Variable y = new Variable(1, "y"); return(Enumerables.Create ( y.Abstract(x, y), x.Abstract(x, y) )); } if (term is Exponentiation) { Variable x = new Variable(1, "x"); Variable y = new Variable(1, "y"); return(Enumerables.Create ( Term.Product(y, Term.Exponentiation(x, Term.Difference(y, Term.Constant(1)))).Abstract(x, y), Term.Product(Term.Logarithm(x), Term.Exponentiation(x, y)).Abstract(x, y) )); } if (term is Logarithm) { Variable x = new Variable(1, "x"); return(Enumerables.Create(Term.Invert(x).Abstract(x))); } if (term is FunctionDefinition) { FunctionDefinition functionDefinitionTerm = (FunctionDefinition)term; IEnumerable <FunctionTerm> derivatives = GetDerivatives(functionDefinitionTerm.Function).ToArray(); return (( from index in Enumerable.Range(0, derivatives.Count()) let derivative = derivatives.ElementAt(index) select new FunctionDefinition ( string.Format("{0}_d{1}", functionDefinitionTerm.Name, index), Rewriting.CompleteNormalization.Rewrite(derivative), new BasicSyntax(string.Format("{0}'{1}", functionDefinitionTerm.Syntax.GetText(), index.ToString().ToSuperscript())) ) ) .ToArray()); } if (term is Abstraction) { Abstraction abstractionTerm = (Abstraction)term; return (( from variable in abstractionTerm.Variables from derivative in GetDerivatives(abstractionTerm.Term, variable) select derivative.Abstract(abstractionTerm.Variables) ) .ToArray()); } throw new InvalidOperationException(); }
// identity function public static FunctionTerm Identity(int dimension) { Variable x = new Variable(dimension, "x"); return(new FunctionDefinition(string.Format("identity_{0}", dimension), x.Abstract(x), new BasicSyntax("id"))); }