Текст подпрограммы и версий
qs19r_p.zip  qs19e_p.zip 
Тексты тестовых примеров
tqs19r_p.zip  tqs19e_p.zip 

Подпрограмма:  QS19R (модуль QS19R_p)

Назначение

Вычисление определенного интеграла от осциллирующих функций методом Лонгмана.

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

Пусть отрезку [A, B], A ≤ B, принадлежат  n0 + 1 нулей  x0, x1,..., xn0 функции  f (x),  n0 ≥ 2. По квадратурной формуле Гаусса с 32 узлами вычисляются интегралы по отрезкам [A, x0] и [xn0, B], затем вычисляются интегралы

                                 B1
           Vi  =  (- 1) i    ∫   f (x) dx ,
                              A1
 где     A1  =  x i  ,
           B1  =  x i +1  ,
           ( i = 0, 1, ..., k - 1, n0 - k, n0 - k + 1, ... , n0 - 1 )  , 

и за значение интеграла по отрезку [x0, xn0] принимается сумма

            k-1 
(1)        ∑    [(- 1)i Δi V0 +  (- 1)n0 - 1 Δi Vn0 - i - 1 ] / 2i +1  ,           
            i =0 

причем значение  k  выбирается подпрограммой в соответствии с заданной величиной абсолютной погрешности  Е.

Longman I.M. A Method for the Numerical Evaluation of Finite Integrals of Oscillatory Functions. - Math. Comput., 1960, Vol.14, N 69, p.53 - 59.

Жилейкин Я.М., Кукаркин А.Б. Приближенное вычисление интегралов от быстроосциллирующих функций - М.: Изд - во Моск. ун - та, 1987.

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

procedure QS19R(var RINT :Real; A :Real; B :Real; F :Func_F1; E :Real;
                L :Integer; var XA :Array of Real;
                var XB :Array of Real; var RA :Array of Real;
                var RB :Array of Real; var IERR :Integer);

Параметры

RINT - вещественная переменная, содержащая вычисленное значение интеграла;
A, B - заданные нижний и верхний пределы интегрирования соответственно, A ≤ B (тип: вещественный);
F - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию  f (x);
E - заданная абсолютная погрешность вычисления интеграла (тип: вещественный);
L - параметр, равный  m + 1, где  m - определяемое пользователем максимально допустимое число членов суммы (1),  L ≥ 3 (тип: целый);
XA - вещественный одномерный массив длины  L, содержащий   L последовательных нулей функции  f (x), принадлежащих отрезку интегрирования, которые расположены в порядке возрастания, начиная с наименьшего;
XB - вещественный одномерный массив длины  L, содержащий   L последовательных нулей функции  f (x), принадлежащих отрезку интегрирования, которые расположены в порядке убывания, начиная с наибольшего;
RA, RB - вещественные одномерные массивы длины  L, используемые как рабочие;
IERR - целая переменная для диагностических сообщений; при этом:
IERR=65 - если заданная точность не может быть достигнута при заданном  L.

Версии

QS19E - вычисление с расширенной (Extended) точностью определенного интеграла от осциллирующих функций методом Лонгмана.

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

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

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

  Параметр  L пользователь может задавать достаточно произвольно; чем больше  L, тем больше шансов, что заданная точность будет достигнута, но и тем больше места будет занято программой в памяти машины.

  В подпрограмме QS19E параметры RINT, A, B, F, E, XA, XB, RA, RB имеют тип Extended.

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

Unit TQS19R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQS19R_p, QS19R_p;

function TQS19R: String;

implementation

function TQS19R: String;
var
L,I,IERR :Integer;
A,B,E,RINT :Real;
ХА :Array [0..19] of Real;
ХВ :Array [0..19] of Real;
RA :Array [0..19] of Real;
RB :Array [0..19] of Real;
label
_1;
begin
Result := '';  { результат функции }
A := -100.0;
B := 100.0;
E := 1.E-3;
L := 20;
for I:=1 to 20 do
 begin
  XB[I-1] := 0.3141592654*(319-I);
_1:
  XA[I-1] := -XB[I-1];
 end;
QS19R(RINT,A,B,FQS19R,E,L,XA,XB,RA,RB,IERR);
Result := Result + Format('%20.7f %10d ',[RINT,IERR]) + #$0D#$0A;
UtRes('TQS19R',Result);  { вывод результатов в файл TQS19R.res }
exit;
end;

end.

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

function FQS19R(X :Real): Real;

implementation

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

end.

Результаты:    RINT = - 11.2310439137 ,    IERR  =  0