|
Текст подпрограммы и версий qsk1r_c.zip |
Тексты тестовых примеров tqsk1r_c.zip |
Вычисление определенного интеграла по обобщенной квадратурной формуле Ньютона - Котеса шестой степени точности.
Подпрограмма qsk1r_c вычисляет интеграл
B
∫ f (x) dx
A
с заданной абсолютной погрешностью E по обобщенной квадратурной формуле Ньютона - Котеса с шагом h = (B - A)/K, где K - число частичных отрезков разбиения.
Л.Г.Васильева. Набор стандартных программ численного интегрирования c фиксированным распределением узлов. Сб. "Численный анализ на Фортране", вып. 8, Изд-во МГУ, 1974 .
int qsk1r_c (real *rint, real *a, real *b, R_fp f, real *e,
integer *k, integer *ierr)
Параметры
| rint - | вещественная переменная, содержащая вычисленное значение интеграла; |
| a, b - | заданные нижний и верхний пределы интегрирования (тип: вещественный); |
| f - | имя вещественной подпрограммы - функции, вычисляющей подинтегральную функцию f (x); |
| e - | заданная абсолютная погрешность вычисления интеграла (тип: вещественный); |
| k - | целая переменная, задающая число частичных отрезков разбиения; |
| ierr - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| ierr = 65 - | когда заданная точность не может быть достигнута при максимально возможном числе частичных отрезков разбиения; значение k полагается равным 1048576. |
Версии: нет
Вызываемые подпрограммы
| utqs10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qsk1r_c. |
Замечания по использованию
|
Проводятся два последовательных просчета интеграла по всему отрезку интегрирования по k и 2k частичным отрезкам. Если абсолютная величина разности этих двух последовательных просчетов не превосходит e , то счет заканчивается и за значение интеграла принимается результат последнего просчета. B противном случае, значение k удваивается и процесс повторяется. При e ≤ 0 происходит только один просчет при заданном значении k. Максимальное значение k, котоpое можно задавать, не должно превосходить 524288. Если заданная точность не может быть достигнута, то k полагается равным 1048576. При выходе из подпрограммы значение k полагается равным числу частичных отрезков разбиения, при котоpом проводился последний просчет интеграла. |
int main(void)
{
/* Local variables */
static int ierr;
static float rint, a, b;
extern int qsk1r_c(float *, float *, float *, R_fp, float *,
int *, int *);
static float e;
extern float f_c();
static int k;
k = 1;
e = 1e-5f;
b = 1.570796326795f;
a = -b;
qsk1r_c(&rint, &a, &b, (R_fp)f_c, &e, &k, &ierr);
printf("\n %16.7e %5i %5i \n",rint,k,ierr);
return 0;
} /* main */
float f_c(float *x)
{
/* System generated locals */
float ret_val;
/* Builtin functions */
double cos(double);
ret_val = 1.f / ((float)cos(*x) + 1.f);
return ret_val;
} /* f_c */
Результаты:
rint = 2.0000000000
k = 128
ierr = 0