1

当我在 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
4

2 回答 2

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。

于 2011-04-05T05:35:47.113 回答
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
于 2017-06-12T11:19:03.380 回答