Вычисление определённого интеграла с заданной точностью - Pascal
Формулировка задачи:
Задали вычислить определённый интеграл с заданной точностью
f = 1/(1+sin(x)+cos(x))
F (первообразная) = ln|1+tg(x/2)|
E1 (точность) = 0.001
E2 = 0.0001
n (число разбиений) - не задано
Нужно решить методом прямоугольников, трапеций и Cимпсона
Помогите пожалуйста!
Решение задачи: «Вычисление определённого интеграла с заданной точностью»
textual
Листинг программы
program AnyInt;
type
TMethodFunc = function(a, b: real; n: integer): real;
{интегрируемая функция}
function F(x: real): real;
begin
F := 1 / (1 + sin(x) + cos(x));
;
end;
function tg(x: real): real;
begin
tg := sin(x) / cos(x);
end;
{первообразная интегрируемой функции}
function AntiderivativeF(x: real): real;
begin
AntiderivativeF := ln(abs(1 + tg(x / 2)));
end;
function IntSympson(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;
IntSympson := Res;
end;
function IntSquareR(a, b: real; n: integer): real;
var
Res: real;
h: real; {величина шага}
x: real;
i: integer;
begin
h := (b - a) / n;
Res := 0;
i := 1;
while i <= n do
begin
x := a + i * h;
Res := Res + F(x);
Inc(i);
end;
Res := h * Res;
IntSquareR := Res;
end;
function IntTrapec(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)) / 2;
i := 1;
while i < n do
begin
x := a + i * h;
Res := Res + F(x);
Inc(i);
end;
Res := h * Res;
IntTrapec := Res;
end;
function Integral(a, b, Eps: real; IntMethod: TMethodFunc): real;
var
n: integer; {количество подинтервалов интегрирования}
Icur, {значение интеграла на текущем шаге итерации}
Ipre: real; {значение интеграла на предыдущем шаге итерации}
begin
n := 2;
Icur := IntMethod(a, b, n);
repeat
Ipre := Icur;
n := 2 * n; {увеличиваем количество подинтервалов}
Icur := IntMethod(a, b, n);
until Abs(Icur - Ipre) < Eps;
Integral := Icur;
end;
var
a, b, {границы интегрирования}
Eps: real; {погрешность численного интегрирования}
begin
a := 0;
b := Pi / 2;
WriteLn(' Etalon Eps Sympson R Squaries Trapec');
Eps := 0.001;
Write(AntiderivativeF(b) - AntiderivativeF(a): 10: 6);
Write(Eps: 10: 6);
Write(Integral(a, b, Eps, @IntSympson): 10: 6);
Write(Integral(a, b, Eps, @IntSquareR): 10: 6);
Write(Integral(a, b, Eps, @IntTrapec): 10: 6);
WriteLn;
Eps := 0.0001;
Write(AntiderivativeF(b) - AntiderivativeF(a): 10: 6);
Write(Eps: 10: 6);
Write(Integral(a, b, Eps, @IntSympson): 10: 6);
Write(Integral(a, b, Eps, @IntSquareR): 10: 6);
Write(Integral(a, b, Eps, @IntTrapec): 10: 6);
WriteLn;
end.
Объяснение кода листинга программы
- Объявляется переменная TMethodFunc как функция, принимающая параметры a, b, n и возвращающая значение типа real.
- Описывается функция F, принимающая параметр x типа real и возвращающая значение типа real. Возвращаемое значение функции - 1 / (1 + sin(x) + cos(x)).
- Описывается функция tg, принимающая параметр x типа real и возвращающая значение типа real. Возвращаемое значение функции - sin(x) / cos(x).
- Описывается функция AntiderivativeF, принимающая параметр x типа real и возвращающая значение типа real. Возвращаемое значение функции - ln(abs(1 + tg(x / 2))).
- Описывается функция IntSympson, принимающая параметры a, b типа real и n типа integer, возвращающая значение типа real.
- Описывается функция IntSquareR, принимающая параметры a, b типа real и n типа integer, возвращающая значение типа real.
- Описывается функция IntTrapec, принимающая параметры a, b типа real и n типа integer, возвращающая значение типа real.
- Описывается функция Integral, принимающая параметры a, b, Eps типа real и IntMethod типа TMethodFunc, возвращающая значение типа real.
- Объявляются переменные a, b, Eps типа real, затем выполняется последовательность вычислений и вывода результатов на экран.