public override Expression SymbolicDiff(Variable var) { var u = Left; var v = Right; var dudx = Left.SymbolicDiff(var); var dvdx = Right.SymbolicDiff(var); return(v * Sym.Pow(u, v - 1) * dudx + Sym.Pow(u, v) * Sym.Ln(u) * dvdx); }
public SmoothMin(Expression left, Expression right, double k = 10) { Symbol = "smin"; Left = left; Right = right; //_expr = 0.5 * (Left + Right + Sym.Abs(Left - Right)); _expr = Sym.Ln(Sym.Exp(-k * left) + Sym.Exp(-k * right)) / -k; EvalFunctional = (c) => Math.Min(Left.Eval(c), Right.Eval(c)); DiffFunctional = (c, var) => _expr.Diff(c, var); }