Неправильно считает интеграл - 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); }
Объяснение кода листинга программы
- #include
- подключает библиотеку для ввода и вывода данных - #include
- подключает библиотеку для математических функций - #include
- подключает библиотеку для работы со временем - double CalcMonte(int n) - объявление функции, которая вычисляет интеграл методом Монте-Карло
- double xmin = 0.0; - начальное значение переменной x
- double xmax = 3.14; - конечное значение переменной x
- double ymin = -2; - начальное значение переменной y
- double ymax = 2; - конечное значение переменной y
- double integral = 0.0; - начальное значение переменной интеграла
- double x,y,f; - объявление переменных x, y и f
- for (int i = 0; i < n; i++) - цикл, выполняющийся n раз
- *x = xmin + ((xmax-xmin)/100)(rand()%100);** - генерация случайного значения переменной x в заданном диапазоне
- *y = ymin + ((ymax-ymin)/100)(rand()%100);** - генерация случайного значения переменной y в заданном диапазоне
- f=pow(sin(x), 3) + cos(x); - вычисление значения функции f(x)
- if ((y <= f)&&(f>0)&&(y>0)) integral++; - увеличение значения интеграла, если случайная точка попадает в область, где функция положительна и y>0
- if ((y >= f)&&(f<0)&&(y<0)) integral--; - уменьшение значения интеграла, если случайная точка попадает в область, где функция отрицательна и y<0
- integral = integral(ymax-ymin)(xmax-xmin)/n ; - нормализация значения интеграла
- return integral; - возвращение значения интеграла из функции
- int main() - объявление функции, которая является точкой входа в программу
- srand((unsigned)time(NULL)); - инициализация генератора случайных чисел текущим временем
- double z=CalcMonte(100000); - вычисление значения интеграла с помощью функции CalcMonte и сохранение результата в переменную z
- std::cout << z <<
\n
; - вывод значения интеграла на экран - system(
pause
); - ожидание нажатия клавиши для завершения программы - return(0); - завершение программы с кодом 0
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д