Текст подпрограммы и версий
qs16r_p.zip  qs16e_p.zip 
Тексты тестовых примеров
tqs16r_p.zip  tqs16e_p.zip 

Подпрограмма:  QS16R (модуль QS16R_p)

Назначение

 Вычисление интегралов вида
                  B
(1)             ∫  f (x) sin( p x2 + q x + r ) dx ,
                A
                  B
(2)             ∫  f (x) cos( p x2 + q x + r ) dx
                A 

с заданной абсолютной погрешностью по формулам интерполяционного типа 3 - й степени точности.

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

Отрезок интегрирования [A, B] разбивается на K равных частичных отрезков; на каждом из них интегралы вычисляются по формулам интерполяционного типа 3 - й степени точности.
Полученные значения интеграла по всем частичным отрезкам суммируются.
Аналогичные вычисления проводятся для удвоенного числа частичных отрезков.

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

Если число частичных отрезков разбиения становится больше 524288, то вычисления заканчиваются.

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

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

procedure QS16R(var RINT1 :Real; var RINT2 :Real; A :Real; B :Real;
                F :Func_F1; P :Real; Q :Real; R :Real; E :Real;
                var K :Integer; L1 :Integer; L2 :Integer;
                var IERR :Integer);

Параметры

       RINT1 -
       RINT2  
вещественные переменные, содержащие вычисленные значения интегралов (1) и (2) соответственно;
A, B - заданные нижний и верхний пределы интегрирования соответственно (тип: вещественный);
F - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x);
P, Q, R - заданные значения параметров p, q, r соответственно (тип: вещественный);
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 - когда заданная точность не может быть достигнута при максимально возможном числе удвоений отрезков разбиения.

Версии

QS16E - вычисление с расширенной (Extended) точностью интегралов вида (1) и (2) с заданной абсолютной погрешностью по формулам интерполяционного типа 3 - й степени точности.

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

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

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

 

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

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

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

В подпрограмме QS16E параметры RINT1, RINT2, A, B, F, P, Q, R, E имеют тип Extended.

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

Unit TQS16R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQS16R_p, QS16R_p;

function TQS16R: String;

implementation

function TQS16R: String;
var
K,L1,L2,IERR :Integer;
A,B,E,P,Q,R,RINT1,RINT2 :Real;
BЕGin
Result := '';  { результат функции }
A := -1.0;
B := 1.0;
P := 200.0;
Q := -100.0;
R := 0.0;
E := 1.E-7;
K := 1;
L1 := 1;
L2 := 1;
QS16R(RINT1,RINT2,A,B,FQS16R,P,Q,R,E,K,L1,L2,IERR);
Result := Result + Format('%16.7f %16.7f %10d %10d ',
[RINT1,RINT2,K,IERR]) + #$0D#$0A;
end;

end.

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

function FQS16R(X :Real): Real;

implementation

function FQS16R(X :Real): Real;
var
A,B,E,FQS16R :Real;
begin
{ Result - прототип имени функции FQS16R на FORTRANe }
Result := 4.0*X-1.0;
exit;
end;

end.

Результаты:

      RINT1  =  -0.0088441549
      RINT2  =  0.0049339020

      K  =  2
      IERR  =  0