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

Подпрограмма:  QS60R (модуль QS60R_p)

Назначение

Вычисление определенного трехкратного интеграла по тpехмеpному прямоугольному параллелепипеду.

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

QS60R вычисляет s - кратный (s = 3) интеграл по s - меpному прямоугольному параллелепипеду с заданной абсолютной погрешностью.

Заменой переменных данный s - мерный прямоугольный параллелепипед переводится в единичный куб G, и интеграл вычисляется по этому кубу. B основу метода положены кубатурные формулы pазличной точности:

     Q1(s), Q2(s), Q3(s) . 

Куб G разбивается на 2s равных кубов Gk (k = 1, 2, ..., 2s). По каждому из Gk от подинтегральной функции вычисляются Q1 (s) и Q2 (s) и проверяется условие Is*| Q2 (s) - Q1 (s) | > E , где Is - якобиан исходной замены переменных, E - абсолютная погрешность вычислений. Если это условие не выполнено, то за приближенное значение интеграла по Gk принимается Q3(s), если же для Gk это условие выполняется, то весь процесс снова повторяется для этого Gk.

Если при дроблении кубов наступит момент, когда об'ем какого - либо куба будет машинным нулем, то интеграл для этого куба полагается равным нулю и вычисления продолжаются для следующего куба Gk.

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

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

procedure QS60R(var RINT :Real; var A1 :Array of Real;
                var A2 :Array of Real; F :Func_F1A; EPS :Real;
                var IERR :Integer);

Параметры

RINT - вычисленное значение интеграла (тип: вещественный);
A1 - вещественный вектоp длины 3, в котоpом задаются нижние пределы интегрирования;
A2 - вещественный вектоp длины 3, в котоpом задаются верхние пределы интегрирования;
F - имя вещественной подпрограммы - функции вычисления подинтегральной функции;
EPS - заданная абсолютная погрешность вычисления интеграла (тип: вещественный);
IERR - целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы (см. "Замечания по использованию").

Версии: нет

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

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

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

 

Пользователь должен задавать значение EPS абсолютной погрешности вычисления интеграла на шаге. Для гладких функций полная погрешность приближенного значения интеграла будет  o (EPS). В случае не гладких или очень хоpоших функций полная погрешность может значительно отличаться от величины EPS. Для вычисления истинной погрешности можно просчитать интеграл для различных значений EPS.

Подпрограмма ориентирована на вычисление интегралов от функций, определенных всюду в области интегрирования за исключением конечного числа точек. В точках, где функция не определена (например, обращается в бесконечность) ее необходимо доопределить каким - либо значением (например, положить равной нулю).

При работе подпрограммы может произойти следующее событие (назовем это событие V): при дроблении кубов об'ем какого - либо куба будет машинным нулем. в этом случае работа программы не прекращается: интеграл для этого куба полагается равным нулю, вычисления продолжаются для следующего куба и переменной IERR присваивается значение 65. Если же при работе программы событие V не произошло ни разу, то переменной IERR присваивается значение нуль. Таким образом, знание на выходе программы значения IERR дает возможность пользователю контpолировать точность вычисления интеграла.

Возможны случаи, когда аргумент функции за счет погрешности округления выйдет за границу области интегрирования. Поэтому, иногда, разумно доопределить функцию в окрестности граничной точки нулем, при этом достаточно взять радиус окрестности равным 10 - 9.

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

Unit TQS60R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQS60R_p, QS60R_p;

function TQS60R: String;

implementation

function TQS60R: String;
var
IERR,_i :Integer;
RINT,EPS :Real;
A1 :Array [0..2] of Real;
A2 :Array [0..2] of Real;
begin
Result := '';  { результат функции }
A1[0] := 0.0;
A1[1] := 0.0;
A1[2] := 0.0;
A2[0] := 1.0;
A2[1] := 2.0;
A2[2] := 3.0;
ЕРS := 0.001;
QS60R(RINT,A1,A2,FQS60R,EPS,IERR);
RЕSUlt := Result + #$0D#$0A;
fОR _i:=0 to 2 do
 begin
  Result := Result + Format('%20.16f ',[A1[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + #$0D#$0A;
for _i:=0 to 2 do
 begin
  Result := Result + Format('%20.16f ',[A2[_i]]);
  if ( ((_i+1) mod 3)=0 )
   then Result := Result + #$0D#$0A;
 end;
Result := Result + #$0D#$0A;
Result := Result + Format('%20.16f %10d ',[RINT,IERR]) + #$0D#$0A;
UtRes('TQS60R',Result);  { вывод результатов в файл TQS60R.res }
exit;
end;

end.

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

function FQS60R( X :Array of Real): Real;

implementation

function FQS60R( X :Array of Real): Real;
begin
{ Result - прототип имени функции FQS60R на FORTRANe }
Result := 3*(IntPower(X[0],2)+IntPower(X[1],2)+IntPower(X[2],2));
exit;
end;

end.

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