Перевод кода из pascal в c# (консольное приложение) : написать программу, которая позволяет вычислять определенный интеграл с формулы ньютона-котеса. код: { программа для вычисления интеграла численным методом ньютона-котеса открытого типа 4-го порядка с заданной погрешностью вычислений } program newtoncotes; {подинтегральная функция} function f(x: real): real; begin f : = sin(x); end; {вычисление интеграла на отрезке [a, b] методом ньютона-котеса открытого типа 4-го порядка} function newtoncotesopen4(a, b: real): real; const n = 4; {порядок метода} c: array [1..n - 1] of real = (2, -1, 2); {весовые коэффициенты} k = 3.0; {делитель} var res: real; h: real; {величина шага} x: real; i: integer; begin h : = (b - a) / n; res : = 0; for i : = 1 to n - 1 do begin x : = a + i * h; res : = res + c[i] * f(x); end; newtoncotesopen4 : = res * (b - a) / k; end; {вычисление интеграла на отрезке [a, b] как суммы интегралов на n подинтервалах} function sumsubintervals(a, b: real; n: integer): real; var h: real; i: integer; begin sumsubintervals : = 0; h : = (b - a) / n; for i : = 1 to n do sumsubintervals : = sumsubintervals + newtoncotesopen4(a + pred(i) * h, a + i * h); end; var a, b, {границы интегрирования} eps: real; {погрешность численного интегрирования} n: integer; {количество подинтервалов интегрирования} icur, {значение интеграла на текущем шаге итерации} ipre: real; {значение интеграла на предыдущем шаге итерации} begin a : = 0; b : = pi; eps : = 0.00001; n : = 1; icur : = sumsubintervals(a, b, n); repeat ipre : = icur; n : = 2 * n; {увеличиваем количество подинтервалов} icur : = sumsubintervals(a, b, n); writeln('i=', icur: 10: 8, ' при n=', n, ', e=', abs(icur - ipre): 10: 8); until abs(icur - ipre) < eps; writeln(''); writeln('i=', icur: 10: 8, ' при n=', n, ', e=', abs(icur - ipre): 10: 8); end.
namespace Test{ class Program { static double F(double x) { return Math.Sin(x); }
static double NewtonCotesOpen4(double a, double b) { const int n = 4; double[] c = {2.0, -1.0, 2.0 }; const double K = 3.0;
double h = (b - a) / n; double res = 0;
double x; for(int i = 1; i <= n - 1; i++) { x = a + i * h; res += c[i - 1] * F(x); }
return res * (b - a) / K; }
static double SumSubIntervals(double a, double b, int n) { double res = 0; double h = (b - a) / n; for(int i = 1; i <= n; i++) { res += NewtonCotesOpen4(a + (i - 1) * h, a + i * h); }
return res; }
static void Main(string[] args) { double a = 0; double b = Math.PI; double EPS = 0.00001;
int n = 1; double lcur = SumSubIntervals(a, b, n); double lpre; do { lpre = lcur; n *= 2; lcur = SumSubIntervals(a, b, n); Console.WriteLine("l={0} при n={1} e={2}", Math.Round(lcur, 8), n, Math.Round(Math.Abs(lcur - lpre), 8)); } while (Math.Abs(lcur - lpre) < EPS);
Console.WriteLine("");
Console.WriteLine("l={0} при n={1} e={2}", Math.Round(lcur, 8), n, Math.Round(Math.Abs(lcur - lpre), 8)); } }}