/// <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; }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <summary> /// Constructor /// </summary> /// <param name="property">The property.</param> public SimpleDerivativePropertyEventArgs(SpiceProperty property) : base(property) { Result = null; }