Вычисление интеграла

Материал из DRKB


Вычисление интеграла с заданной точностью алгоритмом Симпсона.

// (c) Copydown 2002, all left reserved. http://world.fpm.kubsu.ru.

{$APPTYPE CONSOLE}

{$F+} // разрешение передачи функций, как параметров

type FunctionType = function(x: Real): Real;

{ интегрируемая функция }
function f(x: Real): Real;
begin
  Result := x;
end;

{ интегрирование от a до b функции f с точностью e }
function IntegralSimpson(a, b: Real; f: FunctionType; e: Real): Real;
var
  h, x, s, s1, s2, s3, sign: Real;
begin
  if (a = b) then
  begin
    Result := 0;
    exit
  end;

  if (a > b) then
  begin
    x := a;
    a := b;
    b := x;
    sign := -1
  end
  else
    sign := 1;

  h := b - a;
  s := f(a) + f(b);
  s2 := s;

  repeat
    s3 := s2;
    h := h/2;
    s1 := 0;
    x := a + h;
    repeat
      s1 := s1 + 2 * f(x);
      x := x + 2 * h;
    until (not (x < b));

    s := s + s1;
    s2 := (s + s1) * h / 3;
    x := abs(s3 - s2) / 15
  until (not (x > e));

  Result := s2 * sign;
end;

begin
  { вывод результата интегрирования от 0 до 1 функции f с точностью 0.001 }
  WriteLn(IntegralSimpson(0, 1, f, 0.001));
  WriteLn;
  WriteLn('Press Enter');
  ReadLn;
end.


Source: Взято с http://delphiworld.narod.ru
ID: 04199