@Override public IExpr evaluateArg1(final IExpr arg1) { if (isNegativeExpression(arg1)) { return Times(CN1, Tanh(Times(CN1, arg1))); } return null; }
/** * <code>Cosh(a+b+c+...)</code> * * @param plusAST * @param startPosition * @return */ private static IExpr expandTanhPlus(IAST plusAST, int startPosition) { IASTAppendable result = F.TimesAlloc(2); IExpr lhs = plusAST.get(startPosition); if (startPosition == plusAST.size() - 2) { // (Tanh(x)+Tanh(y)) / (1+Tanh(x)*Tanh(y)) IExpr rhs = plusAST.get(startPosition + 1); result.append(Plus(F.Tanh(lhs), F.Tanh(rhs))); result.append(F.Power(Plus(F.C1, Times(F.Tanh(lhs), F.Tanh(rhs))), F.CN1)); } else { result.append(Plus(F.Tanh(lhs), expandTanhPlus(plusAST, startPosition + 1))); result.append( F.Power(Plus(F.C1, Times(F.Tanh(lhs), expandTanhPlus(plusAST, startPosition + 1))), F.CN1)); } return result; } }
@Override public IExpr evaluateArg1(final IExpr arg1) { IExpr negExpr = AbstractFunctionEvaluator.getNormalizedNegativeExpression(arg1); if (negExpr.isPresent()) { return Negate(Tanh(negExpr)); } IExpr imPart = AbstractFunctionEvaluator.getPureImaginaryPart(arg1); if (imPart.isPresent()) { return F.Times(F.CI, F.Tan(imPart)); } if (arg1.isZero()) { return F.C0; } return F.NIL; }
return F.Times(F.CI, F.Tanh(imPart));
ORDERLESS_MATCHER.definePatternHashRule(Power(F.Sech(x_), C2), Power(F.Tanh(x_), C2), C1);
TIMES_ORDERLESS_MATCHER.defineHashRule(new HashedPatternRulesTimesPower(// F.Power(F.Tanh(x_), F.n_DEFAULT), // F.Condition(F.Times(F.Power(F.Sech(F.x), F.Plus(F.m, F.n)), F.Power(F.Sinh(F.x), F.n)), F.And(F.Not(F.NumberQ(F.m)), F.IntegerQ(F.n), F.Greater(F.n, F.C0))))); F.Tanh(x_), // F.Sinh(x))); TIMES_ORDERLESS_MATCHER.defineHashRule(new HashedPatternRulesTimes(// F.Tanh(x_), // F.Sech(x))); TIMES_ORDERLESS_MATCHER.defineHashRule(new HashedPatternRulesTimes(// F.Tanh(x))); TIMES_ORDERLESS_MATCHER.defineHashRule(new HashedPatternRulesTimes(//