|
Текст подпрограммы и версий qse1r_p.zip |
Тексты тестовых примеров tqse1r_p.zip |
Вычисление на равномерной сетке определенного интеграла от быстроосциллирующих функций по квадратурной формуле типа Эйлера.
Подпрограмма QSE1R вычисляет интеграл
a
∫ f(x) eiwx dx = J1M + i J2M , i = √-1
b
на равномерной сетке с помощью квадратурной формулы
интерполяционного типа, точной для многочленов четвертой степени с
весом e iwx .
M - число узлов интегрирования.
procedure QSE1R(var RINT :Array of Real; A :Real; B :Real; F :Func_F1;
R :Real; E :Real; var N :Integer; var IERR :Integer);
Параметры
| RINT - | вещественный вектоp длины 2 для вычисленных значений J1 (M) и J2 (M); |
| A, B - | заданные нижний и верхний пределы интегрирования (тип: вещественный); |
| F - | имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x); |
| R - | заданное значение параметра w (тип: вещественный); |
| E - | заданная абсолютная погрешность вычисления интеграла (тип: вещественный); |
| N - | целая переменная, задающая начальное число узлов интегрирования; |
| IERR - | целая переменная для диагностических сообщений: |
| IERR = 65 - | когда заданная точность не может быть достигнута при максимально возможном числе узлов (M = 1048576). |
Версии: нет
Вызываемые подпрограммы
| UTQS11 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы QSE1R. |
Замечания по использованию
| 1. |
При E ≤ 0 происходит только один просчет при заданном значении N. | |
| 2. |
Максимальное значение N, котоpое можно задавать, не должно превосходить 524288. | |
| 3. |
Если интеграл вычислен с точностью E, то IERR полагается равным нулю. | |
| 4. |
Если интеграл не может быть вычислен с точностью E, то выдается диагностическое сообщение "заданная точность не может быть достигнута". | |
| 5. | Если IERR = 65, то N полагается равным -1. |
Unit TQSE1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQSE1R_p, F2QSE1R_p, QSE1R_p;
function TQSE1R: String;
implementation
function TQSE1R: String;
var
IERR,N,_i :Integer;
A,B,R,E :Real;
RINT :Array [0..1] of Real;
begin
Result := ''; { результат функции }
A := -1.0;
B := 1.0;
R := -112.0;
E := 0.0000001;
N := 10;
QSE1R(RINT,A,B,FQSE1R,R,E,N,IERR);
Result := Result + #$0D#$0A;
FОR _i:=0 to 1 do
begin
RЕsult := Result + Format('%16.7f ',[RINT[_i]]);
IF ( ((_i+1) mod 2)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' IERR=']);
Result := Result + Format('%8d ',[IERR]);
Result := Result + Format('%s',[' N=']);
Result := Result + Format('%8d ',[N]) + #$0D#$0A;
N := 10;
QSE1R(RINT,-1.0,1.0,F2QSE1R,-112.0,0.0000001,N,IERR);
Result := Result + #$0D#$0A;
for _i:=0 to 1 do
begin
Result := Result + Format('%16.7f ',[RINT[_i]]);
if ( ((_i+1) mod 2)=0 )
then Result := Result + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
end;
end.
Unit FQSE1R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
function FQSE1R(X :Real): Real;
implementation
function FQSE1R(X :Real): Real;
begin
{ Result - прототип имени функции FQSE1R на FORTRANe }
Result := IntPower(X,4);
exit;
end;
end.
Результаты:
1. RINT(1) = -0.0155869200 ;
RINT(2) = 0 ;
IERR = 0
2. RINT(1) = 0. ;
RINT(2) = 0.0000739651 ;
IERR = 0