FC2ブログ

# 標準正規分布 (逆関数) Standard Normal Distribution (Inverse Function)
# 引数 累積確率 ($X)
# 戻り値 標準正規分布 (逆関数) (@InverseFunction)
sub STANDARDNORMALDISTRIBUTIONINVERSE{
my ($X) = @_;
my @InverseFunction = ();

# 累積確率の確認
if(($X < 0) || (1 < $X)){
return "Error";
}

if(($X == 0) || ($X == 1)){
return "Inf";
}

# 標準正規分布 (逆関数) Standard Normal Distribution (Inverse Function)
# 下側 Lower
$InverseFunction[0] = &BISECTIONMETHOD($X);
# 上側 Upper
$InverseFunction[1] = -$InverseFunction[0];

return @InverseFunction;
}

# 二分法 Bisection Method
# 引数 累積確率 ($X)
# 戻り値 二分法 ($BisectionMethod)
sub BISECTIONMETHOD{
my ($X) = @_;
my $BisectionMethod = 0;
my $X1 = 0;
my $X2 = 0;
my $F_m = 0;
my $F_x1 = 0;
my $F_x2 = 0;
my $Middle = 0;
my $PrevMiddle = 0;
my $Limit = 100;
my $Epsilon = 1.0e-20;

# 区間
$X1-- while((&STANDARDNORMALDISTRIBUTION($X1) - $X) > 0);
$X2++ while((&STANDARDNORMALDISTRIBUTION($X2) - $X) < 0);

# 初期値
$F_x1 = &STANDARDNORMALDISTRIBUTION($X1) - $X;
$F_x2 = &STANDARDNORMALDISTRIBUTION($X2) - $X;

# 計算
for(my $i = 0; $i < $Limit; $i++){
# 一つ前
$PrevMiddle = $Middle;
# 中間点
$Middle = ($X1 + $X2) / 2;

# f(Middle)
$F_m = &STANDARDNORMALDISTRIBUTION($Middle) - $X;

# 置き換え
if(($F_m * $F_x1) > 0){
$X1 = $Middle
}
elsif(($F_m * $F_x2) > 0){
$X2 = $Middle;
}

# 二分法 Bisection Method
$BisectionMethod = $Middle;

# 収束判定
last if(abs($Middle - $PrevMiddle) < $Epsilon);
}

return $BisectionMethod;
}

# 標準正規分布 Standard Normal Distribution
# 引数 変数 ($X)
# 戻り値 標準正規分布 ($StandardNormalDistribution)
sub STANDARDNORMALDISTRIBUTION{
my ($X) = @_;
my $StandardNormalDistribution = 0;
my $SimpsonsRule = 0;
my $h = 0.01;
my $i = 1;
my $Sum = 0;
my $SumA = 0;
my $SumB = 0;
my $PrevSum = 0;
my $Epsilon = 1.0e-20;

do {
# 刻み幅 $h は適当
my $T = $X - ($i * $h);
my $Number = ($i % 2 == 0 ? 2 : 4);
my $Temp = &PROBABILITYDENSITY($T);

$PrevSum = $Sum;
$Sum += $Number * $Temp;
$i++;
} while(($Sum - $PrevSum) >= $Epsilon);

$SumA = &PROBABILITYDENSITY($X);
$SumB = &PROBABILITYDENSITY((($h * $i) - $X));

# シンプソンの公式 Simpson's Rule
$SimpsonsRule = ($SumA + $Sum + $SumB) * ($h / 3);

# 下側累積確率 Lower Probability
$StandardNormalDistribution = $SimpsonsRule;

return $StandardNormalDistribution;
}

# 確率密度 Probability Density
# 引数 累積確率 ($X)
# 戻り値 確率密度 ($ProbabilityFunction)
sub PROBABILITYDENSITY{
my ($X) = @_;
my $ProbabilityDensity = 0;
my $Pi = atan2(1, 1) * 4;

# 確率密度 Probability Density
$ProbabilityDensity = exp(-(($X * $X) / 2)) / sqrt(2 * $Pi);

return $ProbabilityDensity;
}


参考URL
標準正規分布(逆関数) - 高精度計算サイト

一言
これでいいのかな???
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

Author:雨宮
Firefoxを使用しているので気づかなかったけど、IE6でソースコードを上手くコピーできない

5/3
携帯用ならIE6でもソースコードをコピーできる
携帯用

検索フォーム


あわせて読みたいブログパーツ
一寸先は闇 RSS

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。