Уважаемые любители программирования на Фортране! Предлагаю писать в данный топик тем, кто любит данный язык программирования и пишет на нем программы для студентов физико-математических специальностей. Очень надеюсь найти единомышленников. Свои работы буду выкладывать здесь.
С уважением, eiktyrnir.
Подсчет числа методом Монте-Карло.Интересно, что метод Монте-Карло можно применять в самых разных приложениях физики, математики, информационных технологиях и других областях знаний. Одним из его существенных преимуществ является то, что при большом количестве статистических данных (или статистики) совпадение в вычисляемых значениях величин очень близко к их истинному значению.
Вот к примеру высиление числа
методом Монте-Карло представленное на языке Фортран (Visual Fortran 5.0 и выше). Задача ставится формально так:
Пусть имеется квадрат со стороной равной
и вписанный в него круг (диаметр круга равен
). Случайным образом в квадрат вбрасывается несколько точек произвольным образом (по сути случайные точки в интервале
имеющие две координаты
и
например в декартовой системе координат). Требуется подсчитать число
для заданной статистики. Ограничимося к примеру статистикой
. Решение задачи в приложенном аттаче (код программы на языке Фортран приводится ниже).
Аналитическое решение задачи подсчета числа Пи методом Монте-Карло. Пусть (рисунок ниже) дан квадрат стороной
(площадь квадрата
) и пусть в него вписан круг диаметром конечно же
(площадь круга
). И пусть в квадрат врасывается случайным образом
точек. И пусть мы можем посчитать какие точки попали именно в сам круг по всей длине окружности - пусть вся их совокупность будет пусть число
, а совокупность точек которые все-таки попали в квадрат (в один их четырех его углов) пусть будет
(ну на самом деле
). Тогда справедливо следующее утверждение: Площадь круга так относится к площади квадрата в данном случае как число точек попавших в данный круг к общему числу точек вброшенных в квадрат. Т.е.
Тогда
, откуда
Все осталось "вбросить" случайным образом
точек на отрезок
по оси
и
по оси
и подсчитать какие попали в круг и подсчитать.
Код:
PROGRAM Pi
real*8 P,x,y,N_in,N_out
integer*4 i,d,N
print*, 'Plesae wait ...'
open(10,file='pi.txt')
write(10,1)
write(10,2)
!=============== Constants ===============!
N=10000000 ! The number of points
!=========== The main programm ===========!
do i=1,N
call random_number (x)
call random_number (y)
if (((x-0.5)**2+(y-0.5)**2).le.0.25) then
N_in=N_in+1
else
N_out=N_out+1
end if
end do
P=(4*N_in)/N
write(10,*) N, P
print*, 'Pi=', P
!================ The end ================!
1 format(3x, 'The resulting of calculation the number Pi:')
2 format(9x, 'N', 5x, 'Number Pi')
close(10)
END PROGRAM Pi
Вот какое значение числа
дает программа для данной статистики (данные образуются в файле
)
Неплохой результат, если учесть, что число
- совпадение до
-го знака включительно. Можете попробывать увеличить (или наоборот уменьшить) статистику (число
) чтобы увидеть меру сходимоcти (или расходимости) метода Монте-Карло для подсчета числа
.