Пример #1
0
        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);
        }
Пример #2
0
        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));
        }
Пример #3
0
        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);
        }