Вычисление определенного интеграла методом левых и правых прямоугольников с заданной точностью
01.01.2007
{ **** UBPFD *********** by kladovka.net.ru **** >> Вычисление определенного интеграла методом левых и правых прямоугольников с заданной точностью "Просто расчет площади под функцией, параметры: 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;