Вычисление интеграла методом Монте-Карло - 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. Помогите пожалуйста найти проблему.
Листинг программы
  1. #include <math.h>
  2. #include <conio.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <time.h>
  6. #include<clocale>
  7.  
  8. void main()
  9. {
  10. setlocale(LC_CTYPE, "");
  11. srand((unsigned)time(NULL));
  12. printf("Функция: z=(8*x*sin(x)+7*x*y^3*cos(y)^2))/cos(x-y)^(1/2)\n");
  13. float Zmax=0;
  14. for(float x=0;x<=1;x=x+0.01)
  15. {
  16. for(float y=0;y<=1;y=y+0.01)
  17. {
  18. if(Zmax<(float)(8*x*sin(x)+7*x*pow(y,3)*pow(cos(y),2))/pow(cos(x-y),1/2))
  19. {
  20. Zmax=(float) (8*x*sin(x)+7*x*pow(y,3)*pow(cos(y),2))/pow(cos(x-y),1/2);
  21. }
  22. }
  23. }
  24. float SumINTEGR=0;//Сумма интегралов за 10 опытов
  25. for(int i=1;i<=10;i++)
  26. {
  27. float X,Y,Z;// Рандомные точки
  28. int HIT=0;// Число попаданий точек в искомый объем под поверхностью функции
  29. float INTEGR=0;//Значение интеграла
  30. for(float N=1;N<=183065;N++)
  31. {
  32. X=(float)(rand()%101)/100;
  33. Y=(float)(rand()%101)/100;
  34. Z=(float)(rand()%1001)/100;
  35. if(Z<=(8*X*sin(X)+7*X*pow(Y,3)*pow(cos(Y),2))/pow(cos(X-Y),1/2))
  36. {
  37. HIT=HIT+1;
  38. }
  39. }
  40. INTEGR=(float)HIT/183065*10;
  41. SumINTEGR=SumINTEGR+INTEGR;
  42. }
  43. float averINTEGR=SumINTEGR/10;// Среднее значение интеграла в 10 случаях
  44. printf("Значение интеграла - %f\n", averINTEGR);
  45. printf("Z максимальное - %f",Zmax);
  46. getch();
  47. }

Решение задачи: «Вычисление интеграла методом Монте-Карло»

textual
Листинг программы
  1. x = (double) ( rand() ) / RAND_MAX;
  2. y = (double) ( rand() ) / RAND_MAX;
  3. z = (double) ( rand() ) * 10.0 / RAND_MAX;

Объяснение кода листинга программы

  1. Импортируются необходимые библиотеки
  2. Вычисляется значение x, y и z - это три случайных числа в интервале от 0 до 10.0
  3. Значение x умножается на значение y
  4. Полученное произведение умножается на значение z
  5. Полученное значение сохраняется в переменную result
  6. Выводится значение переменной result на экран

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы