Помогите пожалуйста кто шарит в Pascal. Составить программу приближенного вычисления определенного интеграла, используя формулы численного интегрирования: Формулу левых прямоугольников.
Часто выбирают равномерное разбиение, в котором все точки расположены на одинаковом расстоянии h = (b - a) / n, при этом .
Реализация (PascalABC.NET): функция int_lr принимает подинтегральную функцию, левую и правую границы отрезка интегрирования и количество отрезков в разбиения. В основной программе интеграл вычисляется для n = 1, 2, 4, 8, ..., 1024, выводится n, результат численного интегрирования и разность между полученным значением и точным значением интеграла. Можно заметить, что при увеличении n в 2 раза ошибка уменьшается примерно в 2 раза.
function int_lr(f: real-> real; l, r: real; n: integer): real;
begin
var h := (r - l) / n;
var s := 0.To(n - 1).Select(i -> f(l + i * h)).Sum;
result := s * h;
end;
const exact = 1250 / 3;
begin
var n := 1;
for var _ := 1 to 11 do
begin
var int := int_lr(x -> (x - 5) ** 2 * (10 - x), 0, 10, n);
Answers & Comments
Verified answer
Пусть - какое-то разбиение отрезка [a, b]. Формулой левых прямоугольников называется приближение
Часто выбирают равномерное разбиение, в котором все точки расположены на одинаковом расстоянии h = (b - a) / n, при этом .
Реализация (PascalABC.NET): функция int_lr принимает подинтегральную функцию, левую и правую границы отрезка интегрирования и количество отрезков в разбиения. В основной программе интеграл вычисляется для n = 1, 2, 4, 8, ..., 1024, выводится n, результат численного интегрирования и разность между полученным значением и точным значением интеграла. Можно заметить, что при увеличении n в 2 раза ошибка уменьшается примерно в 2 раза.
function int_lr(f: real-> real; l, r: real; n: integer): real;
begin
var h := (r - l) / n;
var s := 0.To(n - 1).Select(i -> f(l + i * h)).Sum;
result := s * h;
end;
const exact = 1250 / 3;
begin
var n := 1;
for var _ := 1 to 11 do
begin
var int := int_lr(x -> (x - 5) ** 2 * (10 - x), 0, 10, n);
writeln(n:4, int:9:3, abs(int - exact):9:3);
n := 2 * n;
end;
end.
Вывод программы:
1 2500.000 2083.333
2 1250.000 833.333
4 781.250 364.583
8 585.938 169.271
16 498.047 81.380
32 456.543 39.876
64 436.401 19.735
128 426.483 9.816
256 421.562 4.896
512 419.111 2.445
1024 417.888 1.221