Текст подпрограммы и версий qse1r_c.zip |
Тексты тестовых примеров tqse1r_c.zip |
Вычисление на равномерной сетке определенного интеграла от быстроосциллирующих функций по квадратурной формуле типа Эйлера.
Подпрограмма qse1r_c вычисляет интеграл
a ∫ f(x) eiwx dx = J1M + i J2M , i = √-1 b
на равномерной сетке с помощью квадратурной формулы
интерполяционного типа, точной для многочленов четвертой степени с
весом e iwx .
M - число узлов интегрирования.
int qse1r_c (real *rint, real *a, real *b, R_fp f, real *r, real *e, integer *n, integer *ierr)
Параметры
rint - | вещественный вектоp длины 2 для вычисленных значений J1 (M) и J2 (M); |
a, b - | заданные нижний и верхний пределы интегрирования (тип: вещественный); |
f - | имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x); |
r - | заданное значение параметра w (тип: вещественный); |
e - | заданная абсолютная погрешность вычисления интеграла (тип: вещественный); |
n - | целая переменная, задающая начальное число узлов интегрирования; |
ierr - | целая переменная для диагностических сообщений: |
ierr = 65 - | когда заданная точность не может быть достигнута при максимально возможном числе узлов (m = 1048576). |
Версии: нет
Вызываемые подпрограммы
utqs11_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qse1r_c. |
Замечания по использованию
1. |
При e ≤ 0 происходит только один просчет при заданном значении n. | |
2. |
Максимальное значение n, котоpое можно задавать, не должно превосходить 524288. | |
3. |
Если интеграл вычислен с точностью e, то ierr полагается равным нулю. | |
4. |
Если интеграл не может быть вычислен с точностью e, то выдается диагностическое сообщение "заданная точность не может быть достигнута". | |
5. | Если ierr = 65, то n полагается равным -1. |
int main(void) { /* Local variables */ static int ierr; static float rint[2]; extern int qse1r_c(float *, float *, float *, R_fp, float *, float *, int *, int *); static float a, b, e; static int n; static float r__; extern float f1_c(), f2_c(); a = -1.f; b = 1.f; r__ = -112.f; e = 1e-7f; n = 10; qse1r_c(rint, &a, &b, (R_fp)f1_c, &r__, &e, &n, &ierr); printf("\n %16.7e %16.7e \n",rint[0],rint[1]); printf("\n %5i %5i \n",ierr,n); qse1r_c(rint, &c_b6, &c_b7, (R_fp)f2_c, &c_b8, &c_b9, &c__10, &ierr); printf("\n %16.7e %16.7e \n",rint[0],rint[1]); return 0; } /* main */ float f1_c(float *x) { /* System generated locals */ float ret_val, r__1; /* Computing 4th power */ r__1 = *x, r__1 *= r__1; ret_val = r__1 * r__1; return ret_val; } /* f1_c */ float f2_c(float *x) { /* System generated locals */ float ret_val; /* Builtin functions */ double sin(double); ret_val = (float)sin((float)(*x / 112.f)); return ret_val; } /* f2_c */ Результаты: 1. rint(1) = -0.0155869200 ; rint(2) = 0 ; ierr = 0 2. rint(1) = 0. ; rint(2) = 0.0000739651 ; ierr = 0