|
Текст подпрограммы и версий qst2r_c.zip qst2d_c.zip |
Тексты тестовых примеров tqst2r_c.zip tqst2d_c.zip |
Вычисление определенного интеграла от векторной функции по обобщенной квадратурной формуле трапеций.
Подпрограмма qst2r_c вычисляет интеграл
B
∫ F(x) dx
A
от векторной функции F(x) = { f i (x) } , i =1, ... , N
с покомпонентной погрешностью
B
ЕРS ( 1 + | ∫ f i (x) dx | )
A
по обобщенной квадратурной формуле трапеций с шагом h = (B - A)/M, где M - число частичных отрезков разбиения.
Я.М.Жилейкин, М.В.Соколовский. Набор стандартных программ для вычисления интегралов от векторных функций, Сб. "Методы и алгоритмы в численном анализе", Изд - во МГУ, 1981.
int qst2r_c (real *rint, real *a, real *b, S_fp f, integer *n,
real *eps, integer *k, integer *ind, real *r, integer *ierr)
Параметры
| rint - | вещественный вектоp длины n, содержащий вычисленные значения интегралов; |
| a, b - | заданные нижний и верхний пределы интегрирования (тип: вещественный); |
| f - | имя подпрограммы, вычисляющей подинтегральные функции; |
| n - | размерность вектоpа - функции F (x) (тип: целый); |
| eps - | заданная меpа погрешности вычисления интеграла (тип: вещественный); |
| k - | целая переменная, задающая начальное число частичных отрезков разбиения; |
| ind - | целый вектоp длины n, каждая компонента которого pавна числу частичных отрезков разбиения, при котоpом достигается заданная точность; |
| r - | вещественный рабочий вектоp длины 2 n; |
| ierr - | целая переменная, служащая для диагностических сообщений: |
| ierr=65 - | когда заданная точность не может быть достигнута при максимально возможном числе (1048576) частичных отрезков разбиения. |
Версии
| qst2d_c - | вычисление с удвоенной точностью определенного интеграла от векторной функции по обобщенной квадратурной формуле трапеций. |
Вызываемые подпрограммы
| utqs10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qst2r_c; |
| utqs12_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qst2d_c. |
Замечания по использованию
| 1. |
Первый оператор подпрограммы f должен иметь вид: int f(float *x, float *y, int *i)Здесь: x - аргумент функции f (тип: вещественный); y - вещественный вектоp длины n вычисленных значений функции f; i - целый вектоp длины n; если его j - ая компонента отлична от нуля, то интеграл от этой компоненты функции f не вычисляется. | |
| 2. |
При eps ≤ 0 происходит только один просчет при заданном значении k. | |
| 3. |
Вычисление интеграла от отдельной компоненты прекращается как только на этой компоненте достигается заданная точность. | |
| 4. |
Если для каких - либо компонент векторной функции заданная погрешность интегрирования не может быть достигнута, то соответствующие компоненты вектоpа ind полагаются равными нулю. | |
| 5. |
Погрешность определяется по модулю разности двух просчетов по m и 2 m частичным отрезкам разбиения. Если заданная точность не достигнута, то значение m удваивается. | |
| 6. | В подпрограмме qst2d_c параметры rint, a, b, f, eps, r имеют тип double. |
int main(void)
{
/* Local variables */
static int ierr;
static float rint[5];
extern int qst2r_c(float *, float *, float *, U_fp, int *, float *,
int *, int *, float *, int *);
static float r__[10];
static int ind[5];
extern int fun_c();
qst2r_c(rint, &c_b1, &c_b2, (U_fp)fun_c, &c__5, &c_b4, &c__1, ind, r__,
&ierr);
printf("\n %16.7e %16.7e %16.7e \n",rint[0],rint[1],rint[2]);
printf("\n %16.7e %16.7e \n",rint[3],rint[4]);
printf("\n %5i %5i %5i %5i %5i \n",ind[0],ind[1],ind[2],ind[3],ind[4]);
return 0;
} /* main */
int fun_c(float *x, float *y, int *i__)
{
static int j;
/* Parameter adjustments */
--i__;
--y;
/* Function Body */
y[1] = 1.f;
for (j = 1; j <= 4; ++j) {
/* l1: */
y[j + 1] = y[j] * *x;
}
return 0;
} /* fun_c */
Результаты:
rint ind
1.0000000000 + 00 1
5.0000000000 - 01 1
3.3333349227 - 01 512
2.5000023841 - 01 512
2.0000031788 - 01 512
ierr = 0