Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 07.08.2011, 18:13   #1
Яна Гришина
 
Регистрация: 05.08.2011
Сообщений: 8
По умолчанию Программа для подсчёта числа pi методом Монте-Карло

Идея: вписать окружность радиуса 1 в квадрат с ребром 2, равномерно заполнить точками и посмотреть, сколько точек попадет внутрь окружности.
Отношение площадей окружности и квадрата есть pi/4 и есть отношение числа попавших внутрь точек к общему числу точек.
Вроде работает, но проблема в том, что результат сильно зависит от числа точек N (pi далеко от тройки при некоторых значениях. точнее, близко к 3 только при N~1800). И еще: pi=0.24, если в разделе объявления переменных обнулить n, и это при любом кол-ве точек.
Вот код:
Код:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
int r=2,n,N=1780,i,j;
double x,y,pi;
for (i=0;i<=N;i++)
{x=2*i*r/N-r;
for(j=0;j<=N;j++)
{y=2*j*r/N-r;
if (x*x+y*y<1) n++;}}
pi=(double)4*n/(N+1)/(N+1);
cout<<"pi="<<pi<<"\n";
    system("PAUSE");
    return 0;
}
Объясните, пожалуйста, причину "явлений" )

Последний раз редактировалось Stilet; 07.08.2011 в 19:56.
Яна Гришина вне форума Ответить с цитированием
Старый 07.08.2011, 18:23   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> если в разделе объявления переменных обнулить n

а если не обнулять, вы будете считать количество мусора во вселенной

> pi=0.24, и это при любом кол-ве точек

умножьте результат на 13.08996939

Код:
pi=(double)4 * n / (N+1 ) / (N+1);
вы уж определитесь, нужно вам делить на (N+1), или не нужно )
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 07.08.2011 в 18:26.
veniside вне форума Ответить с цитированием
Старый 07.08.2011, 20:02   #3
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 946
По умолчанию

Цитата:
Сообщение от Яна Гришина Посмотреть сообщение
Идея: вписать окружность радиуса 1 в квадрат с ребром 2, равномерно заполнить точками и посмотреть, сколько точек попадет внутрь окружности.
...
Вот код:
Код:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
int r=2,n,N=1780,i,j;
double x,y,pi;
for (i=0;i<=N;i++)
{x=2*i*r/N-r;
for(j=0;j<=N;j++)
{y=2*j*r/N-r;
if (x*x+y*y<1) n++;}}
pi=(double)4*n/(N+1)/(N+1);
cout<<"pi="<<pi<<"\n";
    system("PAUSE");
    return 0;
}
Э-э... Простите... А где, собственно, сам метод Монте-Карло?!.. Где "метание" точек в квадрат?
Vago вне форума Ответить с цитированием
Старый 17.10.2011, 22:42   #4
eiktyrnir
Новичок
Джуниор
 
Регистрация: 17.10.2011
Сообщений: 1
По умолчанию

Цитата:
Сообщение от Яна Гришина Посмотреть сообщение
Идея: вписать окружность радиуса 1 в квадрат с ребром 2, равномерно заполнить точками и посмотреть, сколько точек попадет внутрь окружности.
Отношение площадей окружности и квадрата есть pi/4 и есть отношение числа попавших внутрь точек к общему числу точек.
Вроде работает, но проблема в том, что результат сильно зависит от числа точек N (pi далеко от тройки при некоторых значениях. точнее, близко к 3 только при N~1800). И еще: pi=0.24, если в разделе объявления переменных обнулить n, и это при любом кол-ве точек.
Вот код:
Код:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
int r=2,n,N=1780,i,j;
double x,y,pi;
for (i=0;i<=N;i++)
{x=2*i*r/N-r;
for(j=0;j<=N;j++)
{y=2*j*r/N-r;
if (x*x+y*y<1) n++;}}
pi=(double)4*n/(N+1)/(N+1);
cout<<"pi="<<pi<<"\n";
    system("PAUSE");
    return 0;
}
Объясните, пожалуйста, причину "явлений" )
причина проста - чем больше плотность вброшенных случайным образом точек, тем выше сходимость метода - ну представьте себе что вы всю площадь круга заполнили... вот на Фортране решение задачи
http://physmathforum.ru/viewtopic.php?f=11&t=10
eiktyrnir вне форума Ответить с цитированием
Старый 12.11.2015, 21:37   #5
Алексей111083
Новичок
Джуниор
 
Регистрация: 12.11.2015
Сообщений: 2
По умолчанию

Eсли радиус равен одному, то почему r=2?
pi=(double)4*n/(N+1)/(N+1);.- не верно
верно pi= (double)4*n/pow(N+1, 2)
это задача 18 глава 2 для самостоятельной подготовки из само учителя Васильева по C++
При ее решение получается почему-то "три" , а может так и нужно?
Алексей111083 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Си/Си++ Нахождение площади методом Монте-Карло Маришка_Курносова Помощь студентам 3 11.11.2012 15:17
Вычисление числа Пи методом монте-карло. В чем ошибка? goblin_l Помощь студентам 4 13.04.2011 18:48
методом монте-карло Uskoff Microsoft Office Excel 1 15.01.2010 14:27
Найти интеграл методом Монте-карло ___LORD___ Общие вопросы C/C++ 2 13.05.2009 20:24
Помогите с методом Монте-Карло!!! Byanka Помощь студентам 2 09.02.2009 20:18


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840