Текст подпрограммы и версий qs21r_c.zip qs21d_c.zip |
Тексты тестовых примеров tqs21r_c.zip tqs21d_c.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.
int qs21r_c (real *u, real *v, real *a, real *b, S_fp f, integer *n, integer *ierr)
Параметры
u - | вещественный вектор длины n для вычисленных значений Umn; |
v - | вещественный вектор длины n для вычисленных значений Vmn; |
a, b - | заданные нижний и верхний пределы интегрирования (тип: вещественный); |
f - | имя подпрограммы, вычисляющей подинтегральную функцию f (x); |
n - | число узлов интегрирования (тип: вещественный); |
ierr - | целая переменная для диагностических сообщений: |
ierr=65 - | когда заданное n превосходит максимально допустимое число узлов. |
Версии
qs21d_c - | вычисление серии интегралов Фурье с помощью алгоритма быстрого преобразования Фурье (БПФ) от комплекснозначной функции вещественного аргумента по квадратурной формуле Симпсона в режиме удвоенной точности. |
Вызываемые подпрограммы
utqs10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qs21r_c; |
utqs11_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qs21d_c; |
ftf1c_c - | подпрограмма вычисления дискретного или обратного дискретного преобразования Фурье комплексного ряда длины l = 2m (m - целое) методом быстрого преобразования Фурье при работе подпрограммы qs21r_c; |
ftf1p_c - | подпрограмма вычисления дискретного или обратного дискретного преобразования Фурье комплексного ряда длины l = 2m (m - целое) методом быстрого преобразования Фурье при работе подпрограммы qs21d_c. |
Замечания по использованию
1. |
n должно быть степенью числа два; | |
2. |
Максимальное значение n не должно превосходить 220, т.е. n ≤ 1048576; | |
3. |
Первый оператор подпрограммы f должен иметь вид: int f(float *x, float *f1, float *f2) Здесь: x - аргумент функции f(x) (тип: вещественный); f1 - вещественная переменная, f1 = re f(x); f2 - вещественная переменная, f2 = im f(x) | |
4. |
Для подпрограммы qs21d_c параметры u, v, a, b, а также параметры x, f1 и f2 из подпрограммы f имеют тип double; | |
5. | Подпрограмма qs21r_c вычисляет серию интегралов при заданном значении n. Если требуется вычислить интегралы с оценкой погрешности, то следует провести просчеты при нескольких значениях n и сравнить их. |
int main(void) { /* Local variables */ static int ierr; extern int qs21r_c(float *, float *, float *, float *, U_fp, int *, int *); extern int f_c(); static int k; static float u[512], v[512]; qs21r_c(u, v, &c_b1, &c_b2, (U_fp)f_c, &c__512, &ierr); printf("\n u[k] \n"); for (k = 1; k <= 508; k += 3) { printf("\n %16.7f %16.7f %16.7f ",u[k - 1], u[k], u[k + 1]); } printf("\n %16.7f %16.7f \n ",u[510], u[511]); printf("\n v[k] \n"); for (k = 1; k <= 508; k += 3) { printf("\n %16.7f %16.7f %16.7f ",v[k - 1], v[k], v[k + 1]); } printf("\n %16.7f %16.7f \n ",v[510], v[511]); return 0; } /* main */ int f_c(float *x, float *f1, float *f2) { /* Builtin functions */ double exp(double); *f1 = (float)exp(*x); *f2 = 0.f; return 0; } /* f_c */ Результаты: Приводятся значения интегралов Umn и Vmn для w0 = 0 и w1 = 2π при n = 512: u(1) = 1.718281828 v(1) = 0.000000000 u(2) = 0.042449333 v(2) = 0.266717025