Вопрос задан 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.
0 0
Перейти к ответам

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

Внимание! Ответы на вопросы дают живые люди. Они могут содержать ошибочную информацию, заблуждения, а также ответы могут быть сгенерированы нейросетями. Будьте внимательны. Если вы уверены, что ответ неверный, нажмите кнопку "Пожаловаться" под ответом.
Отвечает Постоєв Діма.
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));        }    }}
0 0
Отвечает нейросеть ChatGpt. Будьте внимательны, ответы нейросети могут содержать ошибочные или выдуманные данные.

Переведем код на Pascal в эквивалентный код на C# для консольного приложения:

csharp
using 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#. Остальной код остался практически неизменным.

0 0

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос