private void SetResult(EvaluationContext context, FunctionFoundEventArgs <Derivatives <Func <double> > > args, IFunction <double, double> doubleFunction) { var argumentCount = args.ArgumentCount; var variableCount = 1; for (var i = 0; i < argumentCount; i++) { variableCount = Math.Max(variableCount, args[i].Count); } var result = new DoubleDerivatives(variableCount); var arguments = new Func <double> [argumentCount]; for (var i = 0; i < argumentCount; i++) { var iLocal = i; arguments[i] = () => args[iLocal][0](); } result[0] = () => { var argumentValues = arguments.Select(arg => arg()).ToArray(); return(doubleFunction.Logic(string.Empty, argumentValues, context)); }; if (doubleFunction is IDerivativeFunction <double, double> derivativeFunction) { var derivatives = new Lazy <Derivatives <Func <double> > >(() => derivativeFunction.Derivative(string.Empty, args, context)); for (var i = 1; i <= variableCount; i++) { var derivativeIndex = i; if (IsDerivativeDefined(args, derivativeIndex)) { result[i] = () => GetDerivativeValue(args, derivativeIndex, argumentCount, derivatives); } } } args.Result = result; }
private double GetDerivativeValue(FunctionFoundEventArgs <Derivatives <Func <double> > > args, int derivativeIndex, int argumentCount, Lazy <Derivatives <Func <double> > > derivatives) { var result = 0.0; for (var argumentIndex = 0; argumentIndex < argumentCount; argumentIndex++) { if (args[argumentIndex][derivativeIndex] != null) { var derivative = derivatives.Value[argumentIndex + 1]; if (derivative != null) { result += args[argumentIndex][derivativeIndex]() * derivative.Invoke(); } } } return(result); }
public Derivatives <Func <double> > Derivative(string image, FunctionFoundEventArgs <Derivatives <Func <double> > > args, EvaluationContext context) { return(GetDerivatives(args)); }