示例#1
0
    public override int Eval(Stack st)
    {
        int narg = GetNarg(st);

        if (narg != 4)
        {
            throw new ParseException("Usage: ROMBERG (exp,var,ll,ul)");
        }

        var exp = GetAlgebraic(st);
        var v   = GetVariable(st);
        var ll  = GetAlgebraic(st);
        var ul  = GetAlgebraic(st);

        LambdaAlgebraic xc = new ExpandConstants();

        exp = xc.SymEval(exp);
        ll  = xc.SymEval(ll);
        ul  = xc.SymEval(ul);

        if (!(ll is Symbolic) || !(ul is Symbolic))
        {
            throw new ParseException("Usage: ROMBERG (exp,var,ll,ul)");
        }

        var rombergtol = 1.0e-4;
        int rombergit  = 11;

        var a1 = pc.env.getnum("rombergit");

        if (a1 != null)
        {
            rombergit = a1.ToInt();
        }

        a1 = pc.env.getnum("rombergtol");

        if (a1 != null)
        {
            rombergtol = a1.ToComplex().Re;
        }

        var a = (( Symbolic )ll).ToComplex().Re;
        var b = (( Symbolic )ul).ToComplex().Re;

        var I = Matrix.CreateRectangularArray <double>(rombergit, rombergit);
        int i = 0, n = 1;

        var t = trapez(exp, v, n, a, b);

        if (!(t is Symbolic))
        {
            throw new ParseException("Expression must evaluate to number");
        }

        I[0][0] = (( Symbolic )t).ToComplex().Re;

        double epsa = 1.1 * rombergtol;

        while (epsa > rombergtol && i < rombergit - 1)
        {
            i++;
            n *= 2;
            t  = trapez(exp, v, n, a, b);

            I[0][i] = (( Symbolic )t).ToComplex().Re;

            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 Complex(I[i][i]));

        return(0);
    }
示例#2
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);
    }