Форум программистов, компьютерный форум, киберфорум
Наши страницы

Вычисление числа Пи методом Монте-Карло - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ компиляция http://www.cyberforum.ru/cpp-beginners/thread688994.html
моя программа компилирует код которого уже нет! что делать?
C++ В каком квадранте находится точка (x, y) ? помогите написать программу в С++ в каком квадранте находится точка (x, y) и вывести номер квадранта. http://www.cyberforum.ru/cpp-beginners/thread688992.html
Класс фигура c++ C++
Класс "фигура": координаты на шахматной доске, цвет. Метод - "ход" на одну позицию в одном из 4 направлений. Производные: "конь", "пешка" (порядковый номер, или своя половина поля), "ферзь" - со...
C++ Программа с матрицами: с квадратную (n x n) работает нормально, а с m x n с выдаёт ошибку
Задание: Дана целочисленная прямоугольная матрица. Определить количество строк, содержащих хотя бы один нулевой элемент, и номер столбца, в котором находится самая длинная серия одинаковых...
C++ Удаление слова после запятой из строки, упростить программу http://www.cyberforum.ru/cpp-beginners/thread688973.html
Я написал программу для удаления одного слова после запятой, но она получилась очень громистка! Как ее можно записать проще, но чтобы так же работала? #include <conio.h> #include <string.h>...
C++ Чтение массива из файла Нужно сделать так, что бы массив читался из файла #include <iostream> #include <cstring> #include <ctime> #include <cstdlib> class TGoods подробнее

Показать сообщение отдельно
isaak
107 / 44 / 9
Регистрация: 17.10.2010
Сообщений: 685

Вычисление числа Пи методом Монте-Карло - C++

05.11.2012, 13:09. Просмотров 9474. Ответов 7
Метки (Все метки)

Всем доброго время суток. Написать программу для вычисления значения http://www.cyberforum.ru/cgi-bin/latex.cgi?\pi с помощью метода Монте-Карло. Для этого рассмотреть квадрат с центром в начале координат и длиной ребра 2, в которой вписана окружность радиуса 1 с центром в начале координат. Вероятность того, что выбранная наугад точка внутри квадрата попадет внутрь окружности равна отношению площадей окружности и квадрата, то есть http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\pi }{4}. Площадь квадрата накрывается сеткой из равноотстоящих точек (чем выше плотность точек, тем выше точность вычисления http://www.cyberforum.ru/cgi-bin/latex.cgi?\pi). Отношение точек, попавших внутрь окружности, к общему числу точек стремится (при увеличении общего количества точек к бесконечности) к вероятности попадания случайной точки внутри окружности, то есть http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\pi }{4}. Если координаты точки x и y
( -1 < x < 1 и -1 < y < 1), то условие попадания точки внутрь окружности имеет вид
http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}^{2} + {y}^{2} < 1.

Суть расчета заключается в том, что мы берем квадрат со стороной a = 2 R, вписываем в него круг радиусом R. И начинаем наугад ставить точки внутри квадрата. Геометрически, вероятность P1 того, что точка попадет в круг, равна отношению площадей круга и квадрата:
P1=Sкруг / Sквадрата = Pi*R2 / a 2 = Pi*R2 / (2 R ) 2= Pi*R2 / (2 R) 2 = Pi / 4 (1)
Вероятность попадания точки в круг можно также посчитать после численного эксперимента: посчитать количество точек, попавших в круг, и поделить их на общее количество поставленных точек:
P2=Nпопавших в круг / Nточек; (2)
Так, при большом количестве точек в численном эксперименте вероятности должны вести себя cледующим образом:
lim(Nточек→∞)/(P2-P1)=0; (3)
Следовательно:
Pi/ 4 = Nпопавших в круг / Nточек; (4)
Pi=4 * Nпопавших в круг / Nточек; (5)
При моделировании мы применяем псевдослучайные числа, которые не являются случайным процессом.
Вот сам код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<cstdio> 
#include<cmath>
#include <ctime>
#include<cstdlib> 
#include <cstdio>
#define limit_Nmax 1e7 //Максимальное количество точек
#define limit_a 1e6 //Максмиальный радиус круга
#define min_a 100 //Начальный радиус
 
double circle(double, double); //Выдает квадрат Y в зависимости от координаты Х и радиуса круга.
 
int main() 
{ 
 
double x,y,Pi; 
long long int a=min_a;//сторона квадрата
int i=0;//Счетчик 
double Ncirc=0;//Количество точек, попавших в круг 
double Nmax=a; //Общее количество точек
while (a<limit_a)  //Перебор  значений радиуса
{ 
Nmax=a; 
 while (Nmax<=limit_Nmax) // Перебор значения количества точек
 { 
 Ncirc=0; i=0; //обнуляторы
    while (i<Nmax) 
    { 
    x = (rand() % (a * 1000))/1000;  //Рандомный Х с 3 знаками после запятой
    y = (rand() % (a * 1000))/1000;  //Рандомный Y с 3 знаками после запятой
        if (y*y<=circle(x,(a/2)))  //Условие принадлежности точки к кругу
        { 
        Ncirc++; 
        } 
    i++; 
    } 
 
 Pi=(Ncirc/Nmax)*4; 
 Nmax *= 2; 
 printf("\n%lld, %.0f, %f",a,Nmax,Pi); 
 } 
a*=2; 
} 
 
} 
 
double circle(double x, double radius) 
{ 
double y=radius*radius-x*x; 
return y; 
}
Но она не правильно считает число Pi. Подскажите пожалуйста в чем ошибка???? Заранее огромное спасибо.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru