Неправильно считает интеграл - C (СИ)

Узнай цену своей работы

Формулировка задачи:

написал два метода Симпсона и Монте-Карло, но 2-ой не правильно считает, помогите пожалуйстаю Значение у Симпсона получается: 1.3352, у Монте-Карло: 0.05338. Вот метод Монте-Карло:
double CalcMonte(int n)// метод Монте-Карло
{
    double part = 0.0;
    double part1 = 3.14;
    double integral = 0.0; 
    for (int i = 0; i <= n; i++)
    {
        double x = (3.14 / double(n)) * rand();
        double y = (1.0 / double(n)) * rand();
        if (fabs(y) <= pow(sin(x), 3) + cos(x))
                    integral++;
    }
    integral = integral / (double)n * (part1 - part);
    return integral;
}
Зарание спасибо.

Решение задачи: «Неправильно считает интеграл»

textual
Листинг программы
#include <iostream>
#include <math.h>
#include <time.h>
double CalcMonte(int n)// метод Монте-Карло
{
        double xmin = 0.0;
        double xmax = 3.14;
        double ymin = -2;
        double ymax = 2;
        double integral = 0.0;
        double x,y,f; 
        
        for (int i = 0; i < n; i++)
        {
                x = xmin + ((xmax-xmin)/100)*(rand()%100);
                y = ymin + ((ymax-ymin)/100)*(rand()%100);
                f=pow(sin(x), 3) + cos(x);
                if ((y <= f)&&(f>0)&&(y>0)) integral++;
                if ((y >= f)&&(f<0)&&(y<0)) integral--;
 
        }
        integral = integral*(ymax-ymin)*(xmax-xmin)/n ;
        return integral;
} 
int main()
{
    srand((unsigned)time(NULL));
    double z=CalcMonte(100000);
    std::cout << z << "\n" ;
    system("pause");
    return(0);
}

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

  1. #include - подключает библиотеку для ввода и вывода данных
  2. #include - подключает библиотеку для математических функций
  3. #include - подключает библиотеку для работы со временем
  4. double CalcMonte(int n) - объявление функции, которая вычисляет интеграл методом Монте-Карло
  5. double xmin = 0.0; - начальное значение переменной x
  6. double xmax = 3.14; - конечное значение переменной x
  7. double ymin = -2; - начальное значение переменной y
  8. double ymax = 2; - конечное значение переменной y
  9. double integral = 0.0; - начальное значение переменной интеграла
  10. double x,y,f; - объявление переменных x, y и f
  11. for (int i = 0; i < n; i++) - цикл, выполняющийся n раз
  12. *x = xmin + ((xmax-xmin)/100)(rand()%100);** - генерация случайного значения переменной x в заданном диапазоне
  13. *y = ymin + ((ymax-ymin)/100)(rand()%100);** - генерация случайного значения переменной y в заданном диапазоне
  14. f=pow(sin(x), 3) + cos(x); - вычисление значения функции f(x)
  15. if ((y <= f)&&(f>0)&&(y>0)) integral++; - увеличение значения интеграла, если случайная точка попадает в область, где функция положительна и y>0
  16. if ((y >= f)&&(f<0)&&(y<0)) integral--; - уменьшение значения интеграла, если случайная точка попадает в область, где функция отрицательна и y<0
  17. integral = integral(ymax-ymin)(xmax-xmin)/n ; - нормализация значения интеграла
  18. return integral; - возвращение значения интеграла из функции
  19. int main() - объявление функции, которая является точкой входа в программу
  20. srand((unsigned)time(NULL)); - инициализация генератора случайных чисел текущим временем
  21. double z=CalcMonte(100000); - вычисление значения интеграла с помощью функции CalcMonte и сохранение результата в переменную z
  22. std::cout << z << \n; - вывод значения интеграла на экран
  23. system(pause); - ожидание нажатия клавиши для завершения программы
  24. return(0); - завершение программы с кодом 0

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


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

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

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