|
Текст подпрограммы и версий qs21r_p.zip, qs21e_p.zip |
Тексты тестовых примеров tqs21r_p.zip, tqs21e_p.zip |
Вычисление серии интегралов Фурье с помощью алгоритма быстрого преобразования Фурье (БПФ) от комплекснозначной функции вещественного аргумента по квадратурной формуле Симпсона.
Пусть f (x) = f1 (x) + i f2 (x) - комплекснозначная функция вещественного аргумента, определенная на конечном отрезке [a, b]. Вычисляется серия из N интегралов по формуле Симпсона по N узлам:
b
∫ f (x) exp(-iwmx) dx =
a
1
= (b-a) ∫ f [ a+(b-a) y ] * exp { - iwm[ a+(b-a) y ]} dy ≈
0
N-1
≈ (b-a)/N ∑ Ck f [ a+(b-a) k/N] * exp { - i wm[ a+(b-a) k/N ] } = ImN ,
k =0
где ImN = UmN + i VmN ,
Ck - веса формулы Симпсона для отрезка [0,1] , i = √-1 ,
wm = 2πm /(b-a) , m = 0, 1, 2, ..., N/2, N/2+1, N/2+2, ..., - 2, - 1 .
В.А.Морозов,Н.Н.Кирсанова,А.Ф.Сысоев. Комплекс алгоритмов быстрого преобразования Фурье дискретных рядов. Сб."Численный анализ на ФОРТРАНе", вып.15, Изд - во МГУ, 1976.
procedure QS21R(var U :Array of Real; var V :Array of Real; A :Real;
B :Real; F :Proc_F3; N :Integer; var IERR :Integer);
Параметры
| U - | вещественный вектор длины N для вычисленных значений UmN; |
| V - | вещественный вектор длины N для вычисленных значений VmN; |
| A, B - | заданные нижний и верхний пределы интегрирования (тип: вещественный); |
| F - | имя подпрограммы, вычисляющей подинтегральную функцию f (x); |
| N - | число узлов интегрирования (тип: вещественный); |
| IERR - | целая переменная для диагностических сообщений: |
| IERR=65 - | когда заданное N превосходит максимально допустимое число узлов. |
Версии
| QS21E - | вычисление серии интегралов Фурье с помощью алгоритма быстрого преобразования Фурье (БПФ) от комплекснозначной функции вещественного аргумента по квадратурной формуле Симпсона в режиме расширенной (Extended) точности. |
Вызываемые подпрограммы
| UTQS10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы QS21R. |
| UTQS11 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы QS21E. |
| FTF1C - | подпрограмма вычисления дискретного или обратного дискретного преобразования Фурье комплексного ряда длины L = 2M (M - целое) методом быстрого преобразования Фурье при работе подпрограммы QS21R. |
| FTF1Z - | подпрограмма вычисления дискретного или обратного дискретного преобразования Фурье комплексного ряда длины L = 2M (M - целое) методом быстрого преобразования Фурье при работе подпрограммы QS21E. |
Замечания по использованию
| 1. |
N должно быть степенью числа два. | |
| 2. |
Максимальное значение N не должно превосходить 220, т.е. N ≤ 1048576 . | |
| 3. |
Первый оператор подпрограммы F должен иметь вид:
procedure F (X :Real; var F1 :Real; var F2 :Real);
Здесь:
X - аргумент функции f(x) (тип: вещественный);
F1 - вещественная переменная, F1 = Re f(x);
F2 - вещественная переменная, F2 = Im f(x).
| |
| 4. |
Для подпрограммы QS21E параметры U, V, A, B, а также параметры X, F1 и F2 из подпрограммы F имеют тип Extended. | |
| 5. | Подпрограмма QS21R вычисляет серию интегралов при заданном значении N. Если требуется вычислить интегралы с оценкой погрешности, то следует провести просчеты при нескольких значениях N и сравнить их. |
Unit TQS21R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, FQS21R_p, QS21R_p;
function TQS21R: String;
implementation
function TQS21R: String;
var
IERR,K :Integer;
U :Array [0..511] of Real;
V :Array [0..511] of Real;
begin
Result := ''; { результат функции }
QS21R(U,V,0.0,1.0,FQS21R,512,IERR);
Result := Result + Format('%s',[' U(K)']) + #$0D#$0A;
RЕSUlt := Result + #$0D#$0A;
for K:=1 to 512 do
begin
Result := Result + Format('%16.7f ',[U[K-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
Result := Result + Format('%s',[' V(K)']) + #$0D#$0A;
Result := Result + #$0D#$0A;
for K:=1 to 512 do
begin
Result := Result + Format('%16.7f ',[V[K-1]]) + #$0D#$0A;
end;
Result := Result + #$0D#$0A;
UtRes('TQS21R',Result); { вывод результатов в файл TQS21R.res }
exit;
end;
end.
Unit FQS21R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc;
procedure FQS21R(X :Real; var F1 :Real; var F2 :Real);
implementation
procedure FQS21R(X :Real; var F1 :Real; var F2 :Real);
begin
F1 := Exp(X);
F2 := 0.0;
end;
end.
Результаты:
Приводятся значения интегралов UmN и VmN
для w0 = 0 и w1 = 2π при N = 512:
U(1) = 1.718281828 V(1) = 0.000000000
U(2) = 0.042449333 V(2) = 0.266717025