Текст подпрограммы и версий qsh4r_c.zip qsh4d_c.zip |
Тексты тестовых примеров tqsh4r_c.zip tqsh4d_c.zip |
Вычисление определенного четырехкратного интеграла по прямоугольному параллелепипеду с заданной точностью.
qsh4r_c вычисляет четырехкратный интеграл по прямоугольному параллелепипеду с погрешностью
B Е ( 1 + | ∫ f (x) dx | ) , по сеткам Холтона. A
E - меpа погрешности вычисления интеграла, задаваемая пользователем.
Интеграл считается вычисленным, если разность двух приближенных значений интеграла по N точкам и по 2N точкам меньше, чем E(1 + J), где J - значение интеграла по 2N точкам.
И.М. Соболь. Многомерные квадратурные формулы и функции Xааpа, "Hаука", M.: 1969.
int qsh4r_c (real *rint, real *a, real *b, R_fp f, real *e, integer *ierr)
Параметры
rint - | вещественная переменная, содержащая вычисленное значение интеграла; |
a - | вещественный вектоp длины 4, в котоpом задаются нижние пределы интегрирования; |
b - | вещественный вектоp длины 4, в котоpом задаются верхние пределы интегрирования; |
f - | имя вещественной подпрограммы - функции вычисления подинтегральной функции; |
e - | заданная меpа погрешности вычисления интеграла (тип: вещественный); |
ierr - | целая переменная, служащая для диагностических сообщений: |
ierr = 65 - | когда заданная точность не может быть достигнута. |
Версии
qsh4d_c - | вычисление с удвоенной точностью определенного четырехкратного интеграла по прямоугольному параллелепипеду с заданной точностью. |
Вызываемые подпрограммы
utqs10_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qsh4r_c. |
utqs12_c - | подпрограмма выдачи диагностических сообщений при работе подпрограммы qsh4d_c. |
Замечания по использованию
Может случиться, что пользователь задал слишком высокую точность вычислений интеграла, которая не достигается при числе точек N = 2*109. Тогда подпрограммы utqs10_c, utqs12_c выдадут диагностическое сообщение "заданная точность не может быть достигнута". | |
В подпрограмме qsh4d_c параметры rint, a, b, f, e имеют тип double. |
int main(void) { /* Local variables */ static int ierr; static float rint, a[4], b[4]; extern int qsh4r_c(float *, float *, float *, R_fp, float *, int *); static float e; extern float f_c(); a[0] = -1.f; b[0] = 2.f; a[1] = -1.f; b[1] = 2.f; a[2] = -1.f; b[2] = 2.f; a[3] = -1.f; b[3] = 2.f; e = .05f; qsh4r_c(&rint, a, b, (R_fp)f_c, &e, &ierr); printf("\n %16.7e \n",rint); rint = rint * 16.f / 81.f; printf("\n %16.7e \n",rint); printf("\n %16.7e %16.7e \n",a[0],a[1]); printf("\n %16.7e %16.7e \n",a[2],a[3]); printf("\n %16.7e %16.7e \n",b[0],b[1]); printf("\n %16.7e %16.7e \n",b[2],b[3]); printf("\n %16.7e \n",e); return 0; } /* main */ float f_c(float *x) { /* System generated locals */ float ret_val; /* Parameter adjustments */ --x; /* Function Body */ ret_val = x[1] * x[2] * x[3] * x[4]; return ret_val; } /* f_c */ Результаты: rint = 5.0163806920 , ierr = 0.