На интегрирование методом Симпсона(только чтоб все переменные были как у меня):
Код:
function Simpson(A, B: double; N: cardinal; Func: TFunction): double;
var
h: double;
X: double;
K: double;
I: Integer;
begin
h := 0.5 * (B - A) / N;
Result := Func(A);
X := A + h;
for I := 1 to 2 * N - 1 do
begin
if I mod 2 = 0 then
K := 2
else
K := 4;
Result := Result + K * Func(X);
X := X + h;
end;
Result := h * (Result+Func(B)) / 3;
end;
На метод трапеций(только чтоб все переменные были как у меня):
Код:
function TrapezeInt(a, b: double; eps: double; IntF: TIntFunc):double;
var
//S - площадь на предыдущей итерации,
//x - текущее значение аргумента
//base - высота трапеции
//n - число трапеций, удваивается на каждой итерации
S, x, base: double;
i, n: Integer;
begin
//Сначала приближение одной трапецией
base := b - a;
Result := (IntF(a) + IntF(b)) / 2 * base;
eps := eps / 10; //Вообще говоря, величина делителя зависит от функции
n := 1;
repeat
S := Result;
base := base / 2;
n := n * 2;
//Новая площадь вычисляется на основе старой
Result := Result / 2;
//Ниже - просто вычисляем площади новых трапеций
for i := 1 to n div 2 do
begin
x := a + base * (i * 2 - 1);
Result := Result + IntF(x) * base;
end;
until abs(S - Result) <= eps;
end;
Admin: Используем теги для оформления кода, иначе последуют санкции!
Большое спасибо заранее =))