Beispiel #1
0
//---------------------------------------------------------------------------
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);
    }
}
Beispiel #2
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);
    }
}