Вычисление интеграла методом Монте-Карло - C (СИ)
Формулировка задачи:
Здравствуйте. Необходима программа, вычисляющая интеграл методом Монте-Карло для функции z=(8*x*sin(x)+7*x*y^3*(cos(y)^2))/((cos(x-y))^(1/2)) в пределах: x=[0,1], y=[0,1], z=[0,10] (реальное значение интеграла)
Среднее значение интеграла за 10 опытов не должно отклоняться от реальной величины более, чем на 0,01.
Мой вариант программы стабильно ошибается на 0,1! Вместо должных ~2,96 получается ~2.86. Помогите пожалуйста найти проблему.
#include <math.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include<clocale> void main() { setlocale(LC_CTYPE, ""); srand((unsigned)time(NULL)); printf("Функция: z=(8*x*sin(x)+7*x*y^3*cos(y)^2))/cos(x-y)^(1/2)\n"); float Zmax=0; for(float x=0;x<=1;x=x+0.01) { for(float y=0;y<=1;y=y+0.01) { if(Zmax<(float)(8*x*sin(x)+7*x*pow(y,3)*pow(cos(y),2))/pow(cos(x-y),1/2)) { Zmax=(float) (8*x*sin(x)+7*x*pow(y,3)*pow(cos(y),2))/pow(cos(x-y),1/2); } } } float SumINTEGR=0;//Сумма интегралов за 10 опытов for(int i=1;i<=10;i++) { float X,Y,Z;// Рандомные точки int HIT=0;// Число попаданий точек в искомый объем под поверхностью функции float INTEGR=0;//Значение интеграла for(float N=1;N<=183065;N++) { X=(float)(rand()%101)/100; Y=(float)(rand()%101)/100; Z=(float)(rand()%1001)/100; if(Z<=(8*X*sin(X)+7*X*pow(Y,3)*pow(cos(Y),2))/pow(cos(X-Y),1/2)) { HIT=HIT+1; } } INTEGR=(float)HIT/183065*10; SumINTEGR=SumINTEGR+INTEGR; } float averINTEGR=SumINTEGR/10;// Среднее значение интеграла в 10 случаях printf("Значение интеграла - %f\n", averINTEGR); printf("Z максимальное - %f",Zmax); getch(); }
Решение задачи: «Вычисление интеграла методом Монте-Карло»
textual
Листинг программы
x = (double) ( rand() ) / RAND_MAX; y = (double) ( rand() ) / RAND_MAX; z = (double) ( rand() ) * 10.0 / RAND_MAX;
Объяснение кода листинга программы
- Импортируются необходимые библиотеки
- Вычисляется значение x, y и z - это три случайных числа в интервале от 0 до 10.0
- Значение x умножается на значение y
- Полученное произведение умножается на значение z
- Полученное значение сохраняется в переменную result
- Выводится значение переменной result на экран
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д