Example #1
0
        public Min(Expression left, Expression right)
        {
            Symbol = "min";
            Left   = left;
            Right  = right;
            _expr  = 0.5 * (Left + Right - Sym.Abs(Left - Right));

            EvalFunctional = (c) => Math.Min(Left.Eval(c), Right.Eval(c));
            DiffFunctional = (c, var) =>
            {
                // var diffExpr = _expr.SymbolicDiff(var);
                //  return diffExpr.Eval(c);

                //  var u = Left.Diff(c, var);
                // var v = Right.Diff(c, var);

                if (Left.Eval(c) < Right.Eval(c))
                {
                    return(Left.Diff(c, var));
                }
                else if (Left.Eval(c) > Right.Eval(c))
                {
                    return(Right.Diff(c, var));
                }
                else
                {
                    return(0.5 * (Left.Diff(c, var) + Right.Diff(c, var)));
                }
            };
        }
Example #2
0
        public Max(Expression left, Expression right)
        {
            Symbol         = "max";
            Left           = left;
            Right          = right;
            _expr          = 0.5 * (Left + Right + Sym.Abs(Left - Right));
            EvalFunctional = (c) => Math.Max(Left.Eval(c), Right.Eval(c));
            DiffFunctional = (c, var) =>
            {
                // var u = Left.Diff(c, var);
                // var v = Right.Diff(c, var);

                if (Left.Eval(c) > Right.Eval(c))
                {
                    return(Left.Diff(c, var));
                }
                else if (Left.Eval(c) < Right.Eval(c))
                {
                    return(Right.Diff(c, var));
                }
                else
                {
                    return(0.5 * (Left.Diff(c, var) + Right.Diff(c, var)));
                }


                /* if (Left.Eval(c) > Right.Eval(c))
                 *   return Left.Diff(c, var);
                 * else
                 *   return Right.Diff(c, var);*/
            };
        }