Текст подпрограммы и версий qss1r_c.zip qss1d_c.zip |
Тексты тестовых примеров tqss1r_c.zip tqss1d_c.zip |
Вычисление определенного интеграла по обобщенной квадратурной формуле Симпсона.
Подпрограмма qss1r_c вычисляет интеграл B ∫ f (x) dx A
с заданной абсолютной погрешностью E по обобщенной квадратурной формуле Симпсона с шагом h = (B - A)/K, где K - число частичных отрезков разбиения.
Л.Г. Васильева. Набор стандартных программ численного интегрирования с фиксированным распределением узлов. Сб. "Численный анализ на ФОРТРАНе", вып. 8, Изд-во МГУ, 1974.
int qss1r_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. |
Версии
qss1d_c - | вычисление с удвоенной точностью определенного интеграла по обобщенной квадратурной формуле Симпсона. |
Вызываемые подпрограммы
utqs10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qss1r_c. |
utqs12_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qss1d_c. |
Замечания по использованию
Проводятся два последовательных просчета интеграла по всему отрезку интегрирования по k и 2k частичным отрезкам. Если абсолютная величина разности этих двух последовательных просчетов не превосходит e, то счет заканчивается и за значение интеграла принимается результат последнего просчета. B противном случае, значение k удваивается и процесс повторяется. При e ≤ 0 происходит только один просчет при заданном значении k. Максимальное значение k, котоpое можно задавать, не должно превосходить 524288. Если заданная точность не может быть достигнута, то k полагается равным 1048676. При выходе из подпрограммы значение k полагается равным числу частичных отрезков разбиения, при котоpом проводился последний просчет интеграла. В подпрограмме qss1d_c параметры rint, a, b, f, e имеют тип double. |
int main(void) { /* Local variables */ static int ierr; static float rint, a, b, e; extern float f_c(); extern int qss1r_c(float *, float *, float *, R_fp, float *, int *, int *); static int k; k = 1; e = 1e-5f; b = 1.570796326795f; a = -b; qss1r_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.0000000012 k = 256 ierr = 0