Вычисление интеграла методом Монте-Карло - 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;

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

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

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


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

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

10   голосов , оценка 4.4 из 5
Похожие ответы