Вычислить определенный интеграл по формуле Ньютона-Котеса - Pascal
Формулировка задачи:
- program N-K;
- const n = 8; //Кол-во разбиений
- a = 0; //начало
- d = 1; //конец
- h = 1/9; //шаг
- e = power(10,-4); //точность
- c : array of real = (1787/4480, -2803/4480, 4967/4480, -1711/4480, -1711/4480, 4967/4480, -2803/4480, 1787/4480); //Коэф
- var
- i : integer;
- R, x : real;
- //Вычисление значения функции
- function f(x : real) : real;
- begin
- f := ln(1+x)/(sqr(x)+1);
- end;
- begin
- x :=0;
- R :=0;
- for i :=0 to n-1 do
- begin
- x := x+h;
- R := R + c[i]*f(x);
- end;
- writeln(R);
- readln;
- end.
Решение задачи: «Вычислить определенный интеграл по формуле Ньютона-Котеса»
- {
- Программа для вычисления интеграла
- численным методом Ньютона-Котеса открытого типа 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.
Объяснение кода листинга программы
{Программа для вычисления интеграла численным методом Ньютона-Котеса открытого типа 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 begin SumSubIntervals := SumSubIntervals + NewtonCotesOpen4(a + pred(i) h, a + i h); end; 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д