Текст подпрограммы и версий
qsf1r_p.zip  qsf1e_p.zip 
Тексты тестовых примеров
tqsf1r_p.zip  tqsf1e_p.zip 

Подпрограмма:  QSF1R (модуль QSF1R_p)

Назначение

 Вычисление интегралов вида
             B
(1)        ∫  f (x) SIN (ρx + φ) dx ,
           A 
             B
(2)        ∫  f (x) COS (ρx + φ) dx 
           A 

по формулам интерполяционного типа 5 - й степени точности.

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

QSF1R вычисляет интегралы (1), (2) или один из них с заданной абсолютной погрешностью  E по формулам интерполяционного типа 5 - й степени точности с фиксированным распределением узлов.

Весь отрезок интегрирования  A, B разбивается на  K равных частичных отрезков; к каждому отрезку применяются формулы интерполяционного типа. Полученные значения интеграла по всем частичным отрезкам суммируются.

Л.Г.Васильева. Набор стандартных программ численного интегрирования с фиксированным распределенем узлов. Сб. "Численный анализ на ФОРТРАНе", вып.8, Изд - во МГУ, 1974.

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

procedure QSF1R(var RINT1 :Real; var RINT2 :Real; A :Real; B :Real;
                F :Func_F1; RO :Real; FI :Real; E :Real; var K :Integer;
                L1 :Integer; L2 :Integer; var IERR :Integer);

Параметры

       RINT1 -
       RINT2  
вещественные переменные, содержащие вычисленные значения интегралов (1) и (2) соответственно;
A, B - заданные нижний и верхний пределы интегрирования (тип: вещественный);
F - имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию  f (x);
RO - заданное значение параметра  ρ (тип: вещественный);
FI - заданное значение параметра  φ (тип: вещественный);
E - заданная абсолютная погрешность вычисления интегралов (тип: вещественный);
K - целая переменная, задающая число частичных отрезков разбиения;
L1, L2 - задают режим работы подпрограммы (тип: целый); при этом: если
L1=1,L2=0 - вычисляется интеграл (1);
L1=0,L2=1 - вычисляется интеграл (2);
L1=1,L2=1 - вычисляются интегралы (1) и (2);
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом:
IERR=65 - когда заданная точность не может быть достигнута при максимально возможном числе частичных отрезков разбиения; значение  K полагается равным 1048576.

Версии

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

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

UTQS10 - подпрограмма выдачи диагностических сообщений при работе подпрограммы QSF1R.
UTQS12 - подпрограмма выдачи диагностических сообщений при работе подпрограммы QSF1E.

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

 

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

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

Максимальное значение  K, котоpое можно задавать, не должно превосходить 524288. Если заданная точность не может быть достигнута, то K полагается равным 1048576.

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

В подпрограмме QSF1E параметры RINT1, RINT2, A, B, F, RO, FI, E имеют тип Extended.

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

Unit TQSF1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQSF1R_p, QSF1R_p;

function TQSF1R: String;

implementation

function TQSF1R: String;
var
K,L1,L2,IERR :Integer;
A,B,RO,FI,E,RINT1,RINT2 :Real;
begin
Result := '';  { результат функции }
A := 0.0;
B := 1.0;
K := 1;
Е := -1.E-7;
L1 := 1;
L2 := 1;
RO := 10.0;
FI := 0.0;
QSF1R(RINT1,RINT2,A,B,FQSF1R,RO,FI,E,K,L1,L2,IERR);
Result := Result + Format('%s',[' RINT1=']);
Result := Result + Format('%20.16f ',[RINT1]);
Result := Result + Format('%s',[' RINT2=']);
Result := Result + Format('%20.16f ',[RINT2]);
Result := Result + Format('%s',[' K=']);
Result := Result + Format('%7d ',[K]);
Result := Result + Format('%s',[' IERR=']);
Result := Result + Format('%5d ',[IERR]) + #$0D#$0A;
UtRes('TQSF1R',Result);  { вывод результатов в файл TQSF1R.res }
exit;
end;

end.

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

function FQSF1R(X :Real): Real;

implementation

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

end.

Результаты:

       RINT1  =    0.053824477954
       RINT2  =  - 0.079553512319

       K  =  2
       IERR  =  0