
Вопрос задан 31.07.2023 в 18:26.
Предмет Информатика.
Спрашивает Лепёхин Никита.
Перевод кода из 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.

Ответы на вопрос

Отвечает Постоєв Діма.
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)); } }}
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)); } }}



Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.
Переведем код на Pascal в эквивалентный код на C# для консольного приложения:
csharpusing System;
namespace NewtonCotes
{
class Program
{
// Подинтегральная функция
static double F(double x)
{
return Math.Sin(x);
}
// Вычисление интеграла на отрезке [a, b] методом Ньютона-Котеса открытого типа 4-го порядка
static double NewtonCotesOpen4(double a, double b)
{
const int n = 4; // порядок метода
double[] c = { 2, -1, 2 }; // весовые коэффициенты
double K = 3.0; // делитель
double Res = 0;
double h = (b - a) / n;
double x;
for (int i = 1; i < n; i++)
{
x = a + i * h;
Res += c[i - 1] * F(x);
}
return Res * (b - a) / K;
}
// Вычисление интеграла на отрезке [a, b] как суммы интегралов на n подинтервалах
static double SumSubIntervals(double a, double b, int n)
{
double sum = 0;
double h = (b - a) / n;
for (int i = 1; i <= n; i++)
{
sum += NewtonCotesOpen4(a + (i - 1) * h, a + i * h);
}
return sum;
}
static void Main(string[] args)
{
double a = 0; // границы интегрирования
double b = Math.PI;
double Eps = 0.00001; // погрешность численного интегрирования
int n = 1; // количество подинтервалов интегрирования
double Icur, Ipre; // значение интеграла на текущем и предыдущем шаге итерации
Icur = SumSubIntervals(a, b, n);
do
{
Ipre = Icur;
n *= 2; // увеличиваем количество подинтервалов
Icur = SumSubIntervals(a, b, n);
Console.WriteLine($"I = {Icur,10:F8} при n = {n}, e = {Math.Abs(Icur - Ipre),10:F8}");
} while (Math.Abs(Icur - Ipre) > Eps);
Console.WriteLine("------------------------------------------------------");
Console.WriteLine($"I = {Icur,10:F8} при n = {n}, e = {Math.Abs(Icur - Ipre),10:F8}");
}
}
}
Обратите внимание, что некоторые типы данных и функции из Pascal были заменены на аналогичные в C#. Также были внесены изменения в циклы и массивы, чтобы их индексация соответствовала языку C#. Остальной код остался практически неизменным.


Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
Предметы
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili