Вычисление определенного интеграла методом левых и правых прямоугольников с заданной точностью
Автор: Алексей Глеб
WEB-сайт: http://delphibase.endimus.com
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Вычисление определенного интеграла методом левых и правых
прямоугольников с заданной точностью
"Просто расчет площади под функцией, параметры: a,b - пределы интегрирования, a<=b
eps - допустимая погрешность, практически гарантируется, что расхождение результата
с истинным значением интеграла не превосходит по модулю указанную величину.
Только не переборщите :-))
intF - подинтегральная функция. Естественно, желательно задавать функции,
интегрируемые в смысле Римана. Объявление смотри в примере.
Примечание: Несобственные интегралы не считаем :-)
Проверок на переполнение нет, да и вообще нет проверок..."
(Romkin (Москва))
Модуль сделан на основе функции вычисления опред.
интеграла методом трапеций от Romkin'а (Москва).
Зависимости: Нет
Автор: Алексей Глеб, noodlesf@mail.ru, Чернигов
Copyright: с подачи Romkin'а (Москва)
Дата: 18 мая 2003 г.
***************************************************** }
unit IntPram;
interface
type
TIntFunc = function(X: Double): Double;
function LeftPramInt(a, b: Double; eps: Double; IntF: TIntFunc): Double;
function RightPramInt(a, b: Double; eps: Double; IntF: TIntFunc): Double;
implementation
function LeftPramInt(a, b: Double; eps: Double; IntF: TIntFunc): Double;
var
//S - площадь на предыдущей итерации,
//step - "толщина" прямоугольника
//gran - передвигаемая от a до b граница
//n - число прямоугольников, удваивается на каждой итерации
S, step, gran: Double;
n: integer;
begin
//Сначала приближение одного прямоугольника
step := b - a;
Result := IntF(a) * step;
n := 1;
repeat
S := Result;
n := n * 2;
step := (b - a) / n;
Gran := a;
Result := 0;
//Ниже - просто вычисляем площади новых прямоугольников
while gran < b do
begin
Result := Result + IntF(gran) * step;
gran := gran + step;
end;
until abs(S - Result) <= eps;
end;
function RightPramInt(a, b: Double; eps: Double; IntF: TIntFunc): Double;
var
//S - площадь на предыдущей итерации,
//step - "толщина" прямоугольника
//gran - передвигаемая от a до b граница
//n - число прямоугольников, удваивается на каждой итерации
S, step, gran: Double;
n: integer;
begin
//Сначала приближение одного прямоугольника
step := b - a;
Result := IntF(b) * step;
n := 1;
repeat
S := Result;
n := n * 2;
step := (b - a) / n;
Gran := b;
Result := 0;
//Ниже - просто вычисляем площади новых прямоугольников
while a < gran do
begin
Result := Result + IntF(gran) * step;
gran := gran - step;
end;
until abs(S - Result) <= eps;
end;
end.
Пример использования:
uses IntPram;
function IntSqrt(x: Double): Double;
begin
Result := Sqrt(x);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption := FloatToStr(LeftPramInt(0, Pi, 0.00001, S));
label2.Caption := FloatToStr(RightPramInt(0, Pi, 0.00001, S));
end;
|