|
Текст подпрограммы и версий qs19r_p.zip qs19e_p.zip |
Тексты тестовых примеров tqs19r_p.zip tqs19e_p.zip |
Вычисление определенного интеграла от осциллирующих функций методом Лонгмана.
Пусть отрезку [A, B], A ≤ B, принадлежат n0 + 1 нулей x0, x1,..., xn0 функции f (x), n0 ≥ 2. По квадратурной формуле Гаусса с 32 узлами вычисляются интегралы по отрезкам [A, x0] и [xn0, B], затем вычисляются интегралы
B1
Vi = (- 1) i ∫ f (x) dx ,
A1
где A1 = x i ,
B1 = x i +1 ,
( i = 0, 1, ..., k - 1, n0 - k, n0 - k + 1, ... , n0 - 1 ) ,
и за значение интеграла по отрезку [x0, xn0] принимается сумма
k-1
(1) ∑ [(- 1)i Δi V0 + (- 1)n0 - 1 Δi Vn0 - i - 1 ] / 2i +1 ,
i =0
причем значение k выбирается подпрограммой в соответствии с заданной величиной абсолютной погрешности Е.
Longman I.M. A Method for the Numerical Evaluation of Finite Integrals of Oscillatory Functions. - Math. Comput., 1960, Vol.14, N 69, p.53 - 59.
Жилейкин Я.М., Кукаркин А.Б. Приближенное вычисление интегралов от быстроосциллирующих функций - М.: Изд - во Моск. ун - та, 1987.
procedure QS19R(var RINT :Real; A :Real; B :Real; F :Func_F1; E :Real;
L :Integer; var XA :Array of Real;
var XB :Array of Real; var RA :Array of Real;
var RB :Array of Real; var IERR :Integer);
Параметры
| RINT - | вещественная переменная, содержащая вычисленное значение интеграла; |
| A, B - | заданные нижний и верхний пределы интегрирования соответственно, A ≤ B (тип: вещественный); |
| F - | имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x); |
| E - | заданная абсолютная погрешность вычисления интеграла (тип: вещественный); |
| L - | параметр, равный m + 1, где m - определяемое пользователем максимально допустимое число членов суммы (1), L ≥ 3 (тип: целый); |
| XA - | вещественный одномерный массив длины L, содержащий L последовательных нулей функции f (x), принадлежащих отрезку интегрирования, которые расположены в порядке возрастания, начиная с наименьшего; |
| XB - | вещественный одномерный массив длины L, содержащий L последовательных нулей функции f (x), принадлежащих отрезку интегрирования, которые расположены в порядке убывания, начиная с наибольшего; |
| RA, RB - | вещественные одномерные массивы длины L, используемые как рабочие; |
| IERR - | целая переменная для диагностических сообщений; при этом: |
| IERR=65 - | если заданная точность не может быть достигнута при заданном L. |
Версии
| QS19E - | вычисление с расширенной (Extended) точностью определенного интеграла от осциллирующих функций методом Лонгмана. |
Вызываемые подпрограммы
| UTQS11 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы QS19R. |
| UTQS13 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы QS19E. |
Замечания по использованию
| Параметр L пользователь может задавать достаточно произвольно; чем больше L, тем больше шансов, что заданная точность будет достигнута, но и тем больше места будет занято программой в памяти машины. | |
| В подпрограмме QS19E параметры RINT, A, B, F, E, XA, XB, RA, RB имеют тип Extended. |
Unit TQS19R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQS19R_p, QS19R_p;
function TQS19R: String;
implementation
function TQS19R: String;
var
L,I,IERR :Integer;
A,B,E,RINT :Real;
ХА :Array [0..19] of Real;
ХВ :Array [0..19] of Real;
RA :Array [0..19] of Real;
RB :Array [0..19] of Real;
label
_1;
begin
Result := ''; { результат функции }
A := -100.0;
B := 100.0;
E := 1.E-3;
L := 20;
for I:=1 to 20 do
begin
XB[I-1] := 0.3141592654*(319-I);
_1:
XA[I-1] := -XB[I-1];
end;
QS19R(RINT,A,B,FQS19R,E,L,XA,XB,RA,RB,IERR);
Result := Result + Format('%20.7f %10d ',[RINT,IERR]) + #$0D#$0A;
UtRes('TQS19R',Result); { вывод результатов в файл TQS19R.res }
exit;
end;
end.
Unit FQS19R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
function FQS19R(X :Real): Real;
implementation
function FQS19R(X :Real): Real;
begin
{ Result - прототип имени функции FQS19R на FORTRANe }
Result := X*Sin(10.0*X);
exit;
end;
end.
Результаты: RINT = - 11.2310439137 , IERR = 0