public override int Eval(Stack st) { int narg = GetNarg(st); var dgl = GetAlgebraic(st); var y = GetVariable(st); var x = GetVariable(st); var p = Poly.Coefficient(dgl, y, 1); var q = Poly.Coefficient(dgl, y, 0); var pi = LambdaINTEGRATE.Integrate(p, x); if (pi is Rational && !pi.IsNumber()) { pi = (new LambdaRAT()).SymEval(pi); } Variable vexp = new FunctionVariable("exp", pi, new LambdaEXP()); Algebraic dn = new Polynomial(vexp); var qi = LambdaINTEGRATE.Integrate(q / dn, x); if (qi is Rational && !qi.IsNumber()) { qi = (new LambdaRAT()).SymEval(qi); } Algebraic cn = new Polynomial(new SimpleVariable("C")); var res = (qi + cn) * dn; res = (new ExpandUser()).SymEval(res); Debug("User Function expand: " + res); res = (new TrigExpand()).SymEval(res); Debug("Trigexpand: " + res); res = (new NormExp()).SymEval(res); Debug("Norm: " + res); if (res is Rational) { res = (new LambdaRAT()).SymEval(res); } res = (new TrigInverseExpand()).SymEval(res); Debug("Triginverse: " + res); res = (new SqrtExpand()).SymEval(res); st.Push(res); return(0); }
public virtual Algebraic divExponential(Algebraic x, FunctionVariable fv, int n) { var a = new Algebraic[2]; a[1] = x; Algebraic xk = Symbol.ZERO; for (int i = n; i >= 0; i--) { var kf = FunctionVariable.Create("exp", fv.Var).Pow(i); a[0] = a[1]; a[1] = kf; Poly.polydiv(a, fv); if (!a[0].Equals(Symbol.ZERO)) { var kfi = FunctionVariable.Create("exp", -fv.Var) ^ (n - i); xk = xk + a[0] * kfi; } if (Equals(a[1], Symbol.ZERO)) { break; } } return(SymEval(xk)); }
internal override Algebraic SymEval(Algebraic f) { if (gcd.Equals(Symbol.ZERO)) { return(f); } if (f is Polynomial) { Polynomial p = ( Polynomial )f; if (p.Var is FunctionVariable && (( FunctionVariable )p.Var).Name.Equals("exp") && Poly.Degree((( FunctionVariable )p.Var).Var, vr) == 1) { var arg = (( FunctionVariable )p.Var).Var; var new_coef = new Algebraic[2]; new_coef[1] = gcd.ToComplex(); new_coef[0] = Symbol.ZERO; Algebraic new_arg = new Polynomial(vr, new_coef); var subst = FunctionVariable.Create("exp", new_arg); var exp = Poly.Coefficient(arg, vr, 1) / gcd; if (!(exp is Symbol) && !(( Symbol )exp).IsInteger()) { throw new SymbolicException("Not integer exponent in exponential simplification."); } subst = subst ^ (( Symbol )exp).ToInt(); subst = subst * FunctionVariable.Create("exp", Poly.Coefficient(arg, vr, 0)); var len = p.Coeffs.Length; var r = SymEval(p[len - 1]); for (var n = len - 2; n >= 0; n--) { r = r * subst + SymEval(p[n]); } return(r); } } return(f.Map(this)); }
public static Symbol exp_gcd(ArrayList v, Variable x) { var gcd = Symbol.ZERO; int k = 0; foreach (var t in v) { var a = ( Algebraic )t; Algebraic c; if (Poly.Degree(a, x) == 1 && (c = Poly.Coefficient(a, x, 1)) is Symbol) { k++; gcd = gcd.gcd(( Symbol )c); } } return(k > 0 ? gcd : Symbol.ONE); }
internal static Algebraic remove_constant(Algebraic expr, Variable x) { if (!expr.Depends(x)) { return(Symbol.ZERO); } if (expr is Polynomial) { (( Polynomial )expr)[0] = remove_constant((( Polynomial )expr)[0], x); return(expr); } if (expr is Rational) { var den = (( Rational )expr).den; var nom = (( Rational )expr).nom; if (!den.Depends(x)) { return(remove_constant(nom, x) / den); } if (nom is Polynomial) { var a = new[] { nom, den }; Poly.polydiv(a, den.Var); if (!a[0].Depends(x)) { return(a[1] / den); } } } return(expr); }
public Vector(Algebraic item) { _items = item is Vector?Poly.Clone(( Vector )item) : new[] { item }; }
internal override Algebraic SymEval(Algebraic x) { if (x is Rational) { var xr = ( Rational )x; if (xr.den.Var is FunctionVariable && (( FunctionVariable )xr.den.Var).Name.Equals("exp") && (( FunctionVariable )xr.den.Var).Var.IsComplex()) { var fv = ( FunctionVariable )xr.den.Var; int maxdeg = Math.max(Poly.Degree(xr.nom, fv), Poly.Degree(xr.den, fv)); if (maxdeg % 2 == 0) { return(divExponential(xr.nom, fv, maxdeg / 2) / divExponential(xr.den, fv, maxdeg / 2)); } else { var fv2 = new FunctionVariable("exp", (( FunctionVariable )xr.den.Var).Var / Symbol.TWO, (( FunctionVariable )xr.den.Var).Body); Algebraic ex = new Polynomial(fv2, new Algebraic[] { Symbol.ZERO, Symbol.ZERO, Symbol.ONE }); var xr1 = xr.nom.Value(xr.den.Var, ex) / xr.den.Value(xr.den.Var, ex); return(SymEval(xr1)); } } } if (x is Polynomial && (( Polynomial )x).Var is FunctionVariable) { var xp = ( Polynomial )x; Algebraic xf = null; var fvar = ( FunctionVariable )xp.Var; if (fvar.Name.Equals("exp")) { var re = fvar.Var.RealPart(); var im = fvar.Var.ImagPart(); if (im != Symbol.ZERO) { bool _minus = minus(im); if (_minus) { im = -im; } var a = FunctionVariable.Create("exp", re); var b = FunctionVariable.Create("cos", im); var c = FunctionVariable.Create("sin", im) * Symbol.IONE; xf = a * (_minus ? b - c : b + c); } } if (fvar.Name.Equals("log")) { var arg = fvar.Var; Algebraic factor = Symbol.ONE, sum = Symbol.ZERO; if (arg is Polynomial && (( Polynomial )arg).Degree() == 1 && (( Polynomial )arg).Var is FunctionVariable && (( Polynomial )arg)[0].Equals(Symbol.ZERO) && (( FunctionVariable )(( Polynomial )arg).Var).Name.Equals("sqrt")) { sum = FunctionVariable.Create("log", (( Polynomial )arg)[1]); factor = new Complex(0.5); arg = (( FunctionVariable )(( Polynomial )arg).Var).Var; xf = FunctionVariable.Create("log", arg); } try { var re = arg.RealPart(); var im = arg.ImagPart(); if (im != Symbol.ZERO) { bool min_im = minus(im); if (min_im) { im = -im; } var a1 = new SqrtExpand().SymEval(arg * arg.Conj()); var a = FunctionVariable.Create("log", a1) / Symbol.TWO; var b1 = SymEval(re / im); var b = FunctionVariable.Create("atan", b1) * Symbol.IONE; xf = min_im ? a + b : a - b; var pi2 = Symbol.PI * Symbol.IONE / Symbol.TWO; xf = min_im ? xf - pi2 : xf + pi2; } } catch (SymbolicException) { } if (xf != null) { xf = xf * factor + sum; } } if (xf == null) { return(x.Map(this)); } Algebraic r = Symbol.ZERO; for (int i = xp.Coeffs.Length - 1; i > 0; i--) { r = (r + SymEval(xp[i])) * xf; } if (xp.Coeffs.Length > 0) { r = r + SymEval(xp[0]); } return(r); } return(x.Map(this)); }