Вычисление определённого интеграла методом Симпсона



Автор: Dimka Maslov
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> Вычисление определённого интеграла методом Симпсона
A, B - границы интегрирования
Eps - заданная относительная точность вычисления
F - подинтегральная функция
Зависимости: нет
Автор:       Dimka Maslov, [email protected]
Copyright:   Dimka Maslov
Дата:        26 ноября 2003 г.
***************************************************** }
type
TDoubleFunc = function(X: Double): Double;
function Integral(A, B, Eps: Double; F: TDoubleFunc): Double;
function InternalCalc(A, B: Double; F: TDoubleFunc; N: Integer): Double;
var
x, dx: Double;
i: Integer;
begin
dx := (B - A) / N;
Result := 0;
x := A;
for i := 1 to N do
begin
Result := Result + dx * (F(x) + 4 * F(x + dx / 2) + F(x + dx)) / 6;
x := x + dx;
end;
end;
var
N: Integer;
Prev: Double;
begin
Result := InternalCalc(A, B, F, 4);
N := 4;
repeat
Prev := Result;
N := N shl 1;
Result := InternalCalc(A, B, F, N);
until (Result = 0) or (Abs((Result - Prev) / Result) < Eps);
end;

Пример использования:

function F(X: Double): Double;
begin
Result := X * X * X;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption := FloatToStr(Integral(-10, 10, 0.00001, F));
end;

Далее: Вычисление площади одноконтурного несамопересекающегося многоугольника »»