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); }
//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); }