Неправильно считает интеграл - 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