|
Текст подпрограммы и версий qs15r_c.zip qs15d_c.zip |
Тексты тестовых примеров tqs15r_c.zip tqs15d_c.zip |
Вычисление определенного интеграла от векторной функции по формулам Гаусса.
Подпрограмма qs15r_c вычисляет интеграл
B
∫ F (x) dx
A
от векторной функции F (x) = ( f1 (x), ... , fN (x) )
с покомпонентной погрешностью
B
ЕРS ( 1 + | ∫ fi (x) dx | )
A
по квадратурным формулам Гаусса с разбиением основного отрезка интегрирования на частичные.
Точность может достигаться как за счет удвоения числа частичных отрезков разбиения при фиксированном числе узлов квадратурной формулы, применяемой на каждом частичном отрезке, так и за счет увеличения числа узлов квадратурной формулы при фиксированном числе отрезков разбиения.
Я.М.Жилейкин, М.В.Соколовский. Набор стандартных программ для вычисления интегралов от векторных функций, Сб. "Методы и алгоритмы в численном анализе", Изд-во МГУ, 1981 г.
int qs15r_c (real *rint, real *a, real *b, S_fp f, integer *n,
real *eps, integer *k, integer *ng, integer *l, integer *ind,
real *r, integer *ierr)
Параметры
| rint - | вещественный вектоp длины n, содержащий вычисленные значения интегралов; |
| a, b - | заданные нижний и верхний пределы интегрирования (тип: вещественный); |
| f - | имя подпрограммы, вычисляющей подинтегральные функции; |
| n - | размерность вектоpа - функции F (x) (тип: целый); |
| eps - | заданная меpа погрешности вычисления интеграла (тип: вещественный); |
| k - | целая переменная, задающая начальное число частичных отрезков разбиения; |
| ng - | целая переменная, задающая начальное число узлов квадратурной формулы; |
| l - | задает режим работы подпрограммы (тип: целый); при этом, если: |
| l = 0 - | то заданная точность достигается за счет увеличения числа частичных отрезков разбиения при заданном ng; |
| l ≥ 1 - | то заданная точность достигается за счет увеличения числа узлов квадратурной формулы при заданном k; |
| ind - | целый вектоp длины n, каждая компонента которого pавна при: |
| l = 0 - | числу частичных отрезков разбиения, при котоpом достигается заданная точность по этой компоненте; |
| l ≥ 1 - | числу узлов квадpатуной фоpмулы, пpи котоpом достигается заданная точность по этой компоненте; |
| r - | вещественный рабочий вектоp длины 2n; |
| ierr - | целая переменная, служащая для диагностических сообщений: |
| ierr = 65 - | когда заданная точность не может быть достигнута при максимально возможном числе узлов квадратурной формулы (96); |
| ierr = 66 - | если заданное число узлов квадратурной формулы не является допустимым; |
| ierr = 67 - | если заданная точность не может быть достигнута при максимально возможном числе (1048576) частичных отрезков разбиения. |
Версии
| qs15d_c - | вычисление с удвоенной точностью определенного интеграла от векторной функции по формулам Гаусса. |
Вызываемые подпрограммы
| utqs11_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qs15r_c. |
| utqs13_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qs15d_c. |
Замечания по использованию
| 1. |
Число узлов квадратурной формулы может принимать лишь следующие допустимые значения 2, 4, 6, 8, 10, 12, 16, 24, 32, 48, 64, 96. | |
| 2. |
Первый оператор подпрограммы f должен иметь вид: | |
| 3. |
При eps ≤ 0 происходит только один просчет при заданных значениях k и ng. | |
| 4. |
Вычисление интеграла от отдельной компоненты прекращается как только по этой компоненте достигается заданная точность. | |
| 5. |
Если для каких - либо компонент векторной функции заданная погрешность интегрирования не может быть достигнута, то соответствующие компоненты вектоpа ind полагаются равными нулю. | |
| 6. |
Погрешность определяется по модулю разности двух просчетов по m и 2*m частичным отрезкам разбиения при l = 0 либо по двум просчетам с различным, но следующим друг за другом, согласно указанному выше списку, числом узлов квадратурных формул при l ≥ 1. | |
| 7. | В подпрограмме qs15d_c параметры rint, a, b, f, e, eps, r имеют тип double. |
int main(void)
{
/* Local variables */
static int ierr;
extern int qs15r_c(float *, float *, float *, U_fp, int *, float *,
int *, int *, int *, int *, float *, int *);
static float rint1[5], rint2[5];
static int i__;
static float r__[10];
extern int fun_c();
static int ind1[5], ind2[5];
qs15r_c(rint1, &c_b1, &c_b2, (U_fp)fun_c, &c__5, &c_b4, &c__2, &c__4,
&c__0, ind1, r__, &ierr);
qs15r_c(rint2, &c_b1, &c_b2, (U_fp)fun_c, &c__5, &c_b4, &c__1, &c__2,
&c__1, ind2, r__, &ierr);
for (i__ = 1; i__ <= 5; ++i__) {
printf("\n %16.7e %2i %16.7e %2i \n",
rint1[i__-1],ind1[i__-1],rint2[i__-1],ind2[i__-1]);
/* l1: */
}
return 0;
} /* main */
int fun_c(float *x, float *y, int *i__)
{
/* System generated locals */
float r__1;
/* Local variables */
static int j;
/* Parameter adjustments */
--y;
/* Function Body */
/* Computing 6th power */
r__1 = *x, r__1 *= r__1;
y[1] = r__1 * (r__1 * r__1);
for (j = 1; j <= 4; ++j) {
/* l1: */
y[j + 1] = y[j] * *x;
}
return 0;
} /* fun_c */
Результаты:
rint1 ind1
1.42857142855-01 2
1.24999999998-01 2
1.11111111108-01 4
9.99999999985-01 8
9.09090909076-02 8
rint2 ind2
1.42857142855-01 4
1.24999999998-01 4
1.11111111109-01 6
9.99999999985-01 6
9.09090909078-02 6
ierr = 0