вторник, 5 апреля 2011 г.

ПРАКТИКУМ. Элементарные статистики

В этом практикуме мы рассмотрим код стандарта fortran77 на примере программы вычисления элементарных статистик. Программа взята из Библиотеки численного анализа НИВЦ МГУ

Подпрограмма: BS01R
Назначение: вычисление среднего, среднего отклонения, среднеквадратического отклонения и дисперсии заданной выборки

      SUBROUTINE BS01R(DATA,N,AVE,ADEV,VAR,SDEV)
      DIMENSION DATA(N)
      INTEGER N,J
      REAL DATA,AVE,ADEV,VAR,SDEV,S,P,ABS,SQRT
C      IF(N.LE.1)PAUSE 'N must be at least 2'
      S=0.
      DO 11 J=1,N
        S=S+DATA(J)
11    CONTINUE
      AVE=S/N
      ADEV=0.
      VAR=0.
      DO 12 J=1,N
        S=DATA(J)-AVE
        ADEV=ADEV+ABS(S)
        P=S*S
        VAR=VAR+P
12    CONTINUE
      ADEV=ADEV/N
      VAR=VAR/(N-1)
      SDEV=SQRT(VAR)
      RETURN
      END
---------------------------------------------------------------

Рассмотрим особенности синтаксиса программы:

1) В блоке объявления переменных после указания типа переменной сразу идёт именование переменной ( INTEGER N,J ).

2) Пятая строчка начинается с символа "С" - это значит, что данная строка за комментирована, т.е. компилятор будет игнорировать эту строчку.

3) Циклы оформлены в виде меток, т.е. тело цикла для переменной J заканчивается меткой "11". Рядом с меткой 11 (которая может занимать с 2 по 5 включительно позиции от начала строки ) стоит оператор CONTINUE. Он ничего не выполняет, но необходим для объявления самой метки. Саму по себе метку (без других операторов, таких как CONTINUE) ставить нельзя.

4) При присваивании действительным переменным типа real ставится точка после целой части (S=0.) . Это не требование синтаксиса, но страхует от некоторых ошибок.

5) SQRT и ABS - не переменные, а встроенные функции фортрана извлечения квадратного корня и взятия модуля. Хотя по синтаксису они мало отличаются от массивов, обычно эти функции "подкрашиваются" IDE, т.е. той программной оболочкой, где Вы пишете программу.

Комментариев нет:

Отправить комментарий

Как перевести UV в направление и скорость ветра? How to convert wind UV-components to direction and velocity?

 Всё просто.  def uv2dir(u, v):     '''     Источник:     https://github.com/blaylockbk/Ute_WRF/blob/master/functions/wind_calc...