Персональная страничка
| ||
Предыдущий раздел:
Следующий раздел:
Рассмотрим пример задачи, где могут быть полезны процедурные типы. Пусть требуется создать функцию, производящую численное интегрирование любой функции одной переменной, то есть найти значение
Воспользуемся так называемым методом трапеций. Для этого интервал [a, b] разобьем на N равных отрезков. Ширина каждого составит
Концы отрезков будут иметь координаты
Оценим интеграл как сумму площадей трапеций, построенных на основе этих отрезков (см. рисунок).
Рис. 1. Вычисление определенного интеграла методом трапеций.
Площадь i-й по счету трапеции составит:
Оценка интеграла, таким образом, дается формулой:
Очевидно, чем меньше величина h (чем на большее число отрезков разбивается интервал интегрирования), тем более точной получится оценка интеграла.
Составим каркас универсальной функции, вычисляющей такой интеграл:
type TFunc = function (x: real): real; function Example (x: real): real; {Та функция, от которой в последствии будем брать интеграл} begin Example:=sin(x); end; function Integral(a, b: real; f: TFunc): real; {<Реализация метода трапеций с использованием функции f>} {Начало основной программы} begin Int:=Integral(0, Pi, Example); {Вызов функции Integral, где в качестве параметра передана функция Example, вычисляющая синус} end.
Вместо Example могла бы стоять произвольная, описанная в программе функция.
Непосредственную реализацию метода трапеций выполните самостоятельно.
Следующий раздел:
Предыдущий раздел:
В последней формуле предел изменения суммы функций: N-1;
N-2 неверно.
Снова вы правы. Спасибо, исправил.
Концептуально в основном понятно. Каша в голове от передачи параметров тоже есть. Программа работает. Все ли верно?
type
TFunc = function (x: real): real;
var
x, Int: real;
function Example (x: real): real;
{Та функция, от которой в последствии будем брать интеграл}
begin
Example:=sin(x);
end;
function Integral(a, b: real; f: TFunc): real;
const
N=1000;
var
i: integer;
h, s: real;
begin
h:=(b-a)/N;
s:=(f(a)+f(b))*h;
for i:=1 to N-1 do
begin
x:=x+h;
s:=s+f(x);
end;
Integral:=s*h;
end;
begin
Int:=Integral(0, Pi, Example); {Вызов функции Integral, где в
качестве параметра передана функция Example, вычисляющая
синус}
Writeln(‘ Int=’, Int);
end.
В моем решении ошибка в теле function Integral:
начальное условие
s:=(f(a)+f(b))/2;