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

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

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

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

Ответ
 
Опции темы
Старый 07.08.2011, 19: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 в 20:56.
Яна Гришина вне форума   Ответить с цитированием
Старый 07.08.2011, 19: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 в 19:26.
veniside вне форума   Ответить с цитированием
Старый 07.08.2011, 21:02   #3
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 943
По умолчанию

Цитата:
Сообщение от Яна Гришина Посмотреть сообщение
Идея: вписать окружность радиуса 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, 23: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, 22: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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


00:11.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.