|
Текст подпрограммы и версий qs15r_p.zip qs15e_p.zip |
Тексты тестовых примеров tqs15r_p.zip tqs15e_p.zip |
Вычисление определенного интеграла от векторной функции по формулам Гаусса.
Подпрограмма 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 должен иметь вид: | |
| 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