使用Fortran正确查找标准差和总体方差的问题

时间:2011-04-05 05:11:43

标签: statistics fortran standards variance deviation

当我搜索Fortran 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 个答案:

答案 0 :(得分:3)

您无法正确计算差异。

       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。

答案 1 :(得分:0)

用于查找数组标准差的简单子程序

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