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の正しい分散が得られます。これは10ではなく0です。

于 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 に答える