Предмет: Информатика, автор: Лиля160197

Перевод кода из 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.

Ответы

Автор ответа: abcdef0509
1
using System;
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));        }    }}

abcdef0509: Оно автоматически форматируется, когда копируете в редактор кода
abcdef0509: Не понимаю, в чем проблема. Я сделал относительно нелегкую задачку за относительно маленькое кол-во баллов, а моим решением явно довольны (мой ответ помечен, как лучший). Поскольку это единичная просьба перевода кода, никто другой этим ответом пользоваться не будет. Тогда зачем мне терять на форматирование? Я учел ваше замечание и отныне ко всем ответам с кодом прикрепляю отформатированный текстовый файл.
Похожие вопросы
Предмет: Математика, автор: baglikvalera
Предмет: Алгебра, автор: alicespark2008