Задача Буффона об игле.Тексты программы на фортране 90, яве

Автор
Сообщение
marsdmitri
#58562 2023-10-20 18:35 GMT

Во всех учебниках по теории вероятности рассматривается задача об игле Буффона. Но не дана программа расчета,

Бросая иглу много раз на параллельные прямые, можно определить число Пи равное 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
marsdmitri
#58576 2023-10-22 23:54 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