|
Текст подпрограммы и версий 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.