Текст подпрограммы и версий qss2r_c.zip qss2d_c.zip |
Тексты тестовых примеров tqss2r_c.zip tqss2d_c.zip |
Вычисление определенного интеграла от векторной функции по обобщенной квадратурной формуле Симпсона.
Подпрограмма qss2r_c вычисляет интеграл B ∫ F(x) dx от векторной функции F(x) = ( f1 (x), ... , fN (x) ) A с покомпонентной погрешностью B ЕРS ( 1 + | ∫ fi (x) dx | ) A
по обобщенной квадратурной формуле Симпсона с шагом h = (B - A)/M, где M - число частичных отрезков разбиения.
Я.М.Жилейкин, М.В.Соколовский. Набор стандартных программ для вычисления интегралов от векторных функций. Сб. "Методы и алгоритмы в численном анализе", Изд-во МГУ, 1981.
int qss2r_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 длины 3n; |
ierr - | целая переменная, служащая для диагностических сообщений: |
ierr = 65 - | когда заданная точность не может быть достигнута при максимально возможном числе (1048576) частичных отрезков разбиения. |
Версии
qss2d_c - | вычисление с удвоенной точностью определенного интеграла от векторной функции по обобщенной квадратурной формуле Симпсона. |
Вызываемые подпрограммы
utqs10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qss2r_c. |
utqs12_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qss2d_c. |
Замечания по использованию
1. |
Первый оператор подпрограммы f должен иметь вид: | |
2. |
При eps ≤ 0 происходит только один просчет при заданном значении k. | |
3. |
Вычисление интеграла от отдельной компоненты прекращается как только на этой компоненте достигается заданная точность. | |
4. |
Если для каких - либо компонент векторной функции заданная погрешность интегрирования не может быть достигнута, то соответствующие компоненты вектоpа ind полагаются равными нулю. | |
5. |
Погрешность определяется по модулю разности двух просчетов по m и 2m частичным отрезкам разбиения. Если заданная точность не достигнута, то значение m удваивается. | |
6. | В подпрограмме qss2d_c параметры rint, a, b, f, eps, r имеют тип double. |
int main(void) { /* Local variables */ static int ierr; static float rint[5]; extern int qss2r_c(float *, float *, float *, U_fp, int *, float *, int *, int *, float *, int *); static float r__[15]; static int ind[5]; extern int fun_c(); qss2r_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]); printf("\n %5i \n",ierr); return 0; } /* main */ int fun_c(float *x, float *y, int *i__) { static int j; /* Parameter adjustments */ --y; /* Function Body */ y[1] = *x; for (j = 1; j <= 4; ++j) { /* l1: */ y[j + 1] = y[j] * *x; } return 0; } /* fun_c */ Результаты: rint ind 5.0000000000-01 1 3.3333333333-01 1 2.5000000000-01 1 2.0000000794-01 16 1.6666668653-01 16 ierr = 0