Текст подпрограммы и версий
qsf5r_p.zip 
Тексты тестовых примеров
tqsf5r_p.zip 

Подпрограмма:  QSF5R (модуль QSF5R_p)

Назначение

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

             B
(1)         ∫  f (x) sin(w g(x)) dx    и
            A
             B
(2)         ∫  f (x) cos(w g(x)) dx
            A 

с заданной абсолютной погрешностью по формулам интерполяционного типа, точным для многочленов второй степени с весом  exp ( i (px2 + qx) ).

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

Первоначально отрезок интегрирования [A, B] разбивается на k равных частичных отрезков. Hа каждом из частичных отрезков Δk функция wg (x) заменяется интерполяционным многочленом Лагранжа второй степени Pk2 (x), и для вычисления

      ∫  f(x) exp( i Pk2(x) ) dx
    Δk 

применяется квадратурная формула интерполяционного типа, точная для многочленов второй степени с весом  exp ( i Pk2 (x) ) .

Полученные значения интеграла по всем частичным отрезкам суммируются. Аналогичные вычисления проводятся для удвоенного числа частичных отрезков. Если модуль разности приближенных значений интегралов по этим двум разбиениям не превосходит заданной величины E, то счет заканчивается, и за значения интегралов принимаются результаты последнего расчета. В противном случае число частичных отрезков снова удваивается, и процесс повторяется. Если число частичных отрезков разбиения становится больше 524288, то вычисления заканчиваются.

Я.М.Жилейкин, А.Б.Кукаркин. O вычислении интегралов от быстроосциллирующих функций. Сб. "Вычисл. методы и программиpование", вып. 26, Изд-во МГУ, 1977, 57-67.

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

procedure QSF5R(var RINT1 :Real; var RINT2 :Real; A :Real; B :Real;
                F :Func_F1; G :Func_F1; W :Real; E :Real; var K :Integer;
                L1 :Integer; L2 :Integer; var IERR :Integer);

Параметры

       RINT1 -
       RINT2  
вещественные переменные, содержащие вычисленные значения интегралов (1) и (2) соответственно;
A, B - заданные нижний и верхний пределы интегрирования соответственно (тип: вещественный);
F - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x);
G - имя вещественной подпрограммы - функции, вычисляющей функцию  g(x);
W - заданное значение параметра  w (тип: вещественный);
E - заданная абсолютная погрешность вычисления интегралов (тип: вещественный);
K - целая переменная, задающая начальное число частичных отрезков разбиения (K ≤ 524288);
L1, L2 - задают режим работы подпрограммы (тип: целый); при этом, если:
 

L1 = 1 и L2 = 0, то вычисляется интеграл (1);

L1 = 0 и L2 = 1, то вычисляется интеграл (2);

L1 = 1 и L2 = 1, то вычисляются интегралы (1) и (2);
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
IERR = 65 - когда заданная точность не может быть достигнута при максимально возможном числе удвоений отрезков разбиения.

Версии: нет

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

UTQS11 - подпрограмма выдачи диагностических сообщений при работе подпрограммы QSF5R.

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

 

При E ≤ 0 происходит только один расчет с заданным K.

Если заданная точность не может быть достигнута, то RINT1 и RINT2 полагаются равными результатам последнего расчета, а подпрограмма UTQS11 выдает сообщение: "заданная точность не может быть достигнута".

При выходе из подпрограммы значение K полагается равным числу частичных отрезков разбиения, при котоpом проводился последний просчет интегралов.

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

Unit TQSF5R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQSF5R_p, FGQSF5R_p, QSF5R_p;

function TQSF5R: String;

implementation

function TQSF5R: String;
var
K,L1,L2,IERR :Integer;
A,B,W,E,S1,S2,CR,SR,CI,SI :Real;
begin
Result := '';  { результат функции }
A := -2.0;
B := -5.0;
W := -100.0;
E := 1.E-5;
K := 1;
L1 := 1;
L2 := 1;
QSF5R(CI,SI,A,B,FQSF5R,FGQSF5R,W,E,K,L1,L2,IERR);
S1 := W*Sin(-5.0);
S2 := W*Sin(-2.0);
CR := (Sin(S1)-Sin(S2))/W;
SR := (Cos(S2)-Cos(S1))/W;
Result := Result + Format('%20.16f %20.16f %20.16f %20.16f %8d %8d ',
 [CI,CR,SI,SR,K,IERR]) + #$0D#$0A;
UtRes('TQSF5R',Result);  { вывод результатов в файл TQSF5R.res }
exit;
end;

end.

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

function FQSF5R(X :Real): Real;

implementation

function FQSF5R(X :Real): Real;
begin
{ Result - прототип имени функции FQSF5R на FORTRANe }
Result := Cos(X);
exit;
end;

end.

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

function FGQSF5R(X :Real): Real;

implementation

function FGQSF5R(X :Real): Real;
begin
{ Result - прототип имени функции FGQSF5R на FORTRANe }
Result := Sin(X);
exit;
end;

end.

Результаты:
      
      RINT1  =  0.0091068968
      RINT2  =  0.0117280441

      K  =  256
      IERR  =  0