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