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