Задача Буффона об игле.Тексты программы на фортране 90, яве
Во всех учебниках по теории вероятности рассматривается задача об игле Буффона. Но не дана программа расчета,
Бросая иглу много раз на параллельные прямые, можно определить число Пи равное 3,1415926....
О ней рассказано в Википедии. https://ru.wikipedia.org/?curid=5644077&oldid=127590392 Это пример метода Монте-Карло.
Приведу текст на фортране 90.
program buffon_needle
! program buffon_needle f90. Файл программы имеет имя buffon_needle.f90
! Buffon Needle Problem Задача Буффона об игле
! Monte Carlo Simulation of needle Моделирование методом Монте-Карло иглы
! dropping on parallel lines бросок на параллельные прямые
! Simulation is used to determine the value of pi моделирование используется для определения числа Пи
! Горскин Д.В. 2023 г. 20 октября
! Using d o u b l e precision variables
real(8) pi,spacing,needle_length,ninety_degrees
real(8) position,theta,hits,trials,rr
! Initialization of variables
! Value of Pi, 17 decimal places can be stored
! for d o u b l e precision constants
pi=3.14159265358979324
! Alternative value generated by the compiler as: pi= 4 arctan(1)
! pi=4.0*datan(1.0D0)
! Number of hits
hits=0.0
! Number of experiments or trials
trials = 1.0e+03
! Spacing between lines
spacing = 2.0
! needle_length (e. g. spacing /2.0)
needle_length = 0.82624
! Ninety degrees as pi/2.0
ninety_degrees = pi/2.0
! Simulate needle dropping
ntrials=trials
do i = 1, ntrials
call random_number(rr)
position = (spacing / 2.0) * rr
call random_number(rr)
theta = ninety_degrees * rr
costheta = cos (theta)
projection = (needle_length / 2.0 ) * costheta
! Test for position of needle point
if( position .LE. projection ) then
! Score a hit
hits = hits + 1.0
endif
end do
! Evaluation of pi
prob = hits/trials
pi = (2.0*needle_length)/(spacing*prob)
! Write results
write(*,*) 'Variables:'
write(*,*) 'needle_length = ', needle_length
write(*,*) 'spacing = ', spacing
write(*,*) 'trials = ', trials
write(*,*) 'hits = ', hits
write(*,*) 'prob = ', prob
write(*,*) 'pi = ', pi
stop
end
Она видоизменена с английской версии. Никаких программ больше не нужно.
Переменные — variables
Длина иглы — needle legth
Ширина клетки или решетки — spacing
Число бросков — trials.
pi — число пи
------------------------------
Результаты расчета на Scientific Linux 7.9. Использовался компиллятор фортрана 90 gfortran без параметров оптимизации.
$ gfortran buffon_needle.f90
$ ./a.out
Variables:
needle_length = 1.0000000000000000
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 307.00000000000000
prob = 0.307000011
pi = 3.2573288713336712
./a.out
Variables:
needle_length = 1.0000000000000000
spacing = 2.0000000000000000
trials = 1000000.0000000000
hits = 318495.00000000000
prob = 0.318495005
pi = 3.1397666624028870
Variables:
needle_length = 1.0000000000000000
spacing = 2.0000000000000000
trials = 1000000.0000000000
hits = 318495.00000000000
prob = 0.318495005
pi = 3.1397666624028870
Variables:
needle_length = 1.0000000000000000
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 3184224.0000000000
prob = 0.318422407
pi = 3.1404825109460139
Variables:
needle_length = 1.0000000000000000
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 3184224.0000000000
prob = 0.318422407
pi = 3.1404825109460139
Variables:
needle_length = 1.0000000000000000
spacing = 2.0000000000000000
trials = 100000000.00000000
hits = 31827375.000000000
prob = 0.318273753
pi = 3.1419493150191089
Variables:
needle_length = 1.0000000000000000
spacing = 2.0000000000000000
trials = 1000000000.0000000
hits = 318264400.00000000
prob = 0.318264395
pi = 3.1420416977668979
Variables:
needle_length = 1.0000000000000000
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 3184224.0000000000
prob = 0.318422407
pi = 3.1404825109460139
Variables:
needle_length = 1.0000000000000000
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 3184224.0000000000
prob = 0.318422407
pi = 3.1404825109460139
Variables:
needle_length = 1.0000000000000000
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 3184224.0000000000
prob = 0.318422407
pi = 3.1404825109460139
Variables:
needle_length = 3.1459264755249023
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 7899197.0000000000
prob = 0.789919674
pi = 3.9825903537955760
Variables:
needle_length = 3.1459264755249023
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 7899197.0000000000
prob = 0.789919674
pi = 3.9825903537955760
Variables:
needle_length = 0.50000000000000000
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 1591568.0000000000
prob = 0.159156799
pi = 3.1415560136139207
Variables:
needle_length = 0.50999999046325684
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 1623147.0000000000
prob = 0.162314698
pi = 3.1420444139246682
Variables:
needle_length = 0.50099998712539673
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 1594630.0000000000
prob = 0.159463003
pi = 3.1417945029711585
Variables:
needle_length = 0.49900001287460327
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 1588442.0000000000
prob = 0.158844203
pi = 3.1414430253922800
Variables:
needle_length = 0.50000000000000000
spacing = 2.0000000000000000
trials = 10000000.000000000
hits = 1591568.0000000000
prob = 0.159156799
pi = 3.1415560136139207
Variables:
needle_length = 0.50000000000000000
spacing = 2.0000000000000000
trials = 100000000.00000000
hits = 15915599.000000000
prob = 0.159155995
pi = 3.1415718967288710
Variables:
needle_length = 0.50000000000000000
spacing = 2.0000000000000000
trials = 1000000000.0000000
hits = 159123376.00000000
prob = 0.159123376
pi = 3.1422158863872371
Variables:
needle_length = 0.50000000000000000
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 173.00000000000000
prob = 0.172999993
pi = 2.8901735279051817
Variables:
needle_length = 0.69999998807907104
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 228.00000000000000
prob = 0.228000000
pi = 3.0701753847064808
Variables:
needle_length = 0.80000001192092896
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 257.00000000000000
prob = 0.256999999
pi = 3.1128405219743422
Variables:
needle_length = 0.89999997615814209
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 278.00000000000000
prob = 0.277999997
pi = 3.2374100194980087
Variables:
needle_length = 0.85000002384185791
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 267.00000000000000
prob = 0.266999990
pi = 3.1835208107839317
Variables:
needle_length = 0.83999997377395630
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 264.00000000000000
prob = 0.263999999
pi = 3.1818180997181198
Variables:
needle_length = 0.82999998331069946
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 264.00000000000000
prob = 0.263999999
pi = 3.1439393477581090
Variables:
needle_length = 0.81999999284744263
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 262.00000000000000
prob = 0.261999995
pi = 3.1297710305722921
Variables:
needle_length = 0.82499998807907104
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 263.00000000000000
prob = 0.263000011
pi = 3.1368819474536354
Variables:
needle_length = 0.82599997520446777
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 263.00000000000000
prob = 0.263000011
pi = 3.1406841797041434
Variables:
needle_length = 0.82700002193450928
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 264.00000000000000
prob = 0.263999999
pi = 3.1325758576352083
Variables:
needle_length = 0.82499998807907104
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 263.00000000000000
prob = 0.263000011
pi = 3.1368819474536354
Variables:
needle_length = 0.82550001144409180
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 263.00000000000000
prob = 0.263000011
pi = 3.1387831768956995
Variables:
needle_length = 0.82580000162124634
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 263.00000000000000
prob = 0.263000011
pi = 3.1399238239074898
Variables:
needle_length = 0.82609999179840088
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 263.00000000000000
prob = 0.263000011
pi = 3.1410644709192805
Variables:
needle_length = 0.82620000839233398
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 263.00000000000000
prob = 0.263000011
pi = 3.1414447621344173
Variables:
needle_length = 0.82625001668930054
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 263.00000000000000
prob = 0.263000011
pi = 3.1416349077419858
Variables:
needle_length = 0.82624000310897827
spacing = 2.0000000000000000
trials = 1000.0000000000000
hits = 263.00000000000000
prob = 0.263000011
pi = 3.1415968332937481
Вывод. Результат расчетов очень сильно зависит от двух параметров- числа бросков и длины иглы (значит и ширины решетки).
Можно за 1000 бросков, как я задал в программе и длине иглы равной 0,82624 получить число Пи с точностью 5 знаков после запятой.
А можно бросить иглу 10 миллионов раз, но с длиной 0,5. И получить немного более точный результат.
При миллиарде бросков результат хуже.
У кого есть время и желание, может подобрать за 1000 бросков большее число цифр после запятой числа Пи.
Это пример обратной некорректной задачи. Мы знаем точно конечный ответ задачи об игле Буффона, и стараемся угадать величины исходных, начальных данных.
Возможно есть формула, которая связывает вид каждой цифры числа Пи после запятой с каждой цифрой после запятой числа длины иглы для заданого числа бросков?
Если есть вопросы, спрашивайте. Текст программы взят из литературы Википедии на английском языке. Но там стоит длина иглы равная 1.
отредактировал(а) marsdmitri: 2023-11-15 22:28 GMT
На Яве есть 3 разные программы.
Кому интересно, скачайте https://www.mediafire.com/file/b6vhgxrqd3dx1c4/MK_simulation_java.zip
https://www.mediafire.com/file/b6vhgxrqd3dx1c4/MK_simulation_java.zip
Мой текст немного искажается сервером, но если не удасться скачать, то напишите адресс куда можно послать.
Главный вывод. Не пытайтесь искать цифры числа Пи таким способом.
Для этого есть намного более точные, не статистические методы.
через неделю выложу простейшие аналогичные программы на си, си++, аccеблере для Линукс.
отредактировал(а) marsdmitri: 2023-10-26 23:46 GMT