Предмет: Информатика,
автор: Лиля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.
Ответы
Автор ответа:
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)); } }}
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:
Оно автоматически форматируется, когда копируете в редактор кода
Не понимаю, в чем проблема. Я сделал относительно нелегкую задачку за относительно маленькое кол-во баллов, а моим решением явно довольны (мой ответ помечен, как лучший). Поскольку это единичная просьба перевода кода, никто другой этим ответом пользоваться не будет. Тогда зачем мне терять на форматирование? Я учел ваше замечание и отныне ко всем ответам с кодом прикрепляю отформатированный текстовый файл.
Похожие вопросы
Предмет: Математика,
автор: baglikvalera
Предмет: Алгебра,
автор: alicespark2008
Предмет: Русский язык,
автор: aaaaa139bx
Предмет: Химия,
автор: настя3181
Предмет: Математика,
автор: Аноним