Вычисление определенного интеграла с заданной точностью( метод Симпсона) - Pascal ABC
Формулировка задачи:
Проверьте пожалуйста программу на ошибки. 1/xlg(x) a=2 b=3
Листинг программы
- Program Simpson4;
- function F(x:real):real;
- begin
- F:=1/(x*(ln(x)/ln(10)));
- end;
- Procedure Simp(a,b:real;n:integer;var J:real);
- Var
- h,x,J1,J2:real;
- N1,i:integer;
- Begin
- N1:=n-1;
- h:=(b-a)/N1;
- J1:=0.0;
- i:=1;
- while i<=2*N1-1 do
- begin
- x:=a+i*h/2;
- J1:=J1+F(x);
- i:=i+2;
- end;
- J2:=0.0;
- i:=2;
- while i<=2*N1-2 do
- begin
- x:=a+i*h/2;
- J2:=J2+F(x);
- i:=i+2;
- end;
- J:=h/6*(F(a)+F(b)+4*J1+2*J2);
- End;
- Var
- a,b,J0,J1,J2,eps:real;
- n:integer;
- Begin
- a:=2;
- b:=3;
- eps:=0.00001;
- Writeln(' n?');
- readln(n);
- J0:=0.0;
- Repeat
- J1:=J0;
- n:=2*n;
- Simp(a,b,n,J2);
- J0:=J2;
- Until abs(J1-J2)<=eps;
- writeln('Значение интеграла: J2=', J2:0:5);
- End.
Решение задачи: «Вычисление определенного интеграла с заданной точностью( метод Симпсона)»
textual
Листинг программы
- {
- Программа для вычисления интеграла
- численным методом Симпсона
- с заданной погрешностью вычислений
- }
- program Sympson;
- function F(x: real): real;
- begin
- F := 1 / (x * (ln(x) / ln(10)));
- end;
- function Integr(a, b: real; n: integer): real;
- var
- Res: real;
- h: real; {величина шага}
- x: real;
- i: integer;
- begin
- h := (b - a) / n;
- Res := F(a) + F(b);
- i := 1;
- while i < n do
- begin
- x := a + i * h;
- Res := Res + 4 * F(x);
- Inc(i);
- x := a + i * h;
- Res := Res + 2 * F(x);
- Inc(i);
- end;
- Res := Res * h / 3;
- Integr := Res;
- end;
- var
- a, b, {границы интегрирования}
- Eps: real; {погрешность численного интегрирования}
- n: integer;{количество подинтервалов интегрирования}
- Icur, {значение интеграла на текущем шаге итерации}
- Ipre: real;{значение интеграла на предыдущем шаге итерации}
- begin
- a := 2;
- b := 3;
- Eps := 0.00001;
- n := 2;
- Icur := Integr(a, b, n);
- repeat
- Ipre := Icur;
- n := 2 * n; {увеличиваем количество подинтервалов}
- Icur := Integr(a, b, n);
- WriteLn('I=', Icur: 10: 8, ' при n=', n, ', e=', Abs(Icur - Ipre): 10: 8);
- until Abs(Icur - Ipre) < Eps;
- WriteLn('I=', Icur: 10: 8, ' при n=', n, ', e=', Abs(Icur - Ipre): 10: 8);
- end.
Объяснение кода листинга программы
- В функции F(x) вычисляется определенный интеграл с использованием численного метода Симпсона.
- В функции Integr(a, b; n) вычисляется определенный интеграл с заданной погрешностью вычислений.
- Переменная h используется для определения величины шага.
- Переменные x и i используются для итеративного вычисления интеграла.
- Переменная Res используется для хранения промежуточных результатов вычислений.
- Переменная Eps используется для задания погрешности численного интегрирования.
- Переменная n используется для задания количества подинтервалов интегрирования.
- Переменные Icur и Ipre используются для хранения значений интеграла на текущем и предыдущем шагах итерации соответственно.
- В цикле while повторяются вычисления на текущем и предыдущем шагах итерации, пока разница между ними не будет меньше заданной погрешности.
- После достижения заданной точности, значение интеграла записывается в переменную Integr.
- В конце программы выводятся результаты вычислений.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д