@Override public IExpr evaluateArg1(final IExpr arg1) { if (isNegativeExpression(arg1)) { return Cos(Times(CN1, arg1)); } return null; }
@Override public IExpr evaluateArg1(final IExpr arg1) { IExpr negExpr = AbstractFunctionEvaluator.getNormalizedNegativeExpression(arg1); if (negExpr.isPresent()) { return Cosh(negExpr); } IExpr imPart = AbstractFunctionEvaluator.getPureImaginaryPart(arg1); if (imPart.isPresent()) { return F.Cos(imPart); } if (arg1.isZero()) { return F.C1; } return F.NIL; }
/** * Complex number on unit circle with given argument. * * @param arg * @return complex number on unit circle with given argument */ private static IExpr unit(IExpr arg) { return F.Plus(F.Cos(arg), F.Times(F.CI, F.Sin(arg))); }
public static IExpr flatTopWindow(IExpr x) { return // [$ Piecewise({{(215578947 + 416631580*Cos(2*Pi*x) + 277263158*Cos(4*Pi*x) + 83578947*Cos(6*Pi*x) + // 6947368*Cos(8*Pi*x))/1000000000, -(1/2) <= x <= 1/2}}, 0) $] F.Piecewise(F.List(F.List( F.Times(F.QQ(1L, 1000000000L), F.Plus(F.ZZ(215578947L), F.Times(F.ZZ(416631580L), F.Cos(F.Times(F.C2, F.Pi, x))), F.Times(F.ZZ(277263158L), F.Cos(F.Times(F.C4, F.Pi, x))), F.Times(F.ZZ(83578947L), F.Cos(F.Times(F.C6, F.Pi, x))), F.Times(F.ZZ(6947368L), F.Cos(F.Times(F.C8, F.Pi, x))))), F.LessEqual(F.CN1D2, x, F.C1D2))), F.C0); // $$; }
public static IExpr blackmanHarrisWindow(IExpr x) { return // [$ Piecewise({{(35875 + 48829*Cos(2*Pi*x) + 14128*Cos(4*Pi*x) + 1168*Cos(6*Pi*x))/100000, -(1/2) <= x <= // 1/2}}, 0) // $] F.Piecewise(F.List(F.List( F.Times(F.QQ(1L, 100000L), F.Plus(F.ZZ(35875L), F.Times(F.ZZ(48829L), F.Cos(F.Times(F.C2, F.Pi, x))), F.Times(F.ZZ(14128L), F.Cos(F.Times(F.C4, F.Pi, x))), F.Times(F.ZZ(1168L), F.Cos(F.Times(F.C6, F.Pi, x))))), F.LessEqual(F.CN1D2, x, F.C1D2))), F.C0); // $$; }
public static IExpr nuttallWindow(IExpr x) { return // [$ Piecewise[{{(88942 + 121849*Cos(2*Pi*x) + 36058*Cos(4*Pi*x) + 3151*Cos(6*Pi*x))/250000, -(1/2) <= x <= // 1/2}}, 0] $] F.Piecewise(F.List(F.List( F.Times(F.QQ(1L, 250000L), F.Plus(F.ZZ(88942L), F.Times(F.ZZ(121849L), F.Cos(F.Times(F.C2, F.Pi, x))), F.Times(F.ZZ(36058L), F.Cos(F.Times(F.C4, F.Pi, x))), F.Times(F.ZZ(3151L), F.Cos(F.Times(F.C6, F.Pi, x))))), F.LessEqual(F.CN1D2, x, F.C1D2))), F.C0); // $$; }
public static IExpr blackmanNuttallWindow(IExpr x) { return // [$ Piecewise({{(4891775*Cos(2*Pi*x) + 1365995*Cos(4*Pi*x) + 106411*Cos(6*Pi*x) + 3635819)/10000000, -(1/2) <= // x // <= 1/2}}, 0) // $] F.Piecewise(F.List(F.List( F.Times(F.QQ(1L, 10000000L), F.Plus(F.Times(F.ZZ(4891775L), F.Cos(F.Times(F.C2, F.Pi, x))), F.Times(F.ZZ(1365995L), F.Cos(F.Times(F.C4, F.Pi, x))), F.Times(F.ZZ(106411L), F.Cos(F.Times(F.C6, F.Pi, x))), F.ZZ(3635819L))), F.LessEqual(F.CN1D2, x, F.C1D2))), F.C0); // $$; }
public static IExpr blackmanWindow(IExpr x) { return // [$ Piecewise({{(1/50)*(21 + 25*Cos(2*Pi*x) + 4*Cos(4*Pi*x)), -(1/2) <= x <= 1/2}}, 0) $] F.Piecewise( F.List(F.List( F.Times(F.QQ(1L, 50L), F.Plus(F.ZZ(21L), F.Times(F.ZZ(25L), F.Cos(F.Times(F.C2, F.Pi, x))), F.Times(F.C4, F.Cos(F.Times(F.C4, F.Pi, x))))), F.LessEqual(F.CN1D2, x, F.C1D2))), F.C0); // $$; }
public static IExpr hannWindow(IExpr x) { return // [$ Piecewise({{1/2 + (1/2)*Cos(2*Pi*x), -(1/2) <= x <= 1/2}}, 0) $] F.Piecewise(F.List(F.List(F.Plus(F.C1D2, F.Times(F.C1D2, F.Cos(F.Times(F.C2, F.Pi, x)))), F.LessEqual(F.CN1D2, x, F.C1D2))), F.C0); // $$; }
/** * <code>Sin(a+b+c+...)</code> * * @param plusAST * @param startPosition * @return */ private static IExpr expandSinPlus(IAST plusAST, int startPosition) { IASTAppendable result = F.PlusAlloc(2); IExpr lhs = plusAST.get(startPosition); if (startPosition == plusAST.size() - 2) { IExpr rhs = plusAST.get(startPosition + 1); result.append(Times(Sin(lhs), Cos(rhs))); result.append(Times(Cos(lhs), Sin(rhs))); } else { result.append(Times(Sin(lhs), expandCosPlus(plusAST, startPosition + 1))); result.append(Times(Cos(lhs), expandSinPlus(plusAST, startPosition + 1))); } return result; }
/** * <code>Sin(a+b+c+...)</code> * * @param plusAST * @param startPosition * @return */ private static IExpr expandCosPlus(IAST plusAST, int startPosition) { IASTAppendable result = F.PlusAlloc(2); IExpr lhs = plusAST.get(startPosition); if (startPosition == plusAST.size() - 2) { IExpr rhs = plusAST.get(startPosition + 1); result.append(Times(Cos(lhs), Cos(rhs))); result.append(Times(CN1, Sin(lhs), Sin(rhs))); } else { result.append(Times(Cos(lhs), expandCosPlus(plusAST, startPosition + 1))); result.append(Times(CN1, Sin(lhs), expandSinPlus(plusAST, startPosition + 1))); } return result; }
private IExpr expandSinPlus(IAST plusAST, int startPosition) { if (startPosition > plusAST.size() - 2) { return null; } IAST result = Plus(); if (startPosition == plusAST.size() - 2) { result.add(Times(Sin(plusAST.get(startPosition)), Cos(plusAST.get(startPosition + 1)))); result.add(Times(Cos(plusAST.get(startPosition)), Sin(plusAST.get(startPosition + 1)))); } else { result.add(Times(Sin(plusAST.get(startPosition)), expandCosPlus(plusAST, startPosition + 1))); result.add(Times(Cos(plusAST.get(startPosition)), expandSinPlus(plusAST, startPosition + 1))); } return result; }
private IExpr expandCosPlus(IAST plusAST, int startPosition) { if (startPosition > plusAST.size() - 2) { return null; } IAST result = Plus(); if (startPosition == plusAST.size() - 2) { result.add(Times(Cos(plusAST.get(startPosition)), Cos(plusAST.get(startPosition + 1)))); result.add(Times(CN1, Sin(plusAST.get(startPosition)), Sin(plusAST.get(startPosition + 1)))); } else { result.add(Times(Cos(plusAST.get(startPosition)), expandCosPlus(plusAST, startPosition + 1))); result.add(Times(CN1, Sin(plusAST.get(startPosition)), expandSinPlus(plusAST, startPosition + 1))); } return result; }
public static IExpr hammingWindow(IExpr x) { return // [$ Piecewise({{25/46 + (21/46)*Cos(2*Pi*x), -(1/2) <= x <= 1/2}}, 0) $] F.Piecewise(F.List(F.List(F.Plus(F.QQ(25L, 46L), F.Times(F.QQ(21L, 46L), F.Cos(F.Times(F.C2, F.Pi, x)))), F.LessEqual(F.CN1D2, x, F.C1D2))), F.C0); // $$; }
/** * Evaluate <code>Re(x^(a+I*b))</code> * * @param x * @param a the real part of the exponent * @param b the imaginary part of the exponent * @return */ private static IExpr rePowerComplex(IExpr x, IExpr a, IExpr b) { if (x.isE()) { // Re(E^(a+I*b)) -> E^a*Cos[b] return Times(Power(F.E, a), Cos(b)); } return Times(Times(Power(Power(x, C2), Times(C1D2, a)), Power(E, Times(Negate(b), Arg(x)))), Cos(Plus(Times(a, Arg(x)), Times(Times(C1D2, b), Log(Power(x, C2)))))); }
@Override public IExpr evaluate(final IAST ast, EvalEngine engine) { Validate.checkSize(ast, 2); int dim = ast.arg1().isVector(); if (dim > 0) { IAST list = (IAST) ast.arg1(); if (dim == 2) { IExpr r = list.arg1(); IExpr theta = list.arg2(); return F.List(F.Times(r, F.Cos(theta)), F.Times(r, F.Sin(theta))); } else if (dim == 3) { IExpr r = list.arg1(); IExpr theta = list.arg2(); IExpr phi = list.arg3(); return F.List(F.Times(r, F.Cos(theta)), F.Times(r, F.Cos(phi), F.Sin(theta)), F.Times(r, F.Sin(theta), F.Sin(phi))); } } else if (ast.arg1().isList()) { return ((IAST) ast.arg1()).mapThread(F.ListAlloc(ast.size()), ast, 1); } return F.NIL; }
/** * <code>Cos(n*theta)</code> * * @param n * @param theta * @return */ private static IExpr expandCosTimes(IInteger n, IExpr theta) { int ni = n.toIntDefault(Integer.MIN_VALUE); if (ni > Integer.MIN_VALUE) { return F.sum(i -> Times(Times(Times(Power(CN1, Times(i, C1D2)), Binomial(n, i)), Power(Cos(theta), Plus(n, Times(CN1, i)))), Power(Sin(theta), i)), 0, ni, 2); } return F.NIL; }
/** * <code>Sin(n*theta)</code> * * @param n * @param theta * @return */ private static IExpr expandSinTimes(IInteger n, IExpr theta) { int ni = n.toIntDefault(Integer.MIN_VALUE); if (ni > Integer.MIN_VALUE) { return F.sum(i -> Times(Times(Times(Power(CN1, Times(Plus(i, CN1), C1D2)), Binomial(n, i)), Power(Cos(theta), Plus(n, Times(CN1, i)))), Power(Sin(theta), i)), 1, ni, 2); } return F.NIL; }
public static IExpr tukeyWindow(IExpr x) { return // [$ Piecewise({{1, -(1/3) - 2*x <= 0 && -(1/3) + 2*x <= 0}, {(1/2)*(1 + Cos(3*Pi*(1/6 + x))), x >= -(1/2) && // -(1/3) - 2*x > 0}, {(1/2)*(1 + Cos(3*Pi*(-(1/6) + x))), -(1/3) + 2*x > 0 && x <= 1/2}}, 0) $] F.Piecewise(F.List( F.List(F.C1, F.And(F.LessEqual(F.Plus(F.CN1D3, F.Times(F.CN2, x)), F.C0), F.LessEqual(F.Plus(F.CN1D3, F.Times(F.C2, x)), F.C0))), F.List(F.Times(F.C1D2, F.Plus(F.C1, F.Cos(F.Times(F.C3, F.Pi, F.Plus(F.QQ(1L, 6L), x))))), F.And(F.GreaterEqual(x, F.CN1D2), F.Greater(F.Plus(F.CN1D3, F.Times(F.CN2, x)), F.C0))), F.List(F.Times(F.C1D2, F.Plus(F.C1, F.Cos(F.Times(F.C3, F.Pi, F.Plus(F.QQ(-1L, 6L), x))))), F.And(F.Greater(F.Plus(F.CN1D3, F.Times(F.C2, x)), F.C0), F.LessEqual(x, F.C1D2)))), F.C0); // $$; }
@Override public IExpr e2ComArg(final IComplex base, final IComplex exponent) { if (base.getImaginaryPart().isZero()) { IRational a = base.getRealPart(); IRational b = exponent.getRealPart(); IRational c = exponent.getImaginaryPart(); IExpr temp = // [$ b*Arg(a)+1/2*c*Log(a^2) $] F.Plus(F.Times(b, F.Arg(a)), F.Times(F.C1D2, c, F.Log(F.Sqr(a)))); // $$; return // [$ (a^2)^(b/2)*E^(-c*Arg(a)) * (Cos(temp)+I* Sin(temp)) $] F.Times(F.Power(F.Sqr(a), F.Times(F.C1D2, b)), F.Exp(F.Times(F.CN1, c, F.Arg(a))), F.Plus(F.Cos(temp), F.Times(F.CI, F.Sin(temp)))); // $$; } return F.NIL; }