|
Текст подпрограммы и версий qs19r_c.zip qs19d_c.zip |
Тексты тестовых примеров tqs19r_c.zip tqs19d_c.zip |
Вычисление определенного интеграла от осциллирующих функций методом Лонгмана.
Пусть отрезку [A, B], a ≤ B, принадлежат n0 + 1 нулей x0, x1,..., xn0 функции f (x), n0 ≥ 2. По квадратурной формуле Гаусса с 32 узлами вычисляются интегралы по отрезкам [A, x0] и [xn0, B], затем вычисляются интегралы
B1
Vi = (- 1) i ∫ f (x) dx ,
A1
где A1 = x i ,
B1 = x i +1 ,
( i = 0, 1, ..., k - 1, n0 - k, n0 - k + 1, ... , n0 - 1 ) ,
и за значение интеграла по отрезку [x0, xn0] принимается сумма
k-1
(1) ∑ [(- 1)i Δi V0 + (- 1)n0 - 1 Δi Vn0 - i - 1 ] / 2i +1 ,
i =0
причем значение k выбирается подпрограммой в соответствии с заданной величиной абсолютной погрешности Е.
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 qs19r_c (real *rint, real *a, real *b, R_fp f, real *e,
integer *l, real *xa, real *xb, real *ra, real *rb, integer *ierr)
Параметры
| rint - | вещественная переменная, содержащая вычисленное значение интеграла; |
| a, b - | заданные нижний и верхний пределы интегрирования соответственно, a ≤ b (тип: вещественный); |
| f - | имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x); |
| e - | заданная абсолютная погрешность вычисления интеграла (тип: вещественный); |
| l - | параметр, равный m + 1, где m - определяемое пользователем максимально допустимое число членов суммы (1), l ≥ 3 (тип: целый); |
| xa - | вещественный одномерный массив длины l, содержащий l последовательных нулей функции f (x), принадлежащих отрезку интегрирования, которые расположены в порядке возрастания, начиная с наименьшего; |
| xb - | вещественный одномерный массив длины l, содержащий l последовательных нулей функции f (x), принадлежащих отрезку интегрирования, которые расположены в порядке убывания, начиная с наибольшего; |
| ra, rb - | вещественные одномерные массивы длины l, используемые как рабочие; |
| ierr - | целая переменная для диагностических сообщений; при этом: |
| ierr=65 - | если заданная точность не может быть достигнута при заданном l. |
Версии
| qs19d_c - | вычисление с удвоенной точностью определенного интеграла от осциллирующих функций методом Лонгмана. |
Вызываемые подпрограммы
| utqs11_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qs19r_c. |
| utqs13_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qs19d_c. |
Замечания по использованию
| Параметр l пользователь может задавать достаточно произвольно; чем больше l, тем больше шансов, что заданная точность будет достигнута, но и тем больше места будет занято программой в памяти машины. | |
| В подпрограмме qs19d_c параметры rint, a, b, f, e, xa, xb, ra, rb имеют тип double. |
int main(void)
{
/* Local variables */
static int ierr;
static float rint;
extern int qs19r_c(float *, float *, float *, R_fp, float *,
int *, float *, float *, float *, float *, int *);
static float a, b, e;
extern float f_c();
static int i__, l;
static float ra[20], rb[20], xa[20], xb[20];
a = -100.f;
b = 100.f;
e = .001f;
l = 20;
for (i__ = 1; i__ <= 20; ++i__) {
xb[i__ - 1] = (319 - i__) * .3141592654f;
/* l1: */
xa[i__ - 1] = -xb[i__ - 1];
}
qs19r_c(&rint, &a, &b, (R_fp)f_c, &e, &l, xa, xb, 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;
/* Builtin functions */
double sin(double);
ret_val = *x * (float)sin((float)(*x * 10.f));
return ret_val;
} /* f_c */
Результаты: rint = - 11.2310439137 , ierr = 0