Проблема нахождения стандартного отклонения и популяции правильно с помощью Fortran - PullRequest
1 голос
/ 05 апреля 2011

Я не мог найти много, когда искал стандартные отклонения и различия населения на фортране 95. Поэтому мне интересно, может ли кто-нибудь мне помочь? Спасибо за ваше время.

Вот что я сделал, он скомпилирован нормально, но оказалось, что он дает неправильные значения:

    SUBROUTINE ComputeStats(num, sum, avg, variance, sdv)

        REAL, INTENT(IN):: num(10)
        REAL, INTENT(OUT):: sum
        REAL, INTENT(OUT):: avg, variance, sdv

        DO i=1, 10
            sum=sum+num(i)
        END DO

        avg=sum/10

        DO i=1, 10
            variance=(((num(i)-avg)**2.0)/10)
            variance=variance+i
            sdv=variance**0.5
        END DO

    END SUBROUTINE

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Вы не правильно рассчитали дисперсию.

       variance = 0
       DO i=1, 10
         variance = variance + (((num(i)-avg)**2.0)/10)
       END DO

Это дает вам правильную дисперсию, например, 1,1,1,1,1,1,1,1,1,1, которая0, а не 10.

0 голосов
/ 12 июня 2017

Простая подпрограмма для нахождения стандартного отклонения массива

subroutine find_std(n,arr,std_dev)
integer,intent(in)::n
real,intent(in),dimension(n)::arr
real,intent(out)::std_dev
real::variance, avg
integer::i
avg=sum(arr)/n
variance=0.
do i=1,n
  variance=variance+(arr(i)-avg))**2
end do
variance=variance/n
std_dev=sqrt(variance)
end subroutine

Размер массива передается здесь в качестве первого аргумента (n). Мы можем обойти это, используя массив предполагаемой формы и поместив подпрограмму в явный интерфейс, например модуль или интерфейсный блок.

subroutine find_std(arr,std_dev)
real,intent(in),dimension(:)::arr
real,intent(out)::std_dev
real::variance, avg
integer::n,i
n=size(arr)
avg=sum(arr)/n
variance=0.
do i=1,n
  variance=variance+(arr(i)-avg)**2
end do
variance=variance/n
std_dev=sqrt(variance)
end subroutine
...