Текст подпрограммы и версий qs18r_c.zip qs18d_c.zip |
Тексты тестовых примеров tqs18r_c.zip tqs18d_c.zip |
Вычисление интеграла
b ∫ f (x) sin ( w x + φ ) dx a
с заданной абсолютной погрешностью методом Лонгмана.
Пусть отрезку [A, B] пpинaдлежат n0 + 1 нулей xA, xA + π/ | w |, ..., xA + n0 π/ | w | = xB функции sin (w x + φ). В случае n0 ≥ 2 по квадратypной формуле Гаусса с 32 узлами вычисляются интегралы по отрезкам [A, xA] и [xB, B], затем вычисляются интегралы
B1 Vi = (- 1)i ∫ f(x) sin(w x + φ) dx , A1 где A1 = xA + i π/ | w | , B1 = xA + ( i + 1) π/ | w | , ( i = 0, 1, ..., k - 1, n0 - k, n0 - k + 1, ... , n0 - 1 ) ,
и за значение интеграла по отрезку [xA, xB] принимается сумма
k-1 (1) ∑ [(- 1)i Δi V0 + (- 1)n0 -1 Δi Vn0 - i -1] / 2i +1 , i =0
где n0 = n0, а значение k выбирается подпрограммой в соответствии с заданной величиной абсолютной погрешности Е. B случае n0 ≤ 1 или при отсутствии на отрезке [A, B] нулей функции sin (w x + φ) интеграл по отрезку [A, B] вычисляется с помощью квадратурной формулы Гаусса с 32 узлами.
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.
int qs18r_c (real *rint, real *a, real *b, R_fp f, real *w, real *fi, real *e, integer *l, real *ra, real *rb, integer *ierr)
Параметры
rint - | вещественная переменная, содержащая вычисленное значение интеграла; |
a, b - | заданные нижний и верхний пределы интегрирования соответственно (тип: вещественный); |
f - | имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x); |
w - | заданное значение параметра w (тип: вещественный); |
fi - | заданное значение параметра φ (тип: вещественный); |
e - | заданная абсолютная погрешность вычисления интеграла (тип: вещественный); |
l - | параметр, равный m + 1, где m - определяемое пользователем максимально допустимое число членов суммы (1), l ≥ 3 (тип: целый); |
ra, rb - | вещественные одномерные массивы длины l, используемые как рабочие; |
ierr - | целая переменная для диагностических сообщений; при этом: |
ierr=65 - | если заданная точность не может быть достигнута при заданном l. |
Версии
qs18d_c - |
вычисление с удвоенной точностью интеграла b ∫ f (x) sin ( w x + φ ) dx a с заданной абсолютной погрешностью методом Лонгмана. |
Вызываемые подпрограммы
utqs11_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qs18r_c. |
utqs13_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qs18d_c. |
Замечания по использованию
Параметр l пользователь может задавать достаточно произвольно; чем больше l, тем больше шансов, что заданная точность будет достигнута, но и тем больше места будет занято программой в памяти машины. | |
В подпрограмме qs18d_c параметры rint, a, b, f, w, fi, e, ra, rb имеют тип double. |
int main(void) { /* Local variables */ static int ierr; static float rint; extern int qs18r_c(float *, float *, float *, R_fp, float *, float *, float *, int *, float *, float *, int *); static float a, b, e; extern float f_c(); static int l; static float w, fi, ra[20], rb[20]; a = -100.f; b = 100.f; w = 10.f; fi = 0.f; e = 1e-6f; l = 20; qs18r_c(&rint, &a, &b, (R_fp)f_c, &w, &fi, &e, &l, ra, rb, &ierr); printf("\n %16.7e %5i \n",rint,ierr); return 0; } /* main */ float f_c(float *x) { /* System generated locals */ float ret_val; ret_val = *x; return ret_val; } /* f_c */ Результаты: rint = - 11.2310439229 , ierr = 0