Вычисление интеграла методом Монте-Карло - 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 на экран
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д