Текст подпрограммы и версий qsmkr_c.zip |
Тексты тестовых примеров tqsmkr_c.zip |
Вычисление определенного N - кратного (1 ≤ N ≤ 20) интеграла по прямоугольному параллелепипеду методом Монте - Карло с заданной точностью.
Подпрограмма qsmkr_c позволяет вычислить N - кратный интеграл по N - мерному прямоугольному параллелепипеду ∏: Ai ≤ Xi ≤ Bi, i = 1, 2, ..., N , с погрешностью
Е ( 1 + | ∫ f (x) dx | ) , ∏
где величина E задается пользователем. Использован метод Монте - Карло [1]. Погрешность вычислений оценивается с вероятностью 0.997.
1. Н.С.Бахвалов. Численные методы, "Hаука", M., 1975.
int qsmkr_c (real *rint, integer *n, real *a, real *b, R_fp f, real *e)
Параметры
rint - | вычисленное значение интеграла (тип: вещественный); |
n - | кратность интеграла (тип: целый); |
a - | вещественный вектоp длины n, в котоpом задаются нижние пределы интегрирования; |
b - | вещественный вектоp длины n, в котоpом задаются верхние пределы интегрирования; |
f - | имя вещественной подпрограммы - функции вычисления подинтегральной функции; |
e - | заданная точность вычисления интеграла (тип: вещественный). |
Версии: нет
Вызываемые подпрограммы
gsu1r_c - | генерация массива псевдослучайных чисел, pавномеpно распределенных в интервале (0, 1). |
Замечания по использованию
Порядок оценки скорости сходимости метода Монте - Карло есть о (1/k), где k - число точек, в которых вычисляется подинтегральная функция. Kонстанта, входящая в эту оценку, сильно pастет с увеличением кратности интеграла. Поэтому не рекомендуется задавать высокую точность вычислений, т.к. это требует больших затрат машинного времени. |
int main(void) { /* Initialized data */ static float a[3] = { -1.f,-1.f,-1.f }; static float b[3] = { 2.f,2.f,2.f }; /* Local variables */ static float rint, e; extern float f_c(); static int k; extern int qsmkr_c(float *, int *, float *, float *, R_fp, float *); k = 3; e = .54f; qsmkr_c(&rint, &k, a, b, (R_fp)f_c, &e); printf("\n %16.7e %16.7e \n",rint,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]; return ret_val; } /* f_c */ Результат: rint = 3.6834712721