Текст подпрограммы и версий
qs15r_p.zip  qs15e_p.zip 
Тексты тестовых примеров
tqs15r_p.zip  tqs15e_p.zip 

Подпрограмма:  QS15R (модуль QS15R_p)

Назначение

Вычисление определенного интеграла от векторной функции по формулам Гаусса.

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

Подпрограмма QS15R вычисляет интеграл
           B
           ∫ F (x) dx
          A
от векторной функции   F (x) = ( f1 (x), ... , fN (x) )
с покомпонентной погрешностью
                         B
      ЕРS ( 1 + |  ∫  fi (x) dx | )
                        A 

по квадратурным формулам Гаусса с разбиением основного отрезка интегрирования на частичные.

Точность может достигаться как за счет удвоения числа частичных отрезков разбиения при фиксированном числе узлов квадратурной формулы, применяемой на каждом частичном отрезке, так и за счет увеличения числа узлов квадратурной формулы при фиксированном числе отрезков разбиения.

Я.М.Жилейкин, М.В.Соколовский. Набор стандартных программ для вычисления интегралов от векторных функций, Сб. "Методы и алгоритмы в численном анализе", Изд-во МГУ, 1981 г.

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

procedure QS15R(var RINT :Array of Real; A :Real; B :Real; F :Proc_F3_A;
                NM :Integer; EPS :Real; K :Integer; NG :Integer;
                L :Integer; var IND :Array of Integer;
                var R :Array of Real; var IERR :Integer);

Параметры

RINT - вещественный вектоp длины N, содержащий вычисленные значения интегралов;
A, B - заданные нижний и верхний пределы интегрирования (тип: вещественный);
F - имя подпрограммы, вычисляющей подинтегральные функции;
N - размерность вектоpа - функции F (x) (тип: целый);
EPS - заданная меpа погрешности вычисления интеграла (тип: вещественный);
K - целая переменная, задающая начальное число частичных отрезков разбиения;
NG - целая переменная, задающая начальное число узлов квадратурной формулы;
L - задает режим работы подпрограммы (тип: целый); при этом, если:
L = 0 - то заданная точность достигается за счет увеличения числа частичных отрезков разбиения при заданном NG;
L ≥ 1 - то заданная точность достигается за счет увеличения числа узлов квадратурной формулы при заданном K;
IND - целый вектоp длины N, каждая компонента которого pавна при:
L = 0 - числу частичных отрезков разбиения, при котоpом достигается заданная точность по этой компоненте;
L ≥ 1 - числу узлов квадpатуной фоpмулы, пpи котоpом достигается заданная точность по этой компоненте;
R - вещественный рабочий вектоp длины 2N;
IERR - целая переменная, служащая для диагностических сообщений:
IERR = 65 - когда заданная точность не может быть достигнута при максимально возможном числе узлов квадратурной формулы (96);
IERR = 66 - если заданное число узлов квадратурной формулы не является допустимым;
IERR = 67 - если заданная точность не может быть достигнута при максимально возможном числе (1048576) частичных отрезков разбиения.

Версии

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

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

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

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

  1. 

Число узлов квадратурной формулы может принимать лишь следующие допустимые значения 2, 4, 6, 8, 10, 12, 16, 24, 32, 48, 64, 96.

  2. 

Первый оператор подпрограммы F должен иметь вид:

procedure F (X :Real; var Y :Array of Real; I :Array of Integer);
Здесь:
X - аргумент функции F (тип: вещественный);
Y - вещественный вектоp длины N вычисленных значений функции F;
I - целый вектоp длины N; если его i - ая компонента отлична от нуля, то интеграл от этой компоненты функции F не вычисляется.

  3. 

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

  4. 

Вычисление интеграла от отдельной компоненты прекращается как только по этой компоненте достигается заданная точность.

  5. 

Если для каких - либо компонент векторной функции заданная погрешность интегрирования не может быть достигнута, то соответствующие компоненты вектоpа IND полагаются равными нулю.

  6. 

Погрешность определяется по модулю разности двух просчетов по M и 2*M частичным отрезкам разбиения при L = 0 либо по двум просчетам с различным, но следующим друг за другом, согласно указанному выше списку, числом узлов квадратурных формул при L ≥ 1.

  7.  В подпрограмме QS15E параметры RINT, A, B, F, E, EPS, R имеют тип Extended.

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

Unit TQS15R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQS15R_p, QS15R_p;

function TQS15R: String;

implementation

function TQS15R: String;
var
I,IERR :Integer;
RINT1 :Array [0..4] of Real;
RINT2 :Array [0..4] of Real;
R :Array [0..9] of Real;
IND1 :Array [0..4] of Integer;
IND2 :Array [0..4] of Integer;
label
_1;
begin
Result := '';  { результат функции }
QS15R(RINT1,0.0,1.0,FQS15R,5,1.E-7,2,4,0,IND1,R,IERR);
QS15R(RINT2,0.0,1.0,FQS15R,5,1.E-7,1,2,1,IND2,R,IERR);
FОR I:=1 to 5 do
 begin
  RЕsult := Result + Format(' %16.7f  %2d  %16.7f  %2d ',
 [RINT1[I-1],IND1[I-1],RINT2[I-1],IND2[I-1]]) + #$0D#$0A;
_1:
 end;
UtRes('TQS15R',Result);  { вывод результатов в файл TQS15R.res }
exit;
end;

end.

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

procedure FQS15R(X :Real; var Y :Array of Real; I :Array of Integer);

implementation

procedure FQS15R(X :Real; var Y :Array of Real; I :Array of Integer);
var
J :Integer;
label
_1;
begin
Y[0] := IntPower(X,6);
for J:=1 to 4 do
 begin
_1:
  Y[J+0] := Y[J-1]*X;
 end;
end;

end.

Результаты:

               RINT1                      IND1

      1.42857142855-01               2
      1.24999999998-01               2
      1.11111111108-01               4
      9.99999999985-02               8
      9.09090909076-02               8

               RINT2                      IND2

      1.42857142855-01               4
      1.24999999998-01               4
      1.11111111109-01               6
      9.99999999985-02               6
      9.09090909078-02               6

      IERR  =  0