Return Period (再現期間) 河川屋 2006/07/14 23:42:14 └つづき。 河川屋 2006/07/14 23:44:35
Return Period (再現期間) 河川屋 2006/07/14 23:42:14 ツリーへ
Return Period (再現期間) |
返事を書く |
河川屋 2006/07/14 23:42:14 | |
たまには、何となく実務計算らしいものを。 過去のデータを用い、今年の大雨は何年に1度クラスの雨だったかを計算するプログラムです。 よくみると、偏差値を計算し、偏差値から順位を推測 するのと全く同じ方法だったりします。 DECLARE EXTERNAL FUNCTION NORM.NORMSDIST DECLARE EXTERNAL FUNCTION NORM.NORMSINV DIM Y(100) OPEN #1: NAME "RAIN.TXT" !各年最大日雨量 ! データの最後にマイナスの値を入れておく。 LET N=0 INPUT #1: R DO WHILE R>0 LET N=N+1 LET Y(N)=LOG10(R) !年最大値(=極値)は対数をとると正規分布になる。 INPUT #1:R LOOP CLOSE #1 PRINT N CALL STDEVA(Y,N,MEAN,SIGMA) PRINT "今年の大雨の雨量="; INPUT PROMPT "今年の大雨の雨量=":R0 LET R0=LOG10(R0) LET HENSA=(R0-MEAN)/SIGMA LET PROB=1/(1-NORMSDIST(HENSA)) LET KETA=1-LOG10(PROB) LET PROB=ROUND(PROB,KETA) !計算結果の有効桁は1桁強のため、それなりに丸める。 PRINT "今年の大雨は " ,PROB,"年に1回の大雨です" STOP SUB STDEVA(Y(),N,MEAN,SIGMA) !不偏標準偏差と平均を求める。 LET TX=0 LET TXX=0 FOR I=1 TO N LET TX=TX+Y(I) LET TXX=TXX+Y(I)*Y(I) NEXT I LET MEAN=TX/N LET SIGMA=SQR((N*TXX-TX*TX)/N/(N-1)) END SUB END MODULE NORM !標準正規累積分布関数の近似計算 !MS-EXCELの同名関数と同じ動作ですが少し計算精度が悪い。 PUBLIC FUNCTION NORMSDIST PUBLIC FUNCTION NORMSINV EXTERNAL FUNCTION NORMSDIST(X) LET SPI=SQR(2*PI) LET W=1/(1+0.2316419*X) LET D=EXP(X^2/(-2))/SPI LET NORMSDIST=1.0-D*(0.3193815*W-0.3565638*W^2+1.781478*W^3-1.821256*W^4+1.330274*W^5) END FUNCTION EXTERNAL FUNCTION NORMSINV (P) !Hastingsの式で第1近似(=ANS0)を求め、NEWTON法で精度を上げる。 LET PP=P IF PP > 0.5 THEN LET PP=1-P LET Z=SQR(-2.0*LOG(PP)) LET ANS0=Z-(0.27061*Z+2.30753)/((0.04481*Z+0.99229)*Z+1.0) LET P0=1-NORMSDIST(ANS0) LET SPI=SQR(2*PI) LET D=EXP(ANS0^2/(-2))/SPI LET ANS=ANS0+(P0-PP)/D IF P >= 0.5 THEN LET NORMSINV=ANS ELSE LET NORMSINV=-ANS END FUNCTION END MODULE |
└つづき。 河川屋 2006/07/14 23:44:35 ツリーへ
Re: Return Period (再現期間) |
返事を書く |
河川屋 2006/07/14 23:44:35 | |
つづき。 標準偏差と平均を求める方法ですが、前投稿は説明用で、こちらが実務用です。 (前のでも間違いとはいえないけど....) 統計の本を見る場合、「確率紙」に言及している本なら、こういうやりかたも 載っています。(注:おなじみの方法と、標準偏差の推定値は一致しない。) SUB STDEVA(Y(),N,MEAN,SIGMA) !不偏標準偏差と平均を求める(順序確率による。) LET M=N !全年使用 ! LET M=5 !上位5年使用 (裾の部分のみを合わせたいとき) ! LET M=INT(N/10+0.5) !上位1/10個を使用 ( 〃 ) ! 降順に並べ換える FOR I=1 TO N-1 LET K=I FOR J=I+1 TO N IF Y(K)<Y(J) THEN LET K=J NEXT J IF K<>I THEN SWAP Y(I),Y(K) NEXT I ! 最小2乗直線回帰により傾き(=SIGMA)、切片(=MEAN)を求める LET TX=0 LET TXX=0 LET TXY=0 FOR I=1 TO M LET PL=I/(N+1) !プロットポジション=トーマス法 !LET PL=(2*I-1)/(2*N) !プロットポジション=ヘイズン法 LET X=-NORMSINV(PL) LET TX=TX+X LET TY=TY+Y(I) LET TXX=TXX+X*X LET TXY=TXY+X*Y(I) NEXT I LET MEAN=(TXX*TY-TX*TXY)/(M*TXX-TX*TX) LET SIGMA=(M*TXY-TX*TY)/(M*TXX-TX*TX) END SUB |