# -*- coding: UTF-8 -*-
from math import *
import numpy as np
##########################################
# 指数分布の計算(P(X = x), P(X < x))
# x : データ
# ram : 母数
# pr : P(X = x)
# return : P(X < x)
##########################################
def exponential(x, ram, pr) :
f = 0.0
if x < 0 :
pr[0] = 0.0
else :
y = exp(-ram * x)
pr[0] = ram * y
f = 1.0 - y
return f
############################################
# Newton法による非線形方程式(f(x)=0)の解
# fn : f(x)を計算する関数名
# dfn : f(x)の微分を計算する関数名
# x0 : 初期値
# eps1 : 終了条件1(|x(k+1)-x(k)|<eps1)
# eps2 : 終了条件2(|f(x(k))|<eps2)
# max : 最大試行回数
# ind : 実際の試行回数
# (負の時は解を得ることができなかった)
# return : 解
# coded by Y.Suganuma
############################################
def newton(fn, dfn, x0, eps1, eps2, max, ind) :
x1 = x0
x = x1
ind[0] = 0
sw = 0
while sw == 0 and ind[0] >= 0 :
sw = 1
ind[0] += 1
g = fn(x1)
if abs(g) > eps2 :
if ind[0] <= max :
dg = dfn(x1)
if abs(dg) > eps2 :
x = x1 - g / dg
if abs(x-x1) > eps1 and abs(x-x1) > eps1*abs(x) :
x1 = x
sw = 0
else :
ind[0] = -1
else :
ind[0] = -1
return x
----------------------------------
# -*- coding: UTF-8 -*-
import numpy as np
import sys
from math import *
from function import exponential, newton
############################
# 指数分布の計算
# coded by Y.Suganuma
############################
############################
# P(X > x) - 1 + p(関数値)
############################
def exponential_f(x) :
return p - exp(-ram * x)
############################
# P(X = x)(関数の微分)
############################
def exponential_df(x) :
return ram * exp(-ram * x)
# 密度関数と分布関数の値
s = input("母数は? ")
ram = float(s)
print("目的とする結果は? ")
print(" =0 : 確率の計算( P(X = x) 及び P(X < x) の値)")
s = input(" =1 : p%値( P(X > u) = 0.01p となるuの値) ")
sw = int(s)
pr = np.empty(1, np.float)
if sw == 0 :
s = input("グラフ出力?(=1: yes, =0: no) ")
sw = int(s)
if sw == 0 :
# 密度関数と分布関数の値
s = input(" データは? ")
x = float(s)
f = exponential(x, ram, pr)
print("P(X = " + str(x) + ") = " + str(pr[0]) + ", P( X < " + str(x) + ") = " + str(f) + " (母数 = " + str(ram) + ")")
# グラフ出力
else :
file1 = input(" 密度関数のファイル名は? ")
file2 = input(" 分布関数のファイル名は? ")
s = input(" データの上限は? ")
up = float(s)
s = input(" 刻み幅は? ")
h = float(s)
out1 = open(file1, "w")
out2 = open(file2, "w")
x = 0
while x < up+0.5*h :
f = exponential(x, ram, pr)
out1.write(str(x) + " " + str(pr[0]) + "\n")
out2.write(str(x) + " " + str(f) + "\n")
x += h
out1.close()
out2.close()
# %値
else :
s = input("%の値は? ")
x = float(s)
p = 0.01 * x
if p < 1.0e-7 :
print(str(x) + "%値 = ∞ (母数 = " + str(ram) + ")")
else :
ok = np.empty(1, np.int)
f = newton(exponential_f, exponential_df, 0.0, 1.0e-6, 1.0e-10, 100, ok)
print(str(x) + "%値 = " + str(f) + " (母数 = " + str(ram) + ")")