示例#1
0
        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;
        }
示例#2
0
        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);
        }
示例#3
0
 public Derivatives <Func <double> > Derivative(string image, FunctionFoundEventArgs <Derivatives <Func <double> > > args, EvaluationContext context)
 {
     return(GetDerivatives(args));
 }