Esempio n. 1
0
        /// <summary>
        /// Apply a derivative.
        /// </summary>
        /// <param name="value"></param>
        /// <param name="index"></param>
        /// <param name="derivative"></param>
        public override void Apply(Func <double> value, int index, double derivative)
        {
            var result = new DoubleDerivatives();

            // Specify actual value
            if (value != null)
            {
                result[0] = value;
            }

            // Specify derivative
            if (index > 0)
            {
                result[index] = () => derivative;
            }
            Result = result;
        }
Esempio n. 2
0
        /// <summary>
        /// Parse an expression.
        /// </summary>
        /// <param name="expression">The expression.</param>
        /// <returns></returns>
        Derivatives <Func <double> > IParser <Derivatives <Func <double> > > .Parse(string expression)
        {
            _stack.Clear();
            ParseExpression(expression);

            if (_stack.Count != 1)
            {
                throw new ParserException("Invalid expression", Input, Index);
            }
            var result = _stack.Pop();

            // Compile all these expressions to funcs
            var funcResult = new DoubleDerivatives(result.Count);

            for (var i = 0; i < result.Count; i++)
            {
                if (result[i] != null)
                {
                    funcResult[i] = Expression.Lambda <Func <double> >(result[i]).Compile();
                }
            }
            return(funcResult);
        }
Esempio n. 3
0
        /// <summary>
        /// Divide derivatives.
        /// </summary>
        /// <param name="b">The other operand.</param>
        /// <returns>
        /// The divided result.
        /// </returns>
        public override Derivatives <Func <double> > Divide(Derivatives <Func <double> > b)
        {
            var size   = Math.Max(Count, b.Count);
            var result = new DoubleDerivatives(size);
            var a0     = this[0];
            var b0     = b[0];

            result[0] = () => SafeDivide(a0(), b0());
            for (var i = 1; i < size; i++)
            {
                var ai = this[i];
                var bi = b[i];
                if (ai != null && bi != null)
                {
                    result[i] = () =>
                    {
                        var denom = b0();
                        return(SafeDivide(denom * ai() - a0() * bi(), denom * denom));
                    }
                }
                ;
                else if (ai != null)
                {
                    result[i] = () => SafeDivide(ai(), b0());
                }
                else if (bi != null)
                {
                    result[i] = () =>
                    {
                        var denom = b0();
                        return(-SafeDivide(a0() * bi(), denom * denom));
                    }
                }
                ;
            }
            return(result);
        }
Esempio n. 4
0
        /// <summary>
        /// Subtract derivatives.
        /// </summary>
        /// <param name="b">The other operand.</param>
        /// <returns>
        /// The difference.
        /// </returns>
        public override Derivatives <Func <double> > Subtract(Derivatives <Func <double> > b)
        {
            var size   = Math.Max(Count, b.Count);
            var result = new DoubleDerivatives(size);

            for (var i = 0; i < size; i++)
            {
                var arg1 = this[i];
                var arg2 = b[i];
                if (arg1 != null && arg2 != null)
                {
                    result[i] = () => arg1() - arg2();
                }
                else if (arg1 != null)
                {
                    result[i] = arg1;
                }
                else if (arg2 != null)
                {
                    result[i] = () => - arg2();
                }
            }
            return(result);
        }
Esempio n. 5
0
        /// <summary>
        /// Add derivatives.
        /// </summary>
        /// <param name="b">The other operand.</param>
        /// <returns>
        /// The sum.
        /// </returns>
        public override Derivatives <Func <double> > Add(Derivatives <Func <double> > b)
        {
            var size   = Math.Max(Count, b.Count);
            var result = new DoubleDerivatives(size);

            for (var i = 0; i < size; i++)
            {
                var ai = this[i];
                var bi = b[i];
                if (ai != null && bi != null)
                {
                    result[i] = () => ai() + bi();
                }
                else if (ai != null)
                {
                    result[i] = ai;
                }
                else if (bi != null)
                {
                    result[i] = bi;
                }
            }
            return(result);
        }
Esempio n. 6
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="property">The property.</param>
 public SimpleDerivativePropertyEventArgs(SpiceProperty property)
     : base(property)
 {
     Result = null;
 }