//--------------------------------------------------------------------------- Expression UnaryExpr::df(std::string const& n) const { Expression e = _expr.df(n); if ( e.eq(0.0) ) return Expression(0.0); //switch (_opMap[_op]) switch (_op) { case MINUS : if ( e.eq(1.0) ) return Expression(-1.0); return Expression( MINUS, e ); case ABS : if ( e.eq(1.0) ) return Expression( SIGN, _expr ); return Expression( TIMES, Expression(SIGN, _expr), e ); case EXP : if ( e.eq(1.0) ) return Expression( EXP, _expr ); return Expression( TIMES, Expression(EXP, _expr), e ); case LN : return Expression( DIVIDE, e, _expr); case LOG : return Expression( DIVIDE, Expression(DIVIDE, e, _expr), std::log(10.0) ); // case SIGN : return Expression( TIMES, Expression(DELTA, _expr), e ); case SIN : if ( e.eq(1.0) ) return Expression( COS, _expr ); return Expression( TIMES, Expression(COS, _expr), e ); case COS : if ( e.eq(1.0) ) return Expression( MINUS, Expression(SIN, _expr) ); return Expression( MINUS, Expression(TIMES, Expression(SIN, _expr), e) ); case TAN : return Expression( DIVIDE, e, Expression( TIMES, Expression(COS, _expr), Expression(COS, _expr) ) ); default : return Expression(0.0); } }
//--------------------------------------------------------------------------- Expression BinaryExpr::df(std::string const& n) const { Expression le = _lexpr.df(n); Expression re = _rexpr.df(n); switch (_op) { /// (f + g)' = f' + g' case '+' : if ( le.eq(0.0) ) { if ( re.eq(0.0) ) return Expression(0.0); return re; } if ( re.eq(0.0) ) { if ( le.eq(0.0) ) return Expression(0.0); return le; } return Expression( PLUS, le, re ); /// (f - g)' = f' - g' case '-' : if ( le.eq(0.0) ) { if ( re.eq(0.0) ) return Expression(0.0); return Expression(MINUS, re); } if ( re.eq(0.0) ) { if ( le.eq(0.0) ) return Expression(0.0); return le; } return Expression( MINUS, le, re ); /// (f*g)' = f'*g + f*g' case '*' : if ( le.eq(0.0) ) { if ( re.eq(0.0) ) return Expression(0.0); if ( re.eq(1.0) ) return _lexpr; return Expression( TIMES, _lexpr, re); } if ( le.eq(1.0) ) { if ( re.eq(0.0) ) return _rexpr; if ( re.eq(1.0) ) return Expression( PLUS, _rexpr, _lexpr ); return Expression( PLUS, _rexpr, Expression(TIMES, _lexpr, re) ); } if ( re.eq(0.0) ) { if ( le.eq(0.0) ) return Expression(0.0); if ( le.eq(1.0) ) return _rexpr; return Expression( TIMES, le, _rexpr ); } if ( re.eq(1.0) ) { if ( le.eq(0.0) ) return _lexpr; if ( le.eq(1.0) ) return Expression( PLUS, _rexpr, _lexpr ); return Expression( PLUS, Expression(TIMES, le, _rexpr), _lexpr ); } return Expression( PLUS, Expression( TIMES, le, _rexpr ), Expression( TIMES, _lexpr, re ) ); /// (f/g)' = (f'*g - f*g')/(g^2) case '/' : if ( le.eq(0.0) ) { if ( re.eq(0.0) ) return Expression(0.0); if ( re.eq(1.0) ) return Expression( DIVIDE, Expression(MINUS, _lexpr), Expression(TIMES, _rexpr, _rexpr) ); return Expression( DIVIDE, Expression( MINUS, Expression( TIMES, _lexpr, re ) ), Expression( TIMES, _rexpr, _rexpr ) ); } if ( le.eq(1.0) ) { if ( re.eq(0.0) ) return Expression( DIVIDE, 1.0, _rexpr ); if ( re.eq(1.0) ) return Expression( DIVIDE, Expression(MINUS, _rexpr, _lexpr), Expression(TIMES, _rexpr, _rexpr) ); return Expression( DIVIDE, Expression( MINUS, _rexpr, Expression( TIMES, _lexpr, re ) ), Expression( TIMES, _rexpr, _rexpr ) ); } if ( re.eq(0.0) ) { if ( le.eq(0.0) ) return Expression(0.0); if ( le.eq(1.0) ) return Expression( DIVIDE, 1.0, _rexpr ); return Expression( DIVIDE, le, _rexpr ); } if ( re.eq(1.0) ) { if ( le.eq(0.0) ) return Expression( DIVIDE, Expression(MINUS, _lexpr), Expression(TIMES, _rexpr, _rexpr) ); if ( le.eq(1.0) ) return Expression( DIVIDE, Expression(MINUS, _rexpr, _lexpr), Expression(TIMES, _rexpr, _rexpr) ); return Expression( DIVIDE, Expression( MINUS, Expression( TIMES, le, _rexpr ), _lexpr ), Expression( TIMES, _rexpr, _rexpr ) ); } return Expression( DIVIDE, Expression( MINUS, Expression( TIMES, le, _rexpr ), Expression( TIMES, _lexpr, re ) ), Expression( TIMES, _rexpr, _rexpr ) ); /// (f^g)' = [exp(g*log f)]' = (f^g) * g' * (log f) + f^(g - 1) * g * f' case '^' : if ( le.eq(0.0) ) { if ( re.eq(0.0) ) return Expression(0.0); if ( re.eq(1.0) ) return Expression( TIMES, Expression(POWER, _lexpr, _rexpr), Expression(LN, _lexpr) ); return Expression( TIMES, re, Expression( TIMES, Expression(POWER, _lexpr, _rexpr), Expression(LN, _lexpr) ) ); } if ( le.eq(1.0) ) { if ( re.eq(0.0) ) return Expression( TIMES, _rexpr, Expression( POWER, _lexpr, Expression(MINUS, _rexpr, 1.0) ) ); if ( re.eq(1.0) ) return Expression( PLUS, Expression( TIMES, _rexpr, Expression( POWER, _lexpr, Expression(MINUS, _rexpr, 1.0) ) ), Expression( TIMES, Expression(POWER, _lexpr, _rexpr), Expression(LN, _lexpr) ) ); return Expression( PLUS, Expression( TIMES, _rexpr, Expression( POWER, _lexpr, Expression(MINUS, _rexpr, 1.0) ) ), Expression( TIMES, re, Expression( TIMES, Expression(POWER, _lexpr, _rexpr), Expression(LN, _lexpr) ) ) ); } if ( re.eq(0.0) ) { if ( le.eq(0.0) ) return Expression(0.0); if ( le.eq(1.0) ) return Expression( TIMES, _rexpr, Expression( POWER, _lexpr, Expression(MINUS, _rexpr, 1.0) ) ); return Expression( TIMES, le, Expression( TIMES, _rexpr, Expression( POWER, _lexpr, Expression(MINUS, _rexpr, 1.0) ) ) ); } if ( re.eq(1.0) ) { if ( le.eq(0.0) ) return Expression( TIMES, Expression(POWER, _lexpr, _rexpr), Expression(LN, _lexpr) ); if ( le.eq(1.0) ) return Expression( PLUS, Expression( TIMES, _rexpr, Expression( POWER, _lexpr, Expression(MINUS, _rexpr, 1.0) ) ), Expression( TIMES, Expression(POWER, _lexpr, _rexpr), Expression(LN, _lexpr) ) ); return Expression( PLUS, Expression( TIMES, le, Expression( TIMES, _rexpr, Expression( POWER, _lexpr, Expression(MINUS, _rexpr, 1.0) ) ) ), Expression( TIMES, Expression(POWER, _lexpr, _rexpr), Expression(LN, _lexpr) ) ); } return Expression( PLUS, Expression( TIMES, le, Expression( TIMES, _rexpr, Expression( POWER, _lexpr, Expression(MINUS, _rexpr, 1.0) ) ) ), Expression( TIMES, re, Expression( TIMES, Expression(POWER, _lexpr, _rexpr), Expression(LN, _lexpr) ) ) ); default : return Expression(0.0); } }