Exemplo n.º 1
0
    internal virtual Algebraic fzexakt(Zahl x)
    {
        if (x.smaller(Zahl.ZERO))
        {
            Algebraic r = fzexakt((Zahl)x.mult(Zahl.MINUS));
            if (r != null)
            {
                return(r.cc());
            }
            return(r);
        }

        if (x.integerq())
        {
            if (x.intval() % 2 == 0)
            {
                return(Zahl.ONE);
            }
            else
            {
                return(Zahl.MINUS);
            }
        }

        Algebraic qs = x.add(new Unexakt(.5));

        if (((Zahl)qs).integerq())
        {
            if (((Zahl)qs).intval() % 2 == 0)
            {
                return(Zahl.IMINUS);
            }
            else
            {
                return(Zahl.IONE);
            }
        }

        qs = x.mult(new Unexakt(4));

        if (((Zahl)qs).integerq())
        {
            Algebraic sq2 = FunctionVariable.create("sqrt", new Unexakt(0.5));
            switch (((Zahl)qs).intval() % 8)
            {
            case 1:
                return(Zahl.ONE.add(Zahl.IONE).div(Zahl.SQRT2));

            case 3:
                return(Zahl.MINUS.add(Zahl.IONE).div(Zahl.SQRT2));

            case 5:
                return(Zahl.MINUS.add(Zahl.IMINUS).div(Zahl.SQRT2));

            case 7:
                return(Zahl.ONE.add(Zahl.IMINUS).div(Zahl.SQRT2));
            }
        }
        qs = x.mult(new Unexakt(6));
        if (((Zahl)qs).integerq())
        {
            switch (((Zahl)qs).intval() % 12)
            {
            case 1:
                return(Zahl.SQRT3.add(Zahl.IONE).div(Zahl.TWO));

            case 2:
                return(Zahl.ONE.add(Zahl.SQRT3.mult(Zahl.IONE)).div(Zahl.TWO));

            case 4:
                return(Zahl.SQRT3.mult(Zahl.IONE).add(Zahl.MINUS).div(Zahl.TWO));

            case 5:
                return(Zahl.IONE.sub(Zahl.SQRT3).div(Zahl.TWO));

            case 7:
                return(Zahl.IMINUS.sub(Zahl.SQRT3).div(Zahl.TWO));

            case 8:
                return(Zahl.SQRT3.mult(Zahl.IMINUS).sub(Zahl.ONE).div(Zahl.TWO));

            case 10:
                return(Zahl.SQRT3.mult(Zahl.IMINUS).add(Zahl.ONE).div(Zahl.TWO));

            case 11:
                return(Zahl.IMINUS.add(Zahl.SQRT3).div(Zahl.TWO));
            }
        }
        return(null);
    }
Exemplo n.º 2
0
    internal override Algebraic f_exakt(Algebraic f)
    {
        if (f is Rational)
        {
            Algebraic nom = f_exakt(((Rational)f).nom);
            Algebraic den = f_exakt(((Rational)f).den);
            if (den is Zahl)
            {
                return(f_exakt(nom.div(den)));
            }
            if (den is Exponential && ((Polynomial)den).a[0].Equals(Zahl.ZERO) && ((Polynomial)den).a[1] is Zahl)
            {
                if (nom is Zahl || nom is Polynomial)
                {
                    Exponential denx    = (Exponential)den;
                    Exponential den_inv = new Exponential(Zahl.ONE.div(denx.a[1]), Zahl.ZERO, denx.expvar, denx.exp_b.mult(Zahl.MINUS));
                    return(nom.mult(den_inv));
                }
            }
            f = nom.div(den);
            return(f);
        }
        if (f is Exponential)
        {
            return(f.map(this));
        }
        if (!(f is Polynomial))
        {
            return(f.map(this));
        }
        Polynomial fp = (Polynomial)f;

        if (!(fp.v is FunctionVariable) || !((FunctionVariable)fp.v).fname.Equals("exp"))
        {
            return(f.map(this));
        }
        Algebraic arg = ((FunctionVariable)fp.v).arg.reduce();

        if (arg is Zahl)
        {
            return(fp.value(FunctionVariable.create("exp", arg)).map(this));
        }
        if (!(arg is Polynomial) || !(((Polynomial)arg).degree() == 1))
        {
            return(f.map(this));
        }
        Algebraic r = Zahl.ZERO;
        Algebraic a = ((Polynomial)arg).a[1];

        for (int i = 1; i < fp.a.Length; i++)
        {
            Algebraic b   = ((Polynomial)arg).a[0];
            Zahl      I   = new Unexakt((double)i);
            Algebraic ebi = Zahl.ONE;
            while (b is Polynomial && ((Polynomial)b).degree() == 1)
            {
                Algebraic f1 = FunctionVariable.create("exp", (new Polynomial(((Polynomial)b).v)).mult(((Polynomial)b).a[1].mult(I)));
                f1  = Exponential.poly2exp(f1);
                ebi = ebi.mult(f1);
                b   = ((Polynomial)b).a[0];
            }
            ebi = ebi.mult(FunctionVariable.create("exp", b.mult(I)));
            Algebraic cf = f_exakt(fp.a[i].mult(ebi));
            Algebraic f2 = FunctionVariable.create("exp", (new Polynomial(((Polynomial)arg).v)).mult(a.mult(I)));
            f2 = Exponential.poly2exp(f2);
            r  = r.add(cf.mult(f2));
        }
        if (fp.a.Length > 0)
        {
            r = r.add(f_exakt(fp.a[0]));
        }
        return(Exponential.poly2exp(r));
    }
Exemplo n.º 3
0
    public CollectExp(Algebraic f)
    {
        v = new ArrayList();

        (new GetExpVars(v)).f_exakt(f);
    }
Exemplo n.º 4
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: Vektor solvesys(Vector expr, Vector x) throws JasymcaException
    internal virtual Vector solvesys(ArrayList expr, ArrayList x)
    {
        int       nvars = x.Count;
        ArrayList lsg = new ArrayList(), vars = new ArrayList();

        lsg.Add(expr);
        vars.Add(x);
        int n = nvars;

        while (n > 0)
        {
            for (int i = 0; i < lsg.Count; i++)
            {
                try
                {
                    ArrayList equ = (ArrayList)lsg[i];
                    ArrayList xv  = (ArrayList)vars[i];
                    Vector    sol = solve(equ, xv, n);
                    lsg.RemoveAt(i);
                    vars.RemoveAt(i);
                    Variable v = (Variable)xv[n - 1];
                    for (int k = 0; k < sol.Length(); k++)
                    {
                        ArrayList eq = new ArrayList();
                        for (int j = 0; j < n - 1; j++)
                        {
                            eq.Add(((Algebraic)equ[j]).Value(v, sol[k]));
                        }
                        eq.Add(sol[k]);
                        for (int j = n; j < nvars; j++)
                        {
                            eq.Add(equ[j]);
                        }
                        lsg.Insert(i, eq);
                        vars.Insert(i, clonev(xv));
                        i++;
                    }
                }
                catch (JasymcaException)
                {
                    lsg.RemoveAt(i);
                    vars.RemoveAt(i);
                    i--;
                }
            }
            if (lsg.Count == 0)
            {
                throw new JasymcaException("Could not solve equations.");
            }
            n--;
        }
        for (int i = 0; i < lsg.Count; i++)
        {
            ArrayList equ = (ArrayList)lsg[i];
            ArrayList xv  = (ArrayList)vars[i];
            for (n = 1; n < nvars; n++)
            {
                Algebraic y = (Algebraic)equ[n - 1];
                Variable  v = (Variable)xv[n - 1];
                for (int k = n; k < nvars; k++)
                {
                    Algebraic z = (Algebraic)equ[k];
                    equ.RemoveAt(k);
                    equ.Insert(k, z.Value(v, y));
                }
            }
        }
        for (int i = 0; i < lsg.Count; i++)
        {
            ArrayList equ = (ArrayList)lsg[i];
            ArrayList xv  = (ArrayList)vars[i];
            for (n = 0; n < nvars; n++)
            {
                Variable  v = (Variable)xv[n];
                Algebraic y = (new Polynomial(v)) - ((Algebraic)equ[n]);
                equ.RemoveAt(n);
                equ.Insert(n, y);
            }
        }
        Vector[] r = new Vector[lsg.Count];
        for (int i = 0; i < lsg.Count; i++)
        {
            r[i] = Vector.Create((ArrayList)lsg[i]);
        }
        return(new Vector(r));
    }
Exemplo n.º 5
0
 public virtual Algebraic rational(Algebraic expr)
 {
     return(ratsubst(expr).div(gcd).div(new Polynomial(t)).reduce());
 }
Exemplo n.º 6
0
 internal override Algebraic f_exakt(Algebraic x)
 {
     throw new JasymcaException("Usage: ATAN2(y,x).");
 }
Exemplo n.º 7
0
    private static void elim(Vector expr, Vector vars, int n)
    {
        if (n >= expr.Length())
        {
            return;
        }
        double     maxc = 0.0;
        int        iv = 0, ie = 0;
        Variable   vp = null;
        Algebraic  f  = Symbolic.ONE;
        Polynomial pm = null;

        for (int i = 0; i < vars.Length(); i++)
        {
            var v = ((Polynomial)vars[i])._v;
            for (int k = n; k < expr.Length(); k++)
            {
                var pa = expr[k];
                if (pa is Polynomial)
                {
                    var    p  = (Polynomial)pa;
                    var    c  = p.coefficient(v, 1);
                    double nm = c.Norm();
                    if (nm > maxc)
                    {
                        maxc = nm;
                        vp   = v;
                        ie   = k;
                        iv   = i;
                        f    = c;
                        pm   = p;
                    }
                }
            }
        }
        if (maxc == 0.0)
        {
            return;
        }

        expr.set(ie, expr[n]);
        expr.set(n, pm);

        for (int i = n + 1; i < expr.Length(); i++)
        {
            var p = expr[i];

            if (p is Polynomial)
            {
                var fc = ((Polynomial)p).coefficient(vp, 1);

                if (!fc.Equals(Symbolic.ZERO))
                {
                    p = p - pm * fc / f;
                }
            }

            expr.set(i, p);
        }

        elim(expr, vars, n + 1);
    }
Exemplo n.º 8
0
    internal override Algebraic SymEval(Algebraic x)
    {
        if (!(x is Polynomial))
        {
            return(x.Map(this));
        }

        var xp = ( Polynomial )x;

        var item = xp._v;

        if (item is Root)
        {
            var cr = (( Root )item).poly;

            if (cr.Length() == xp.Degree() + 1)
            {
                var xr = new Algebraic[xp.Degree() + 1];

                Algebraic ratio = null;

                for (int i = xr.Length - 1; i >= 0; i--)
                {
                    xr[i] = xp[i].Map(this);

                    if (i == xr.Length - 1)
                    {
                        ratio = xr[i];
                    }
                    else if (i > 0 && ratio != null)
                    {
                        if (!Equals(cr[i] * ratio, xr[i]))
                        {
                            ratio = null;
                        }
                    }
                }
                if (ratio != null)
                {
                    return(xr[0] - ratio * cr[0]);
                }
                else
                {
                    return(new Polynomial(item, xr));
                }
            }
        }

        Algebraic xf = null;

        if (item is FunctionVariable && (( FunctionVariable )item).Name.Equals("sqrt") && (( FunctionVariable )item).Var is Polynomial)
        {
            var arg = ( Polynomial )(( FunctionVariable )item).Var;

            var sqfr = arg.square_free_dec(arg._v);

            var issquare = !(sqfr.Length > 0 && !sqfr[0].Equals(arg[arg.Coeffs.Length - 1]));

            for (int i = 2; i < sqfr.Length && issquare; i++)
            {
                if ((i + 1) % 2 == 1 && !sqfr[i].Equals(Symbolic.ONE))
                {
                    issquare = false;
                }
            }

            if (issquare)
            {
                xf = Symbolic.ONE;

                for (int i = 1; i < sqfr.Length; i += 2)
                {
                    if (!sqfr[i].Equals(Symbolic.ZERO))
                    {
                        xf = xf * sqfr[i] ^ ((i + 1) / 2);
                    }
                }

                Algebraic r = Symbolic.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);
            }
        }

        if (item is FunctionVariable && (( FunctionVariable )item).Name.Equals("sqrt") && xp.Degree() > 1)
        {
            xf = (( FunctionVariable )item).Var;

            var sq = new Polynomial(item);

            var r = SymEval(xp[0]);

            Algebraic xv = Symbolic.ONE;

            for (int i = 1; i < xp.Coeffs.Length; i++)
            {
                if (i % 2 == 1)
                {
                    r = r + SymEval(xp[i]) * xv * sq;
                }
                else
                {
                    xv = xv * xf;

                    r = r + SymEval(xp[i]) * xv;
                }
            }

            return(r);
        }

        return(x.Map(this));
    }
Exemplo n.º 9
0
    internal override Algebraic SymEval(Algebraic x)
    {
        if (x is Rational)
        {
            var xr = ( Rational )x;

            if (xr.den._v is FunctionVariable &&
                (( FunctionVariable )xr.den._v).Name.Equals("exp") &&
                (( FunctionVariable )xr.den._v).Var.IsComplex())
            {
                var fv = ( FunctionVariable )xr.den._v;

                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._v).Var / Symbolic.TWO, (( FunctionVariable )xr.den._v).AlgLambda);

                    Algebraic ex = new Polynomial(fv2, new Algebraic[] { Symbolic.ZERO, Symbolic.ZERO, Symbolic.ONE });

                    var xr1 = xr.nom.Value(xr.den._v, ex) / xr.den.Value(xr.den._v, ex);

                    return(SymEval(xr1));
                }
            }
        }

        if (x is Polynomial && (( Polynomial )x)._v is FunctionVariable)
        {
            var xp = ( Polynomial )x;

            Algebraic xf = null;

            var fvar = ( FunctionVariable )xp._v;

            if (fvar.Name.Equals("exp"))
            {
                var re = fvar.Var.RealPart();
                var im = fvar.Var.ImagPart();

                if (im != Symbolic.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) * Symbolic.IONE;

                    xf = a * (_minus ? b - c : b + c);
                }
            }

            if (fvar.Name.Equals("log"))
            {
                var arg = fvar.Var;

                Algebraic factor = Symbolic.ONE, sum = Symbolic.ZERO;

                if (arg is Polynomial &&
                    (( Polynomial )arg).Degree() == 1 &&
                    (( Polynomial )arg)._v is FunctionVariable &&
                    (( Polynomial )arg)[0].Equals(Symbolic.ZERO) &&
                    (( FunctionVariable )(( Polynomial )arg)._v).Name.Equals("sqrt"))
                {
                    sum = FunctionVariable.Create("log", (( Polynomial )arg)[1]);

                    factor = new Complex(0.5);

                    arg = (( FunctionVariable )(( Polynomial )arg)._v).Var;

                    xf = FunctionVariable.Create("log", arg);
                }

                try
                {
                    var re = arg.RealPart();
                    var im = arg.ImagPart();

                    if (im != Symbolic.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) / Symbolic.TWO;

                        var b1 = SymEval(re / im);

                        var b = FunctionVariable.Create("atan", b1) * Symbolic.IONE;

                        xf = min_im ? a + b : a - b;

                        var pi2 = Symbolic.PI * Symbolic.IONE / Symbolic.TWO;

                        xf = min_im ? xf - pi2 : xf + pi2;
                    }
                }
                catch (JasymcaException)
                {
                }

                if (xf != null)
                {
                    xf = xf * factor + sum;
                }
            }

            if (xf == null)
            {
                return(x.Map(this));
            }

            Algebraic r = Symbolic.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));
    }
Exemplo n.º 10
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public int lambda(Stack st) throws ParseException, JasymcaException
    public override int lambda(Stack st)
    {
        int narg = getNarg(st);

        if (narg != 4)
        {
            throw new ParseException("Usage: ROMBERG (exp,var,ll,ul)");
        }
        Algebraic       exp = getAlgebraic(st);
        Variable        v   = getVariable(st);
        Algebraic       ll  = getAlgebraic(st);
        Algebraic       ul  = getAlgebraic(st);
        LambdaAlgebraic xc  = new ExpandConstants();

        exp = xc.f_exakt(exp);
        ll  = xc.f_exakt(ll);
        ul  = xc.f_exakt(ul);
        if (!(ll is Zahl) || !(ul is Zahl))
        {
            throw new ParseException("Usage: ROMBERG (exp,var,ll,ul)");
        }
        double rombergtol = 1.0e-4;
        int    rombergit  = 11;
        Zahl   a1         = pc.env.getnum("rombergit");

        if (a1 != null)
        {
            rombergit = a1.intval();
        }
        a1 = pc.env.getnum("rombergtol");
        if (a1 != null)
        {
            rombergtol = a1.unexakt().real;
        }
        double a = ((Zahl)ll).unexakt().real;
        double b = ((Zahl)ul).unexakt().real;

//JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java:
//ORIGINAL LINE: double[][] I = new double[rombergit][rombergit];
        double[][] I = RectangularArrays.ReturnRectangularDoubleArray(rombergit, rombergit);
        int        i = 0, n = 1;
        Algebraic  t = trapez(exp, v, n, a, b);

        if (!(t is Zahl))
        {
            throw new ParseException("Expression must evaluate to number");
        }
        I[0][0] = ((Zahl)t).unexakt().real;
        double epsa = 1.1 * rombergtol;

        while (epsa > rombergtol && i < rombergit - 1)
        {
            i++;
            n      *= 2;
            t       = trapez(exp, v, n, a, b);
            I[0][i] = ((Zahl)t).unexakt().real;
            double f = 1.0;
            for (int k = 1; k <= i; k++)
            {
                f      *= 4;
                I[k][i] = I[k - 1][i] + (I[k - 1][i] - I[k - 1][i - 1]) / (f - 1.0);
            }
            epsa = Math.Abs((I[i][i] - I[i - 1][i - 1]) / I[i][i]);
        }
        st.Push(new Unexakt(I[i][i]));
        return(0);
    }
Exemplo n.º 11
0
 public FunctionVariable(string fname, Algebraic fvar, LambdaAlgebraic flambda)
 {
     this.Name      = fname;
     this.Var       = fvar;
     this.AlgLambda = flambda;
 }
Exemplo n.º 12
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: Algebraic makelog(Algebraic c, Variable x, Algebraic a) throws JasymcaException
    internal virtual Algebraic makelog(Algebraic c, Variable x, Algebraic a)
    {
        Algebraic arg = (new Polynomial(x)).sub(a);

        return(FunctionVariable.create("log", arg).mult(c));
    }
Exemplo n.º 13
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public static Vektor horowitz(Algebraic p, Polynomial q, Variable x) throws JasymcaException
    public static Vektor horowitz(Algebraic p, Polynomial q, Variable x)
    {
        if (Poly.degree(p, x) >= Poly.degree(q, x))
        {
            throw new JasymcaException("Degree of p must be smaller than degree of q");
        }
        p = p.rat();
        q = (Polynomial)q.rat();
        Algebraic d = Poly.poly_gcd(q, q.deriv(x));
        Algebraic b = Poly.polydiv(q, d);
        int       m = b is Polynomial? ((Polynomial)b).degree():0;
        int       n = d is Polynomial? ((Polynomial)d).degree():0;

        SimpleVariable[] a = new SimpleVariable[m];
        Polynomial       X = new Polynomial(x);
        Algebraic        A = Zahl.ZERO;

        for (int i = a.Length - 1; i >= 0; i--)
        {
            a[i] = new SimpleVariable("a" + i);
            A    = A.add(new Polynomial(a[i]));
            if (i > 0)
            {
                A = A.mult(X);
            }
        }
        SimpleVariable[] c = new SimpleVariable[n];
        Algebraic        C = Zahl.ZERO;

        for (int i = c.Length - 1; i >= 0; i--)
        {
            c[i] = new SimpleVariable("c" + i);
            C    = C.add(new Polynomial(c[i]));
            if (i > 0)
            {
                C = C.mult(X);
            }
        }
        Algebraic r = Poly.polydiv(C.mult(b).mult(d.deriv(x)), d);

        r = b.mult(C.deriv(x)).sub(r).add(d.mult(A));
//JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java:
//ORIGINAL LINE: Algebraic[][] aik = new Algebraic[m+n][m+n];
        Algebraic[][] aik = RectangularArrays.ReturnRectangularAlgebraicArray(m + n, m + n);
        Algebraic     cf; Algebraic[] co = new Algebraic[m + n];

        for (int i = 0; i < m + n; i++)
        {
            co[i] = Poly.coefficient(p, x, i);
            cf    = Poly.coefficient(r, x, i);
            for (int k = 0; k < m; k++)
            {
                aik[i][k] = cf.deriv(a[k]);
            }
            for (int k = 0; k < n; k++)
            {
                aik[i][k + m] = cf.deriv(c[k]);
            }
        }
        Vektor s = LambdaLINSOLVE.Gauss(new Matrix(aik), new Vektor(co));

        A = Zahl.ZERO;
        for (int i = m - 1; i >= 0; i--)
        {
            A = A.add(s.get(i));
            if (i > 0)
            {
                A = A.mult(X);
            }
        }
        C = Zahl.ZERO;
        for (int i = n - 1; i >= 0; i--)
        {
            C = C.add(s.get(i + m));
            if (i > 0)
            {
                C = C.mult(X);
            }
        }
        co    = new Algebraic[2];
        co[0] = C.div(d);
        co[1] = A.div(b);
        return(new Vektor(co));
    }
Exemplo n.º 14
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: public Algebraic value(Variable var, Algebraic x) throws JasymcaException
    public override Algebraic value(Variable @var, Algebraic x)
    {
        return(nom.value(@var, x).div(den.value(@var, x)));
    }
Exemplo n.º 15
0
    internal override Algebraic f_exakt(Algebraic x)
    {
        if (!(x is Polynomial))
        {
            return(x.map(this));
        }

        var xp = ( Polynomial )x;

        var item = xp.v;

        if (item is Root)
        {
            var cr = (( Root )item).poly;

            if (cr.length() == xp.degree() + 1)
            {
                var xr = new Algebraic[xp.degree() + 1];

                Algebraic ratio = null;

                for (int i = xr.Length - 1; i >= 0; i--)
                {
                    xr[i] = xp.a[i].map(this);

                    if (i == xr.Length - 1)
                    {
                        ratio = xr[i];
                    }
                    else if (i > 0 && ratio != null)
                    {
                        if (!cr.get(i).mult(ratio).Equals(xr[i]))
                        {
                            ratio = null;
                        }
                    }
                }
                if (ratio != null)
                {
                    return(xr[0].sub(ratio.mult(cr.get(0))));
                }
                else
                {
                    return(new Polynomial(item, xr));
                }
            }
        }

        Algebraic xf = null;

        if (item is FunctionVariable && (( FunctionVariable )item).fname.Equals("sqrt") && (( FunctionVariable )item).arg is Polynomial)
        {
            var arg = ( Polynomial )(( FunctionVariable )item).arg;

            var sqfr = arg.square_free_dec(arg.v);

            var issquare = !(sqfr.Length > 0 && !sqfr[0].Equals(arg.a[arg.a.Length - 1]));

            for (int i = 2; i < sqfr.Length && issquare; i++)
            {
                if ((i + 1) % 2 == 1 && !sqfr[i].Equals(Zahl.ONE))
                {
                    issquare = false;
                }
            }

            if (issquare)
            {
                xf = Zahl.ONE;

                for (int i = 1; i < sqfr.Length; i += 2)
                {
                    if (!sqfr[i].Equals(Zahl.ZERO))
                    {
                        xf = xf.mult(sqfr[i].pow_n((i + 1) / 2));
                    }
                }

                Algebraic r = Zahl.ZERO;

                for (int i = xp.a.Length - 1; i > 0; i--)
                {
                    r = r.add(f_exakt(xp.a[i])).mult(xf);
                }

                if (xp.a.Length > 0)
                {
                    r = r.add(f_exakt(xp.a[0]));
                }

                return(r);
            }
        }

        if (item is FunctionVariable && (( FunctionVariable )item).fname.Equals("sqrt") && xp.degree() > 1)
        {
            xf = (( FunctionVariable )item).arg;

            var sq = new Polynomial(item);

            var r = f_exakt(xp.a[0]);

            Algebraic xv = Zahl.ONE;

            for (int i = 1; i < xp.a.Length; i++)
            {
                if (i % 2 == 1)
                {
                    r = r.add(f_exakt(xp.a[i]).mult(xv).mult(sq));
                }
                else
                {
                    xv = xv.mult(xf);
                    r  = r.add(f_exakt(xp.a[i]).mult(xv));
                }
            }

            return(r);
        }

        return(x.map(this));
    }
Exemplo n.º 16
0
 internal override Algebraic SymEval(Algebraic x)
 {
     return(Equals(x, Symbolic.ZERO) ? Symbolic.ZERO : null);
 }
Exemplo n.º 17
0
    internal override Algebraic f_exakt(Algebraic x)
    {
        if (x is Rational)
        {
            var xr = ( Rational )x;

            if (xr.den.v is FunctionVariable &&
                (( FunctionVariable )xr.den.v).fname.Equals("exp") &&
                (( FunctionVariable )xr.den.v).arg.komplexq())
            {
                var fv = ( FunctionVariable )xr.den.v;

                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).div(divExponential(xr.den, fv, maxdeg / 2)));
                }
                else
                {
                    var fv2 = new FunctionVariable("exp", (( FunctionVariable )xr.den.v).arg.div(Zahl.TWO), (( FunctionVariable )xr.den.v).la);

                    Algebraic ex = new Polynomial(fv2, new Algebraic[] { Zahl.ZERO, Zahl.ZERO, Zahl.ONE });

                    var xr1 = xr.nom.value(xr.den.v, ex).div(xr.den.value(xr.den.v, ex));

                    return(f_exakt(xr1));
                }
            }
        }

        if (x is Polynomial && (( Polynomial )x).v is FunctionVariable)
        {
            var xp = ( Polynomial )x;

            Algebraic xf = null;

            var fvar = ( FunctionVariable )xp.v;

            if (fvar.fname.Equals("exp"))
            {
                var re = fvar.arg.realpart();
                var im = fvar.arg.imagpart();

                if (!im.Equals(Zahl.ZERO))

                {
                    bool _minus = minus(im);

                    if (_minus)
                    {
                        im = im.mult(Zahl.MINUS);
                    }

                    var a = FunctionVariable.create("exp", re);
                    var b = FunctionVariable.create("cos", im);
                    var c = FunctionVariable.create("sin", im).mult(Zahl.IONE);

                    xf = a.mult(_minus ? (b.sub(c)) : b.add(c));
                }
            }

            if (fvar.fname.Equals("log"))
            {
                var arg = fvar.arg;

                Algebraic factor = Zahl.ONE, sum = Zahl.ZERO;

                if (arg is Polynomial &&
                    (( Polynomial )arg).degree() == 1 &&
                    (( Polynomial )arg).v is FunctionVariable &&
                    (( Polynomial )arg).a[0].Equals(Zahl.ZERO) &&
                    (( FunctionVariable )(( Polynomial )arg).v).fname.Equals("sqrt"))
                {
                    sum = FunctionVariable.create("log", (( Polynomial )arg).a[1]);

                    factor = new Unexakt(0.5);

                    arg = (( FunctionVariable )(( Polynomial )arg).v).arg;

                    xf = FunctionVariable.create("log", arg);
                }

                try
                {
                    var re = arg.realpart();
                    var im = arg.imagpart();

                    if (!im.Equals(Zahl.ZERO))
                    {
                        bool min_im = minus(im);

                        if (min_im)
                        {
                            im = im.mult(Zahl.MINUS);
                        }

                        var a1 = (new SqrtExpand()).f_exakt(arg.mult(arg.cc()));
                        var a  = FunctionVariable.create("log", a1).div(Zahl.TWO);

                        var b1 = f_exakt(re.div(im));
                        var b  = FunctionVariable.create("atan", b1).mult(Zahl.IONE);

                        xf = min_im ? a.add(b) : a.sub(b);

                        var pi2 = Zahl.PI.mult(Zahl.IONE).div(Zahl.TWO);

                        xf = min_im ? xf.sub(pi2) : xf.add(pi2);
                    }
                }
                catch (JasymcaException)
                {
                }

                if (xf != null)
                {
                    xf = xf.mult(factor).add(sum);
                }
            }

            if (xf == null)
            {
                return(x.map(this));
            }

            Algebraic r = Zahl.ZERO;

            for (int i = xp.a.Length - 1; i > 0; i--)
            {
                r = r.add(f_exakt(xp.a[i])).mult(xf);
            }

            if (xp.a.Length > 0)
            {
                r = r.add(f_exakt(xp.a[0]));
            }

            return(r);
        }

        return(x.map(this));
    }
Exemplo n.º 18
0
 public static Algebraic reduce_exp(Algebraic p)
 {
     Algebraic[] a = new Algebraic[] { p };
     a = reduce_exp(a);
     return(a[0]);
 }
Exemplo n.º 19
0
    public static Vector solve(Algebraic expr, Variable item)
    {
        Debug("Solve: " + expr + " = 0, Variable: " + item);

        expr = (new ExpandUser()).SymEval(expr);
        expr = (new TrigExpand()).SymEval(expr);

        Debug("TrigExpand: " + expr);

        expr = (new NormExp()).SymEval(expr);

        Debug("Norm: " + expr);

        expr = (new CollectExp(expr)).SymEval(expr);

        Debug("Collect: " + expr);

        expr = (new SqrtExpand()).SymEval(expr);

        Debug("SqrtExpand: " + expr);

        if (expr is Rational)
        {
            expr = (new LambdaRAT()).SymEval(expr);

            if (expr is Rational)
            {
                expr = (( Rational )expr).nom;
            }
        }

        Debug("Canonic Expression: " + expr);

        if (!(expr is Polynomial) || !(( Polynomial )expr).Depends(item))
        {
            throw new JasymcaException("Expression does not depend of variable.");
        }

        var p = ( Polynomial )expr;

        Vector sol = null;

        var dep = depvars(p, item);

        if (dep.Count == 0)
        {
            throw new JasymcaException("Expression does not depend of variable.");
        }

        if (dep.Count == 1)
        {
            var dvar = ( Variable )dep[0];

            Debug("Found one Variable: " + dvar);

            sol = p.solve(dvar);

            Debug("Solution: " + dvar + " = " + sol);

            if (!dvar.Equals(item))
            {
                var s = new ArrayList();

                for (int i = 0; i < sol.Length(); i++)
                {
                    Debug("Invert: " + sol[i] + " = " + dvar);

                    var sl = finvert(( FunctionVariable )dvar, sol[i]);

                    Debug("Result: " + sl + " = 0");

                    var t = solve(sl, item);

                    Debug("Solution: " + item + " = " + t);

                    for (int k = 0; k < t.Length(); k++)
                    {
                        var tn = t[k];

                        if (!s.Contains(tn))
                        {
                            s.Add(tn);
                        }
                    }
                }

                sol = Vector.Create(s);
            }
        }
        else if (dep.Count == 2)
        {
            Debug("Found two Variables: " + dep[0] + ", " + dep[1]);

            if (dep.Contains(item))
            {
                var f = ( FunctionVariable )(dep[0].Equals(item) ? dep[1] : dep[0]);

                if (f.Name.Equals("sqrt"))
                {
                    Debug("Solving " + p + " for " + f);

                    sol = p.solve(f);

                    Debug("Solution: " + f + " = " + sol);

                    var s = new ArrayList();

                    for (int i = 0; i < sol.Length(); i++)
                    {
                        Debug("Invert: " + sol[i] + " = " + f);

                        var sl = finvert(f, sol[i]);

                        Debug("Result: " + sl + " = 0");

                        if (sl is Polynomial && depvars((( Polynomial )sl), item).Count == 1)
                        {
                            Debug("Solving " + sl + " for " + item);

                            var t = solve(sl, item);

                            Debug("Solution: " + item + " = " + t);

                            for (int k = 0; k < t.Length(); k++)
                            {
                                var tn = t[k];

                                if (!s.Contains(tn))
                                {
                                    s.Add(tn);
                                }
                            }
                        }
                        else
                        {
                            throw new JasymcaException("Could not solve equation.");
                        }
                    }

                    sol = Vector.Create(s);
                }
                else
                {
                    throw new JasymcaException("Can not solve equation.");
                }
            }
            else
            {
                throw new JasymcaException("Can not solve equation.");
            }
        }
        else
        {
            throw new JasymcaException("Can not solve equation.");
        }

        return(sol);
    }
Exemplo n.º 20
0
 public Exponential(Polynomial x) : base(x.v, x.a)
 {
     this.expvar = ((Polynomial)((FunctionVariable)this.v).arg).v;
     this.exp_b  = ((Polynomial)((FunctionVariable)this.v).arg).a[1];
 }
Exemplo n.º 21
0
    public virtual int rank_decompose(Matrix B, Matrix P)
    {
        int    m = nrow(), n = ncol(), perm = 0;
        Matrix C = eye(m, m);
        Matrix D = eye(m, m);

        for (int k = 0; k < m - 1; k++)
        {
            int _pivot = pivot(k);
            if (_pivot != k)
            {
                Matrix E = elementary(m, k, _pivot);
                C = (Matrix)C.mult(E);
                D = (Matrix)D.mult(E);
                perm++;
            }
            int p = k;
            for (p = k; p < n; p++)
            {
                if (!a[k][p].Equals(Zahl.ZERO))
                {
                    break;
                }
            }
            if (p < n)
            {
                for (int i = k + 1; i < m; i++)
                {
                    if (!a[i][p].Equals(Zahl.ZERO))
                    {
                        Algebraic f = a[i][p].div(a[k][p]);
                        a[i][p] = Zahl.ZERO;
                        for (int j = p + 1; j < n; j++)
                        {
                            a[i][j] = a[i][j].sub(f.mult(a[k][j]));
                        }
                        C = (Matrix)C.mult(elementary(m, i, k, f));
                    }
                }
            }
        }
        int nm = Math.Max(n, m);

        for (int i = nm - 1; i >= 0; i--)
        {
            if (row_zero(i))
            {
                remove_row(i);
                C.remove_col(i);
            }
        }
        if (B != null)
        {
            B.a = C.a;
        }
        if (P != null)
        {
            P.a = D.a;
        }
        return(perm);
    }
Exemplo n.º 22
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in .NET:
//ORIGINAL LINE: Vektor solve(Vector expr, Vector x, int n) throws JasymcaException
    internal virtual Vector solve(ArrayList expr, ArrayList x, int n)
    {
        Algebraic equ = null;
        Variable  v = null;
        int       i, k, iv = 0, ke = 0;

        for (i = 0; i < n && equ == null; i++)
        {
            v = (Variable)x[i];
            double norm = -1.0;
            for (k = 0; k < n; k++)
            {
                Algebraic exp = (Algebraic)expr[k];
                if (exp is Rational)
                {
                    exp = ((Rational)exp).nom;
                }
                Algebraic slope = exp.Derive(v);
                if (!slope.Equals(Symbolic.ZERO) && slope is Symbolic)
                {
                    double nm = slope.Norm() / exp.Norm();
                    if (nm > norm)
                    {
                        norm = nm;
                        equ  = exp;
                        ke   = k;
                        iv   = i;
                    }
                }
            }
        }
        if (equ == null)
        {
            for (i = 0; i < n && equ == null; i++)
            {
                v = (Variable)x[i];
                for (k = 0; k < n; k++)
                {
                    Algebraic exp = (Algebraic)expr[k];
                    if (exp is Rational)
                    {
                        exp = ((Rational)exp).nom;
                    }
                    if (exp.Depends(v))
                    {
                        equ = exp;
                        ke  = k;
                        iv  = i;
                        break;
                    }
                }
            }
        }
        if (equ == null)
        {
            throw new JasymcaException("Expressions do not depend of Variables.");
        }
        Vector sol = LambdaSOLVE.solve(equ, v);

        expr.RemoveAt(ke);
        expr.Insert(n - 1, equ);
        x.RemoveAt(iv);
        x.Insert(n - 1, v);
        return(sol);
    }