Вычислить определенный интеграл по формуле Ньютона-Котеса - Pascal

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Надо вычислить определенный интеграл по формуле Ньютона-Котеса открытого типа с заданной точностью (eps =10^(-4)) c использованием АДАПТИВНОГО АЛГОРИТМА! Перерыла весь интернет и Ваш форум. Чисто логически поняла, как это сделать, но вот с написанием кода проблемы(( Подскажите, пожалуйста, как нужно изменить прогу? Вот что получилось (без адаптивного алгоритма)
Листинг программы
  1. program N-K;
  2. const n = 8; //Кол-во разбиений
  3. a = 0; //начало
  4. d = 1; //конец
  5. h = 1/9; //шаг
  6. e = power(10,-4); //точность
  7. c : array of real = (1787/4480, -2803/4480, 4967/4480, -1711/4480, -1711/4480, 4967/4480, -2803/4480, 1787/4480); //Коэф
  8. var
  9. i : integer;
  10. R, x : real;
  11. //Вычисление значения функции
  12. function f(x : real) : real;
  13. begin
  14. f := ln(1+x)/(sqr(x)+1);
  15. end;
  16. begin
  17. x :=0;
  18. R :=0;
  19. for i :=0 to n-1 do
  20. begin
  21. x := x+h;
  22. R := R + c[i]*f(x);
  23. end;
  24. writeln(R);
  25. readln;
  26. end.

Решение задачи: «Вычислить определенный интеграл по формуле Ньютона-Котеса»

textual
Листинг программы
  1. {
  2.  Программа для вычисления интеграла
  3.  численным методом Ньютона-Котеса открытого типа 4-го порядка
  4.  с заданной погрешностью вычислений
  5. }
  6. program NewtonCotes;
  7.  
  8.   {подинтегральная функция}
  9.   function F(x: real): real;
  10.   begin
  11.     F := sin(x);
  12.   end;
  13.  
  14.   {вычисление интеграла на отрезке [a, b] методом Ньютона-Котеса открытого типа 4-го порядка}
  15.   function NewtonCotesOpen4(a, b: real): real;
  16.   const
  17.     n = 4; {порядок метода}
  18.     c: array [1..n - 1] of real = (2, -1, 2); {весовые коэффициенты}
  19.     K = 3.0; {делитель}
  20.   var
  21.     Res: real;
  22.     h: real; {величина шага}
  23.     x: real;
  24.     i: integer;
  25.   begin
  26.     h := (b - a) / n;
  27.     Res := 0;
  28.     for i := 1 to n - 1 do
  29.     begin
  30.       x := a + i * h;
  31.       Res := Res + c[i] * F(x);
  32.     end;
  33.     NewtonCotesOpen4 := Res * (b - a) / K;
  34.   end;
  35.  
  36.   {вычисление интеграла на отрезке [a, b] как суммы интегралов на n подинтервалах}
  37.   function SumSubIntervals(a, b: real; n: integer): real;
  38.   var
  39.     h: real;
  40.     i: integer;
  41.   begin
  42.     SumSubIntervals := 0;
  43.     h := (b - a) / n;
  44.     for i := 1 to n do
  45.       SumSubIntervals := SumSubIntervals + NewtonCotesOpen4(a + pred(i) * h, a + i * h);
  46.   end;
  47.  
  48. var
  49.   a, b,        {границы интегрирования}
  50.   Eps: real;   {погрешность численного интегрирования}
  51.   n: integer;  {количество подинтервалов интегрирования}
  52.   Icur,        {значение интеграла на текущем шаге итерации}
  53.   Ipre: real;  {значение интеграла на предыдущем шаге итерации}
  54.  
  55. begin
  56.   a := 0;
  57.   b := Pi;
  58.   Eps := 0.00001;
  59.  
  60.   n := 1;
  61.   Icur := SumSubIntervals(a, b, n);
  62.   repeat
  63.     Ipre := Icur;
  64.     n := 2 * n;                {увеличиваем количество подинтервалов}
  65.     Icur := SumSubIntervals(a, b, n);
  66.     WriteLn('I=', Icur: 10: 8, ' при n=', n, ', e=', Abs(Icur - Ipre): 10: 8);
  67.   until Abs(Icur - Ipre) < Eps;
  68.   writeln('------------------------------------------------------');
  69.   WriteLn('I=', Icur: 10: 8, ' при n=', n, ', e=', Abs(Icur - Ipre): 10: 8);
  70. 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.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы