Подпрограмма: QS13R (модуль QS13R_p)
Назначение
Вычисление определенного интеграла по квадратурным формулам
Гаусса с разбиением основного отрезка интегрирования на
частичные.
Математическое описание
QS13R вычисляет интеграл
B
∫ f (x) dx
A
с заданной абсолютной погрешностью E по формулам Гаусса.
Отрезок интегрирования [A, B] разбивается на K равных
частичных отрезков, на каждом из которых применяется квадратурная
формула Гаусса с N узлами. Полученные значения интеграла по
всем частичным отрезкам суммируются.
Заданная точность достигается:
1.
|
За счет последовательного увеличения числа узлов
квадратурной формулы при фиксированном K.
|
2.
|
За счет удвоения числа частичных отрезков разбиения при
фиксированном N.
|
Счет заканчивается, если модуль разности приближенных
значений интеграла, полученных при двух последовательных
расчетах, не привосходит заданной величины E. За приближенное
значение интеграла принимается результат последнего расчета.
Л.Г.Васильева. Набор стандартных программ численного
интегрирования с фиксированным распределением узлов. Сб.
"Численный анализ на ФОРТРАНе", вып. 8, Изд-во МГУ, 1974.
Использование
procedure QS13R(var RINT :Real; A :Real; B :Real; F :Func_F1; E :Real;
var K :Integer; var N :Integer; L :Integer;
var IERR :Integer);
Параметры
RINT -
|
вещественная переменная, содержащая вычисленное
значение интеграла;
|
A, B -
|
заданные нижний и верхний пределы интегрирования
(тип: вещественный);
|
F -
|
имя вещественной подпрограммы - функции,
вычисляющей подинтегральную функцию f (x);
|
E -
|
заданная абсолютная погрешность вычисления
интеграла (тип: вещественный);
|
K -
|
целая переменная, задающая начальное число
частичных отрезков разбиения
(K ≤ 524288);
|
N -
|
целая переменная, задающая начальное число узлов
интегрирования; может принимать только следующие
значения: 2, 4, 6, 8, 10, 12, 16, 24, 32, 48, 64, 96;
|
L -
|
задает режим работы подпрограммы (тип: целый);
при этом, если:
|
L = 0 -
|
то заданная точность достигается за счет
увеличения N при фиксированном K;
|
L = 1 -
|
то заданная точность достигается за счет
увеличения K при фиксированном N;
|
IERR -
|
целая переменная, служащая для сообщения об
ошибках, обнаруженных в ходе работы подпрограммы;
при этом:
|
IERR = 65 -
|
когда заданная точность не может быть достигнута.
|
Версии: нет
Вызываемые подпрограммы
UTQS11 -
|
подпрограмма выдачи диагностических сообщений
при работе подпрограммы QS13R.
|
Замечания по использованию
|
При выходе из подпрограммы значение K полагается равным
числу частичных отрезков разбиения, при котоpом
проводился последний просчет интеграла.
|
Пример использования
Unit TQS13R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQS13R_p, QS13R_p;
function TQS13R: String;
implementation
function TQS13R: String;
var
K,N,L,IERR :Integer;
A,B,E,RINT :Real;
begin
Result := ''; { результат функции }
A := 1.0;
B := IntPower(2.718281828459,3);
E := 0.0001;
K := 1;
N := 2;
L := 0;
QS13R(RINT,A,B,FQS13R,E,K,N,L,IERR);
Result := Result + Format('%s',[' RINT=']);
RЕSUlt := Result + Format('%20.16f ',[RINT]);
Result := Result + Format('%s',[' N=']);
RЕSUlt := Result + Format('%10d ',[N]);
RЕSUlt := Result + Format('%s',[' K=']);
Result := Result + Format('%10d ',[K]) + #$0D#$0A;
Result := Result + Format('%s',[' IERR=']);
Result := Result + Format('%5d ',[IERR]) + #$0D#$0A;
UtRes('TQS13R',Result); { вывод результатов в файл TQS13R.res }
exit;
end;
end.
Unit FQS13R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
function FQS13R(X :Real): Real;
implementation
function FQS13R(X :Real): Real;
begin
{ Result - прототип имени функции FQS12R на FORTRANe }
Result := 1.0/(X*Sqrt(1.0+Ln(X)));
exit;
end;
end.
Результаты:
RINT = 1.9999999999
N = 32
K = 1
IERR = 0