2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5  След.
 
 Кружок любителей Фортрана
Сообщение06.01.2011, 19:38 
Аватара пользователя


30/11/07
389
Уважаемые любители программирования на Фортране! Предлагаю писать в данный топик тем, кто любит данный язык программирования и пишет на нем программы для студентов физико-математических специальностей. Очень надеюсь найти единомышленников. Свои работы буду выкладывать здесь.

С уважением, eiktyrnir.

Подсчет числа $\pi$ методом Монте-Карло.
Интересно, что метод Монте-Карло можно применять в самых разных приложениях физики, математики, информационных технологиях и других областях знаний. Одним из его существенных преимуществ является то, что при большом количестве статистических данных (или статистики) совпадение в вычисляемых значениях величин очень близко к их истинному значению.
Вот к примеру высиление числа $\pi$ методом Монте-Карло представленное на языке Фортран (Visual Fortran 5.0 и выше). Задача ставится формально так:
Пусть имеется квадрат со стороной равной $1$ и вписанный в него круг (диаметр круга равен $1$). Случайным образом в квадрат вбрасывается несколько точек произвольным образом (по сути случайные точки в интервале $[0;1]$ имеющие две координаты $x$ и $y$ например в декартовой системе координат). Требуется подсчитать число $\pi$ для заданной статистики. Ограничимося к примеру статистикой $N=10000000$. Решение задачи в приложенном аттаче (код программы на языке Фортран приводится ниже).
Аналитическое решение задачи подсчета числа Пи методом Монте-Карло. Пусть (рисунок ниже) дан квадрат стороной $= 1$ (площадь квадрата $S_{kv}=1^{2}=1$) и пусть в него вписан круг диаметром конечно же $=1$ (площадь круга $S_{kr}=\frac{\pi d^2}{4}=\frac{\pi}{4}$). И пусть в квадрат врасывается случайным образом $N$ точек. И пусть мы можем посчитать какие точки попали именно в сам круг по всей длине окружности - пусть вся их совокупность будет пусть число $N_{in}$, а совокупность точек которые все-таки попали в квадрат (в один их четырех его углов) пусть будет $N_{out}$ (ну на самом деле $N_{out}=N-N_{in}$). Тогда справедливо следующее утверждение: Площадь круга так относится к площади квадрата в данном случае как число точек попавших в данный круг к общему числу точек вброшенных в квадрат. Т.е.
$\frac{S_{kr}}{S_{kv}}=\frac{N_{in}}{N}$
Тогда $\frac{\pi}{4}=\frac{N_{in}}{N}$, откуда $\pi=4\frac{N_{in}}{N}$
Все осталось "вбросить" случайным образом $N$ точек на отрезок $[0;1]$ по оси $X$ и $[0;1]$ по оси $Y$ и подсчитать какие попали в круг и подсчитать.
Код:
            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

Вот какое значение числа $\pi$ дает программа для данной статистики (данные образуются в файле $pi.txt$)
$3.14078040000000$
Неплохой результат, если учесть, что число $\pi=3,14159265358979...$ - совпадение до $2$-го знака включительно. Можете попробывать увеличить (или наоборот уменьшить) статистику (число $N$) чтобы увидеть меру сходимоcти (или расходимости) метода Монте-Карло для подсчета числа $\pi$.
Изображение

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение06.01.2011, 20:32 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Люблю фортран, но в чём смысл давать его студентам на тех задачах, на которых он не имеет никаких преимуществ перед другими языками?

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение06.01.2011, 20:40 
Аватара пользователя


30/11/07
389
Munin в сообщении #396072 писал(а):
Люблю фортран, но в чём смысл давать его студентам на тех задачах, на которых он не имеет никаких преимуществ перед другими языками?

Знаете уважаемый Munin, однажды когда я в Фортране набирал программу для подсчета системы из 2-х дифф. уравнений методом Рунге-Кутта 4-го порядка то многие глядя на большую текстовку программы говорили, что это де не рационально. На что я любил (и люблю) отвечать - "чем сложнее, тем мне проще". Не всем под силу языки высокого уровня. На Фортране преимущество в том, что особых преимуществ нет. Пишешь много, но зато честно и все до конца. За тебя не делают многое операторы или встроенные функции. За себя ты многое должен написать явно сам - я уверен (лично я) - в это и состоит вся прелесть и преимущество Фортрана.

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение06.01.2011, 21:47 
Аватара пользователя


23/05/10
145
Москва
Фортран хорош на плавучке. Для таких задач очень полезны сечения массивов фортрана 90. В целочисленных же задачах, по-моему, он бесполезен.

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение06.01.2011, 23:57 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Eiktyrnir в сообщении #396076 писал(а):
Не всем под силу языки высокого уровня.

Никто не заставляет вас изучать и использовать целиком C++. Но вы легко можете ограничиться небольшим подмножеством C++, которого с лихвой хватит для ваших задач. А вот студентов заставлять учить другой язык вместе с его заскоками (древние обозначения операций, format, фиксированный формат строки) ради того, что и без этого легко делается - излишне.

Кстати, в вашем примерчике хорошо бы было подсчитывать СКО и фактическую погрешность, для наглядности Монте-Карло. Ну и вообще в смысле подсчёта $\pi$ через Монте-Карло - больше впечатляет бросание иголки.

Eiktyrnir в сообщении #396076 писал(а):
За тебя не делают многое операторы или встроенные функции. За себя ты многое должен написать явно сам - я уверен (лично я) - в это и состоит вся прелесть и преимущество Фортрана.

С таким подходом стоит писать на ассемблере. Чтобы потом поумнеть.

r-aax в сообщении #396099 писал(а):
Для таких задач очень полезны сечения массивов фортрана 90.

Вот-вот, сечения. Параллельность. Что ещё в нём сделано лучше?.. Оптимизация циклов по многомерным массивам - или это мне мерещится?

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение07.01.2011, 08:34 
Аватара пользователя


23/05/10
145
Москва
Munin в сообщении #396139 писал(а):
Вот-вот, сечения. Параллельность. Что ещё в нём сделано лучше?.. Оптимизация циклов по многомерным массивам - или это мне мерещится?

Я про параллельность не говорил)
Сечения это только на уровне синтаксиса - нагляднее писать один оператор вместо цикла.
А параллельность и оптимизация циклов это внутреннее дело компилятора, которому абсолютно все равно, на фортране или на си написан тот или иной цикл.

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение07.01.2011, 11:10 
Заслуженный участник
Аватара пользователя


30/01/06
72407
r-aax в сообщении #396187 писал(а):
А параллельность и оптимизация циклов это внутреннее дело компилятора, которому абсолютно все равно, на фортране или на си написан тот или иной цикл.

Не всё равно. В си строже требования к семантике, реализуемой компилятором, в фортране ему больше дано на откуп.

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение07.01.2011, 13:55 
Аватара пользователя


23/05/10
145
Москва
Munin в сообщении #396214 писал(а):
Не всё равно. В си строже требования к семантике, реализуемой компилятором, в фортране ему больше дано на откуп.

Например?

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение07.01.2011, 14:42 
Заслуженный участник


04/05/09
4589
r-aax в сообщении #396266 писал(а):
Munin в сообщении #396214 писал(а):
Не всё равно. В си строже требования к семантике, реализуемой компилятором, в фортране ему больше дано на откуп.

Например?
В Фортране компилятору легче определять aliasing (две переменные, ссылающиеся на одну память), что позволяет лучше оптимизировать обращения к массивам.

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение07.01.2011, 16:44 
Аватара пользователя


23/05/10
145
Москва
venco в сообщении #396279 писал(а):
В Фортране компилятору легче определять aliasing (две переменные, ссылающиеся на одну память), что позволяет лучше оптимизировать обращения к массивам.

Компилятор работает со своим промежуточным представлением программы. Ему неизвестно, на каком языке она написана (рассматриваем фортран и си компиляторы). То, как текст программы будет переведен в промежуточное представление, это дело фронтенда.

В фортране вроде есть соглашение, что параметры процедуры по умолчанию независимы (что полезно для массивов), это да. Но для си можно добиться того же, сделав подсказку restrict. Дальше различие улетучивается.

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение07.01.2011, 19:02 
Заслуженный участник


04/05/09
4589
r-aax в сообщении #396318 писал(а):
В фортране вроде есть соглашение, что параметры процедуры по умолчанию независимы (что полезно для массивов), это да. Но для си можно добиться того же, сделав подсказку restrict. Дальше различие улетучивается.
Вот если расставить правильно restrict, то C соптимизирует также как и Фортран, но мало кто это умеет и делает.

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение07.01.2011, 20:40 
Аватара пользователя


23/05/10
145
Москва
venco в сообщении #396345 писал(а):
Вот если расставить правильно restrict, то C соптимизирует также как и Фортран, но мало кто это умеет и делает.

Тут дело, видимо, в привычке.

P.S. Мне приходилось сталкиваться с большими программами, реализующими численные методы, в которых вычислительная часть с обилием циклов была написана на фортране, а интерактивная и всякие служебные штуки (не критичные по быстродействию) - на си.

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение07.01.2011, 20:42 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Если компилятор не пользуется преимуществами фортрановской семантики (заточенной под высоко-smart-ную оптимизацию), это хреновый компилятор с фортрана. Фортран как язык и жив-то ещё потому, что имеет именно такие преимущества перед остальными: позволяет выжимать больше на расчётных приложениях. Это уже очень узкая ниша, и да, свежие стандарты Си поджимают её ещё сильнее.

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение07.01.2011, 20:54 
Аватара пользователя


23/05/10
145
Москва
Нормальный компилятор с нужными опциями из аналогичного нормально написанного кода на си выжмет то же.

 Профиль  
                  
 
 Re: Кружок любителей Фортрана
Сообщение07.01.2011, 22:23 


03/10/06
826
r-aax в сообщении #396416 писал(а):
Нормальный компилятор с нужными опциями из аналогичного нормально написанного кода на си выжмет то же.

Простенькие примеры кода не помешали бы, того что лучше в фортране будет исполнено, без всяких спецопций для компилятора.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 72 ]  На страницу 1, 2, 3, 4, 5  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group