Example #1
0
        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();
        }
Example #2
0
        // 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")));
        }