# 対数正規分布 Logarithmic Normal Distribution # 引数 変数 平均 標準偏差 ($X, $Mean, $StandardDeviation) # 戻り値 対数正規分布 (@LogarithmicNormalDistribution) sub LOGARITHMICNORMALDISTRIBUTION{ my ($X, $Mean, $StandardDeviation) = @_; my @LogarithmicNormalDistribution = (); my $LnX = log($X) / log(exp(1)); my $LogNormalX = ($LnX - $Mean) / $StandardDeviation; my $SimpsonsRule = 0; # 確率密度関数 Frequency Function $LogarithmicNormalDistribution[0] = &FREQUENCYFUNCTION($LnX, $Mean, $StandardDeviation) / $X; # 標準正規分布で出す # シンプソンの公式 Simpson's Rule $SimpsonsRule = &SIMPSONSRULE($LogNormalX, 0, 1); # 下側累積確率 Lower Cumulative Distribution $LogarithmicNormalDistribution[1] = 0.5 + $SimpsonsRule; # 上側累積確率 Upper Cumulative Distribution $LogarithmicNormalDistribution[2] = 0.5 - $SimpsonsRule; return @LogarithmicNormalDistribution; } # 確率密度関数 Frequency Function # 引数 変数 ($X) # 戻り値 確率密度関数 (@FrequencyFunction) sub FREQUENCYFUNCTION{ my ($X, $Mean, $StandardDeviation) = @_; my $FrequencyFunction = 0; my $Pi = atan2(1, 1) * 4; # 正規分布 Frequency Function $FrequencyFunction = (1 / ($StandardDeviation * sqrt(2 * $Pi))) * exp(-((($X - $Mean) * ($X - $Mean)) / (2 * ($StandardDeviation * $StandardDeviation)))); return $FrequencyFunction; } # シンプソンの公式 Simpson's Rule # 引数 変数 ($X) # 戻り値 シンプソンの公式 (@SimpsonsRule) sub SIMPSONSRULE{ my ($X, $Mean, $StandardDeviation) = @_; my $SimpsonsRule = 0; my $a = 0; my $b = $X; my $N = 100; my $h = ($b - $a) / $N; my $Sum = 0; my $SumA = 0; my $SumB = 0; # 計算 $SumA = &FREQUENCYFUNCTION($a, $Mean, $StandardDeviation); $SumB = &FREQUENCYFUNCTION($b, $Mean, $StandardDeviation); # 分割数は適当 for(my $i = 1; $i < $N; $i++){ my $t = $a + ($i * $h); my $num = ($i % 2 == 0 ? 2 : 4); my $tmp = &FREQUENCYFUNCTION($t, $Mean, $StandardDeviation); $Sum += $num * $tmp; } # シンプソンの公式 Simpson's Rule $SimpsonsRule = ($SumA + $Sum + $SumB) * ($h / 3); return $SimpsonsRule; }