Текст подпрограммы и версий
qsfpr_p.zip  qsfpe_p.zip 
Тексты тестовых примеров
tqsfpr_p.zip  tqsfpe_p.zip 

Подпрограмма:  QSFPR (модуль QSFPR_p)

Назначение

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

            B
     I =  ∫  [ cos(tx) RE F(x) - sin(tx) IM F(x) ] dx ,
          A 

где RE F (x) и  IM F (x) - действительная и мнимая части комплексной функции F(x) действительного переменного  x, на основе квадратурной формулы Филона.

Математическое описание

Подпрограмма QSFPR вычисляет интеграл I с заданной абсолютной или относительной точностью на основе квадратурной формулы Филона [1], в которой плотность подынтегральной функции F (x) вычисляется в девяти равноотстоящих точках каждого подинтервала.

При делении подинтервала узлы и значения функции F (x) запоминаются для последующего использования [2].

1.  Справочник по специальным функциям. Под ред. М.А.Абрамовица и И.Стиган. - M.: Hаука, 1979, 832 с.
2.  Форсайт Дж., Малькольм M., Моулер K. Машинные методы математических вычислений. - M.: Мир, 1980, 280 с.

Использование

procedure QSFPR(FUN :Func_F1; A :Real; B :Real; ABSERR :Real;
                RELERR :Real; T :Real; var RESULT_ :Real;
                var ERREST :Real; var NOFUN :Integer; var FLAG :Real);

Параметры

FUN - имя комплексной подпрограммы - функции, вычисляющей плотность F (x) подынтегральной функции;
A, B - заданные нижний и верхний пределы интегрирования (тип: вещественный);
ABSERR - заданная абсолютная погрешность вычисления интеграла (тип: вещественный);
RELERR - заданная относительная погрешность вычисления интеграла (тип: вещественный);
T - заданное значение параметра  t (тип: вещественный);
RESULT_ - приближение к интегралу, удовлетворяющее менее жесткой из двух границ погрешности (тип: вещественный);
ERREST - оценка погрешности вычисленного значения интеграла (тип: вещественный);
NOFUN - число вычисленных значений плотности подынтегральной функции F (x), потребовавшихся для получения результата (тип: целый);
FLAG - индикатор надежности:
если FLAG = 0, то RESULT_, вероятно, удовлетворяет заданной погрешности,
если FLAG = XXX.YYY, то XXX - число интегралов, на которых не удалось достигнуть заданной точности, а 0.YYY = (B - X0)/(B - A) - граница отрезка [A, X0], на котоpом был израсходован лимит обращений к подпрограмме, вычисляющей функцию FUN.

Версии

QSFPE - вычисление этих же интегралов в режиме расширенной (Extended) точности.

Вызываемые подпрограммы: нет

Замечания по использованию

     

Для подпрограммы QSFPE параметры A, B, T, ER, EA, RINT, FLAG, ERREST, а также параметр X, из подпрограммы  FUN имеют тип Extended.

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

              π                                 π     
          (   ∫  sin10x F(x) dx    =   ∫  sin10x sin x/2 dx  )
              0                                0

Unit TQSFPR_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQSFPR_p, QSFPR_p;

function TQSFPR: String;

implementation

function TQSFPR: String;
var
NOFUN :Integer;
PI,ER,EA,A,T,B,RINT,ERREST,FLAG :Real;
begin
Result := '';  { результат функции }
PI := 3.1415926;
ER := 1.E-5;
ЕА := 0.0;
A := 0.0;
T := 10.0;
B := PI;
QSFPR(FQSFPR,A,B,EA,ER,T,RINT,ERREST,NOFUN,FLAG);
Result := Result + Format(' %20.16f  %20.16f  %20.16f  %20.16f %5d ',
 [RINT,FLAG,ERREST,B,NOFUN]) + #$0D#$0A;
UtRes('TQSFPR',Result);  { вывод результатов в файл TQSFPR.res }
exit;
end;

end.

Unit fqsfpr_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;

function fqsfpr(X :Real): Complex;

implementation

function fqsfpr(X :Real): Complex;
var
ZI :Complex;
begin
{ Result - прототип имени функции FUN на FORTRANe }
ZI := Cmplx(0.0,1.0);
Result := MulC(SubC(Cmplx(0.0,0.0),ZI),Cmplx(Sin(X/2.0),0.0));
exit;
end;

end.

Результаты:

      RINT  =  -1.0025063 * 10-1
      
      NOFUN  =  417 
      FLAG  =  0
      ERREST  =  2.3 * 10-10