예제 #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
        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));
        }
예제 #3
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));
        }
예제 #4
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);
        }
예제 #5
0
        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);
        }
예제 #6
0
파일: Vector.cs 프로젝트: Allisrazor/symbcs
 public Vector(Algebraic item)
 {
     _items = item is Vector?Poly.Clone(( Vector )item) : new[] { item };
 }
예제 #7
0
        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));
        }