「入門 信頼性工学」第3章~第4章
福井泰好「入門 信頼性工学(第2版)」森北出版 の読後メモ。
設例について、Python [Google Colaboratory]による演算処理例を示す。
3章 信頼性工学の概要
p47 図3.6 故障率λ
(処理手順)
- ワイブル式より、DFR・CFR・IFRの各分布を計算
- 上記分布を合算(観測される故障率λの分布)
(コード)
故障率kのグラフ と同じ
- 赤色実線:観測される故障率λ曲線(バスタブ曲線)
- 青色点線:DFR分布
- 橙色点線:CFR分布
- 赤色点線:IFR分布
p47 図3.6 確率密度f
(処理手順)
- 赤色実線:観測される確率密度f曲線
- 青色点線:DFR分布
- 橙色点線:CFR分布
- 赤色点線:IFR分布
p47 図3.6 信頼度R
(処理手順)
- 赤色実線:観測される信頼度R曲線
- 青色点線:DFR分布
- 橙色点線:CFR分布
- 赤色点線:IFR分布
p52 例題3.1(1) 総試験時間 定数打切り方式
(処理手順)
- 寿命試験結果のデータを設定
- 同データを、指定個数分(故障が発現済み)/未発現に区分
- 故障が発現済み:寿命時間を加算
- 故障が未発現:指定個数の最長寿命 × 未発現データ個数
- 各区分の計算結果を合算
time_list = [45,53,55,61,65,67,70,71,74,75] # 寿命試験結果
f_num = 4 # 故障数
t_list = sorted(time_list) # 昇順に並び替え
# 故障が発現済み
confirmed = t_list[:f_num]
con_sum = sum(confirmed)
# 故障が未発現
residual = len(t_list)-len(confirmed)
res_sum = confirmed[-1] * residual
# 総試験時間Tc
total = con_sum + res_sum
print(f'定数打切り方式(故障数{f_num}個)での総試験時間Tr:{total}[時間]')
定数打切り方式(故障数4個)での総試験時間Tr:580[時間]
p52 例題3.1(2) 総試験時間 定時打切り方式
(処理手順)
- 寿命試験結果のデータを設定
- 同データを、定時までに故障が発現済み/未発現に区分
- 故障発現済み:寿命時間を加算
- 故障未発現:打切り時刻 × 未発現データ個数
- 各区分の計算結果を合算
# コードは上記の続き
f_time = 60 # 故障数
# 故障が発現済み
confirmed = [time for time in t_list if time < f_time]
con_sum = sum(confirmed)
# 故障が未発現
residual = len(t_list)-len(confirmed)
res_sum = f_time * residual
# 総試験時間Tc
total = con_sum + res_sum
print(f'定時打切り方式(打切時間{f_time}時間)での総試験時間Tc:{total}[時間]')
定時打切り方式(打切時間60時間)での総試験時間Tc:573[時間]
p53 時間推移
- Mean Time to Failure
- Mean Operating Time = Mean Time Between Failures
- Mean Time to First Failure
- Mean Up Time
- Mean Down Time
- Mean Time to Repair
p53 例題3.2 MTTF
(処理工程)
- 寿命データを設定
- 寿命の合計値 ÷ 寿命データ個数 =MTTF
t_list = [45,53,55,61,65,67,70,71,74,75] # 寿命試験結果
mttf = sum(t_list)/len(t_list)
print(f'MTTF:{mttf}時間')
MTTF:63.6時間
p54 例題3.3 MTBF
(処理工程)
- 故障時刻データを設定
- 故障時刻データの差分を計算 →故障間隔
- 故障間隔 ÷ データ個数 =MTBF
t_list = [20,45,75,100] # 故障時刻
ele_num = len(t_list) # 個数
t_list.insert(0, 0) # 冒頭時刻を追加
dif = [i-j for i, j in zip(t_list[1:], t_list[:-1])] # 運用後故障間隔
mtbf = sum(dif)/ele_num
print(f'MTBF:{mtbf}時間')
MTBF:25.0時間
p54 例題3.4 MTTFF
(処理工程)
- 運用結果データを設定
- 合計値 ÷ データ数 =MTTFF
t_list = [7,8,9] # 運用結果
mttf = sum(t_list)/len(t_list)
print(f'MTTFF:{mttf}時間')
MTTFF:8.0時間
p54 例題3.5 MTTR
(処理工程)
- 時間データ、個数データを設定
- 時間データと個数データを1対にする(辞書型)
- 時間と個数を乗算
- 同乗算データを合計 →MTTR
time = [1,2,3,4,5,6,7]
num_m = [15,10,7,3,1,1,2]
r_num = dict(zip(time,num_m))
# 補修時間×個数
t_n = 0
for rep in r_num.keys():
t_n += rep * r_num[rep]
# 表示
print(f'MTTR:{round(t_n/sum(num_m),3)}時間')
MTTR:2.385時間
p56 演習問題3.1
(処理工程)
- 確率密度、監視時刻を設定
- 次回監視迄の残時間計算式を設定
- 各監視時刻間帯域における残時間を表記
- 残時間計算式を、各監視時刻間帯域にて定積分
- 上記定積分の結果を合計
(使用モジュール)
- 計算式の文字数処理:sympy の Symbols
- 定積分:sympy の integrate
from sympy import *
# 設定値
fx = 1/60 # 確率密度
spots = [0,15,35,60] # 監視時刻
# 区間の上下限リスト
upper = spots[1:]
lower = spots[:-1]
# 次回監視までの残時間
x = Symbol('x')
t_value = [time -x for time in upper]
print(f'不具合時刻x秒のとき、次回監視までの残時間t秒')
for num in range(len(spots)-1):
print(f'・xが{lower[num]}~{upper[num]} 秒のとき:t= {t_value[num]} 秒')
# 期待値
expected60 = 0
for number in range(len(spots)-1):
element = integrate(t_value[number], (x,lower[number], upper[number]))
expected60 += element
print(f'期待値:{round(expected60 *fx,2)}秒')
不具合時刻x秒のとき、次回監視までの残時間t秒 ・xが0~15 秒のとき:t= 15 - x 秒 ・xが15~35 秒のとき:t= 35 - x 秒 ・xが35~60 秒のとき:t= 60 - x 秒 期待値:10.42秒
p56 演習問題3.2(1)
(処理工程)
- 二次関数の一般式を設定
- 既知解を与えて、定数a,b,c を求める
- 求めた確率密度関数を表示する
(使用モジュール)
- 計算式の文字数処理:sympy の var
- 方程式の解法:sympy の solve
import sympy
from sympy import *
sympy.var('x, a, b, c')
function = a*x**2 +b*x +c # 二次関数の一般式
# 設定値
x_sub0,f0value = 0,0 # f(0)=0
x_sub1,f1value = 1,0 # f(1)=0
x_subL,x_subU ,f01value = 0,1,1 # ∫f(0~1)=1
# f(0)=0 条件で、c を求める
fx0 = function.subs([(x, x_sub0)])
c_value = sympy.solve (fx0-f0value, c)
print(f'f({x_sub0})=0 より、c={c_value[0]}')
# f(1)=0 条件で、b を求める
fx1 = function.subs([(x, x_sub1),(c,c_value[0])])
b_value = sympy.solve (fx1-f1value, b)
print(f'f({x_sub1})=0 より、b={b_value[0]}')
# ∫f(0~1)=1 の条件で、a を求める
fx2 = function.subs([(c,c_value[0]),(b,b_value[0])])
a_value = sympy.solve (integrate(fx2,(x,x_subL,x_subU))-f01value,a)
print(f'f({x_subL}~{x_subU})={f01value} より、a={a_value[0]}')
# 確率密度関数f(x)
fx = function.subs([(c,c_value[0]),(b,b_value[0]),(a,a_value[0])])
print(f'よって、確率密度関数f(x)は、')
sympy.init_printing()
display(fx)
p56 演習問題3.2(2)
(処理工程)
- 確率密度関数f(x) から、期待値を求める
- 確率密度関数f(x) から、分散値を求める
(使用モジュール)
# コードは上記の続き
# 期待値
expected = integrate(x*fx,(x,0,1))
print(f'期待値:{float(expected)}')
# 分散
var = integrate((x-expected)**2*fx,(x,0,1))
print(f'分散:{float(var)}')
期待値:0.5 分散:0.05
p56 演習問題3.3 MTTF
(処理工程)
- p53 例題3.2 MTTFと同様
t_list = [300,350,400,450,500] # 寿命試験結果
mttf = sum(t_list)/len(t_list)
print(f'MTTF:{mttf}時間')
MTTF:400.0時間
p56 演習問題3.4 MTBF
(処理工程)
- p54 例題3.3 MTBFと同様
t_list = [200,405,705,960,1200] # 故障時刻
ele_num = len(t_list) # 個数
t_list.insert(0, 0) # 冒頭時刻を追加
dif = [i-j for i, j in zip(t_list[1:], t_list[:-1])] # 運用後故障間隔
mtbf = sum(dif)/ele_num
print(f'MTBF:{mtbf}時間')
MTBF:240.0時間
p56 演習問題3.5 MTTR
(処理工程)
- p54 例題3.5 MTTRと同様
time = [5,10,15,20,25,30,40,60]
num_m = [1,6,3,8,4,5,2,1]
r_num = dict(zip(time,num_m))
# 補修時間×個数
t_n = 0
for rep in r_num.keys():
t_n += rep * r_num[rep]
# 表示
print(f'MTTR:{round(t_n/sum(num_m),3)}分')
MTTR:22.0分
4章 信頼評価関数の基礎
p58 図4.1 二項分布
(処理工程)
- 二項分布の確率関数 \(f(x)=_nC_x p^x(1-p)^{n-x}\) を設定
- 全ての確率p、出現数x について上記関数で確率を計算
- グラフ化
from matplotlib import pyplot as plt
import numpy as np
import math
# 設定値
number = 10 # サンプル数
p_list = np.arange(0.1, 1, 0.2) # 確率
x_list = np.arange(11) # 出現数
# 関数 二項分布
def fx(snum,prob,xs):
return math.comb(snum,xs) * prob**xs *(1-prob)**(snum-xs)
# グラフ化
for proba in p_list: # 各確率について
fx_list =[]
for xvalue in x_list: # 各出現回数について
fx_list.append(fx(number,proba,xvalue)) # 二項分布確率をリスト化
plt.plot(x_list,fx_list,label=f'p={round(proba,2)}')
# 凡例
plt.xlabel('Number of Occurrences of Event [x]')
plt.ylabel('Probability of Appearance [y]')
plt.title(f'Sample Number={number}')
plt.legend()
plt.show()
p59 例題4.1(1) 不良品の個数がある値となる確率
(処理手順)
- 関数(二項分布)を設定
- 母集団の不良率、標本の個数、標本中の不良品数を設定
- 同関数を使用して、確率を計算
import math
# 設定値
p_frate = 0.05 # 母集団の不良率
s_num = 10 # 標本の個数
s_fail = 3 # 標本中の不良品数
# 関数 二項分布
def fx(snum,rate,xs):
return math.comb(snum,xs) * rate**xs *(1-rate)**(snum-xs)
# 演算と表示
prob_01 = fx(s_num, p_frate, s_fail)
print(f'母集団不良率{round(p_frate*100)}%のとき、標本{s_num}個中に不良品個数{s_fail}個となる確率は、{round(prob_01*100,3)}%')
母集団不良率5%のとき、標本10個中に不良品個数3個となる確率は、1.048%
p59 例題4.1(2) 不良品の個数がある値以下となる確率
(処理手順)
- 関数(二項分布の確率)を設定
- 標本中の不良品数の上限を設定
- 各不良品数の確率を上記関数で計算
- 各不良品数を生ずる事象の確率を合計する(=不良品上限以下となる事象確率)
# コードは上記の続き
s_fail_up = 2 # 標本中の不良品数の上限
# 標本中不良品数の上限まで確率を積算
prob_02 = 0
for sf in range(s_fail_up+1):
prob_02 += fx(s_num, p_frate, sf)
# 表示
print(f'母集団不良率{round(p_frate*100)}%のとき、標本{s_num}個中に不良品個数{s_fail_up}個以下となる確率は、{round(prob_02*100,3)}%')
母集団不良率5%のとき、標本10個中に不良品個数2個以下となる確率は、98.85%
p60 二項分布とポアソン分布(n=10)
(処理手順)
- 標本数n、母集団不良率pを設定
- 平均 μ=np を計算
- 二項分布のグラフを描画(複数の p)
- ポアソン分布のグラフを描画(複数の μ)
from matplotlib import pyplot as plt
import numpy as np
import math
# 設定値
number = 10 # サンプル数
p_list = [0.1, 0.5] # 確率
x_list = np.arange(number+5) # 出現数
myu_list = [number *p_value for p_value in p_list] # 平均値
# 関数 二項分布
def fx(snum,prob,xs):
return math.comb(snum,xs) * prob**xs *(1-prob)**(snum-xs)
# 関数 ポアソン分布
def Poisson(myu,xs):
return myu**xs /math.factorial(xs) *math.exp(-myu)
# 二項分布をグラフ化
for proba in p_list: # 各確率について
fx_list =[]
for xvalue in x_list: # 各出現回数について
fx_list.append(fx(number,proba,xvalue)) # 二項分布確率をリスト化
plt.plot(x_list,fx_list,label=f'p={round(proba,2)}')
# ポアソン分布をグラフ化
for myu in myu_list: # 各平均について
fx_list =[]
for xvalue in x_list: # 各出現回数について
fx_list.append(Poisson(myu,xvalue)) # ポアソン分布確率をリスト化
plt.plot(x_list,fx_list,"--", label=f'μ={round(myu,2)}')
# 凡例
plt.xlabel('Number of Occurrences of Event [x]')
plt.ylabel('Probability of Appearance')
plt.title(f'binomial distribution, SN={number}')
plt.legend()
plt.show()
- 実線:二項分布
- 破線:ポアソン分布
p60 二項分布とポアソン分布(n=100)
サンプル数を100へと増加した例(上記コードで、number = 10 を、number = 100 へと変更した場合)
- サンプル数を大きくすると(n=10 →100)、小さいp(小さい μ)について、近似度が高まる。
- サンプル数を大きくしても、大きなp(大きい μ)では、近似度は低い。
p61 図4.2 ポアソン分布の確率関数
(処理手順)
- 関数(ポアソン分布の確率分布)を設定
- 平均値、出現数のリストを設定
- 上記関数で確率リストを生成
- グラフ化
import numpy as np
import math
from matplotlib import pyplot as plt
# 設定値
myu_list = [0.1,0.5,1,3,5,8,10] # 平均値
x_list = np.arange(11) # 出現数
# 関数 ポアソン分布
def Poisson(myu,xs):
return myu**xs /math.factorial(xs) *math.exp(-myu)
# グラフ化
for myu in myu_list: # 各平均について
fx_list =[]
for xvalue in x_list: # 各出現回数について
fx_list.append(Poisson(myu,xvalue)) # ポアソン分布確率をリスト化
plt.plot(x_list,fx_list,label=f'μ={round(myu,2)}')
# 凡例
plt.xlabel('Number of Occurrences of Event [x]')
plt.ylabel('Probability of Appearance')
plt.title(f'Poisson Distribution')
plt.legend()
plt.show()
p61 例題4.2 3件以上の故障が発生する確率(余事象による計算)
(処理手順)
- 平均故障数を設定
- 故障数の下限を設定
- 関数(ポアソン分布)を設定
- 同関数で、故障数の下限未満の事象を逐次計算
- 故障数の下限未満の事象の確率を合計
- 全体確率 - 余事象(故障数の下限未満の事象)確率 =設定故障数以上となる確率
import numpy as np
import math
# 設定値
myu = 24/60 # 平均故障数[個/月]
x_under = 3 # 出現数の下限
# 関数 ポアソン分布
def Poisson(myu,xs):
return myu**xs /math.factorial(xs) *math.exp(-myu)
# 出現数の下限未満の事象確率
fx_list = [] # 各個数が生じる確率のリスト
for xs in range(x_under): # 0~出現数未満について
fx_list.append(Poisson(myu,xs)) # ポアソン分布確率をリスト化
# 余事象の確率
prob = 1-sum(fx_list) # 出現数以上となる確率
print(f'1か月あたり{x_under}件以上の故障が発生する確率:{round(prob*100,4)}%')
1か月あたり3件以上の故障が発生する確率:0.7926%
p61 連続型確率分布
- 指数分布:故障率λが時間tに依存しない(偶発故障)期間の分布。
- 正規分布:多数部品からなるアイテムの故障分布。
- 対数正規分布:材料の破壊寿命分布、機器の修理時間分布・保全時間、機械の実働加重頻度分布、電子部品の故障分布
- ワイブル分布:金属材料の疲労寿命
p63 図4.3 指数分布
(処理工程)
- 指数分布の確率密度関数 \(f(t)=\lambda e^{-\lambda t}\) を設定
- リストの全時刻\(t\)、全故障率\(\lambda\) について上記関数で確率を計算
- グラフ化
import numpy as np
import math
from matplotlib import pyplot as plt
time_list = np.arange(0,6,0.1)
lambda_list = [0.5, 0.8, 1, 1.5]
# 確率 確率密度f(t)
def fx(lamb,time):
return lamb * math.exp(-lamb *time)
# グラフを描画
for lamb in lambda_list:# 全てのλについて
fx_list = []
for time in time_list: # 全ての時間について
fx_list.append(fx(lamb, time))
plt.plot(time_list,fx_list,label=f'λ={lamb}')
# 凡例等
plt.legend()
plt.xlabel('time')
plt.ylabel('f(t)')
plt.title('Exponential Distribution')
plt.xlim(0,)
plt.ylim(0,)
plt.show()
p63 図4.4 指数分布の平均t=μと信頼度R(t)
import numpy as np
import math
from matplotlib import pyplot as plt
# 設定値
time_list = np.arange(0,6,0.1)
lamb = 0.8
# 確率 確率密度f(t)
def fx(lamb,time):
return lamb * math.exp(-lamb *time)
# 確率密度グラフを描画
fx_list = []
for time in time_list: # 全ての時間について
fx_list.append(fx(lamb, time))
plt.plot(time_list,fx_list)
# t=平均μでのグラフ区分
myu = 1/lamb # 平均μ
y_myu = fx(lamb,myu)
plt.vlines(myu,0,y_myu)
# 塗りつぶし
Ysq = np.linspace(0,0,60) # 0から0まで60個のリスト(y=0 のデータ)
plt.fill_between(time_list, fx_list, Ysq, where=(time_list>=0),fc= 'lightgrey')
plt.fill_between(time_list, fx_list, Ysq, where=(time_list>=myu),fc= 'lightblue')
# 凡例等
plt.xlabel('time')
plt.ylabel('f(t)')
plt.title('Exponential Distribution')
plt.xlim(0,)
plt.ylim(0,)
plt.xticks([myu],[r'$ \mu $' ]) # x軸目盛
plt.yticks([])
plt.show()
青色部分:\(R(t)\) 信頼度関数の値
p63 例題4.3 指数分布 故障率λ
式4.12 を\(\lambda\) について解くと、
\begin{eqnarray*}R(t)&=&e^{-\lambda t} \\log_e R(t)&=& log_e e^{-\lambda t} \\ &=& -\lambda t\\ \lambda &=& -\cfrac{log_e R(t)}{t}\end{eqnarray*}
(使用モジュール)
- 対数:math.log
import math
time =1000
Rel = 0.95
def R_lamb(Rel,time):
return -math.log(Rel)/time
lamb = R_lamb(Rel,time)
print(f'故障率:{lamb}[/時間]')
故障率:5.1293294387550576e-05[/時間]
p66 図4.5(a) 正規分布の確率密度関数 f(x)
(使用モジュール)
- 正規分布の確率密度関数(Probability Density Function):scipy.stats.norm.pdf
from matplotlib import pyplot as plt
from scipy.stats import norm
import numpy as np
myu = 0 # 平均
std_list = [0.5, 1, 2.0] # 分散
x_list = np.arange(-3,3,0.01)
for std in std_list: # 全ての分散について
fx_list = []
for x_value in x_list:
fx_list.append(norm.pdf(x_value, loc=myu, scale=std))
plt.plot(x_list,fx_list,label=f'σ={std}')
plt.xlim(-3,)
plt.ylim(0,)
plt.legend()
plt.xlabel('x')
plt.ylabel('f(x)')
plt.title('Probability Density [Normal Dist.]')
plt.show()
p66 図4.5(b) 正規分布の故障率関数λ(x)
(処理工程)
- 確率密度関数\(f(x)\) ÷ 信頼度関数\(R(x)\) =故障率関数 \(\lambda(x)\)
- 故障率関数を用いて、各\(x\) について、故障率を計算
- 所定の分散について、同計算を実施
- グラフ化
# コードは上記の続き
# 関数 ガンマ関数
def norm_gamma(x_value,myu,std):
fx = norm.pdf(x_value, loc=myu, scale=std) # 確率密度の関数
Rx = 1-norm.cdf(x_value, loc=myu, scale=std) # 信頼度の関数
return fx/Rx
for std in std_list: # 全ての分散について
sigma_list = []
for x_value in x_list:
sigma_list.append(norm_gamma(x_value, myu, std))
plt.plot(x_list,sigma_list,label=f'σ={std}')
# 凡例
plt.xlim(-3,)
plt.ylim(0,5)
plt.legend()
plt.xlabel('x')
plt.ylabel('λ(x)')
plt.title('Failure Rate [Normal Dist.]')
plt.show()
p66 例題4.4 正規分布 アイテム寿命時間
(処理工程)
- 平均、分散、下限時間を設定
- 下限時間を変数\(t\)に標準化
- 変数\(t\) に対応する正規分布の左側確率を求める
- 全確率1-左側確率 =右側確率
(使用モジュール)
- \(\sqrt{}\) 計算:math.sqrt
- 正規分布の左側確率(Cumulative Distribution Function):scipy.stats.norm.cdf
from scipy.stats import norm
import math
# 設定値
myu = 100 # 平均
var = 25 # 分散
time_lower = 90 # 下限時間
sigma = math.sqrt(var) # 標準偏差
# 標準化
t_value = (time_lower - myu)/sigma
print(f'標準化変数t= {t_value}')
# 確率
rel = 1-norm.cdf(t_value)
print(f'アイテム寿命が{time_lower}時間以上となる確率:{round(rel*100,3)}%')
標準化変数t= -2.0 アイテム寿命が90時間以上となる確率:97.725%
p67 図4.6(a) 対数正規分布 確率密度関数
import numpy as np
import math
from scipy.stats import norm
from matplotlib import pyplot as plt
# 設定データ
myu_list = [0, 0, 1] # 平均
std_list = [1, 0.5, 0.5] # 分散
z_list = np.arange(0.01,4,0.01)
# 関数 対数正規分布の確率密度 f(z)
def log_norm(z_value, myu, std):
return 1/(std * z_value) * norm.pdf((math.log(z_value)-myu)/std)
# グラフ描画
for myu,std in zip(myu_list,std_list): # 全ての平均と分散について
fz_list = []
for z_value in z_list:
fz_list.append(log_norm(z_value,myu,std))
plt.plot(z_list,fz_list,label=f'μ_L={myu}, σ_L={std}')
# 凡例
plt.xlim(0,)
plt.ylim(0,1)
plt.legend()
plt.xlabel('z')
plt.ylabel('f(z)')
plt.title('Probability Density [Log-Normal Dist.]')
plt.show()
p67 図4.6(b) 対数正規分布 故障率関数
# コードは上記の続き
# 関数 ガンマ関数
def log_norm_gamma(z_value,myu,std):
fz = log_norm(z_value, myu, std) # 確率密度の関数
Rz = norm.cdf((myu - math.log(z_value))/std) # 信頼度の関数
return fz/Rz
for myu,std in zip(myu_list,std_list): # 全ての平均と分散について
gamma_list = []
for z_value in z_list:
gamma_list.append(log_norm_gamma(z_value, myu, std))
plt.plot(z_list,gamma_list,label=f'μ_L={myu}, σ_L={std}')
plt.xlim(0,)
plt.ylim(0,2)
plt.legend()
plt.xlabel('x')
plt.ylabel('λ(x)')
plt.title('Failure Rate [Log Normal Dist.]')
plt.show()
p69 例題4.5 対数正規分布
from scipy.stats import norm
import math
# 設定値
myu_l = 5 # 平均
var_l = 1 # 分散
time = 100 # 指定時間
# 平均μ
myu = math.exp(myu_l +var_l/2)
print(f'期待値μ={round(myu,1)}[時間]')
# 標準偏差σ
left = math.exp(2 *myu_l + var_l)
right = math.exp(var_l)-1
std = math.sqrt(left*right)
print(f'標準偏差σ={round(std,1)}[時間]')
# 標準化t
t_value = (math.log(time) - myu_l)/math.sqrt(var_l)
print(f'標準化変数t= {round(t_value,4)}')
# 確率
rel = 1-norm.cdf(t_value)
print(f'運用時間{time}時間における信頼度R:{round(rel*100,2)}[%]')
# 関数 対数正規分布の確率密度 f(z)
def log_norm(z_value, myu_l, std_l):
return 1/(std_l * z_value) * norm.pdf((math.log(z_value)-myu_l)/std_l)
# 故障率λ
fz = log_norm(time,myu_l,math.sqrt(var_l)) # 確率密度
lambda_value = fz/rel
print(f'運用時間{time}時間における故障率λ:{round(lambda_value*100,4)}[%/時間]')
期待値μ=244.7[時間] 標準偏差σ=320.8[時間] 標準化変数t= -0.3948 運用時間100時間における信頼度R:65.35[%] 運用時間100時間における故障率λ:0.5647[%/時間]
p70 図4.7(a) ワイブル分布 確率密度関数
(処理工程)
- α、β、γのリストを設定
- ワイブル分布の関数を設定
- 各パラメータについてワイブル分布を計算
- グラフを描画
import numpy as np
import math
from matplotlib import pyplot as plt
# 設定データ
alpha_list = [0.5, 1, 2, 4] # 形状母数α
beta_list = [1,1,1,1] # 尺度母数β
t_list = np.arange(0.01,3,0.01)
# 関数 ワイブル分布の確率密度 f(t)
def Weibull(t_value, alpha, beta):
return alpha/beta * (t_value/beta)**(alpha-1) * math.exp(-(t_value/beta)**alpha)
# グラフ描画
for alpha,beta in zip(alpha_list,beta_list): # 全てのαとβについて
ft_list = []
for t_value in t_list:
ft_list.append(Weibull(t_value,alpha,beta))
plt.plot(t_list,ft_list,label=f'α={alpha}, β={beta}')
# 凡例
plt.xlim(0,)
plt.ylim(0,2)
plt.legend()
plt.xlabel('t')
plt.ylabel('f(t)')
plt.title('Probability Density [Weibull Dist.]')
plt.show()
p70 図4.7(b) ワイブル分布 故障確率関数
# コードは上記の続き
# 関数 λ関数
def Weibull_lambda(t_value,alpha,beta):
return (alpha * t_value**(alpha-1))/(beta**alpha)
for alpha,beta in zip(alpha_list,beta_list): # 全ての平均と分散について
lambda_list = []
for t_value in t_list:
lambda_list.append(Weibull_lambda(t_value, alpha, beta))
plt.plot(t_list,lambda_list,label=f'α={alpha}, β={beta}')
plt.xlim(0,)
plt.ylim(0,4)
plt.legend()
plt.xlabel('t')
plt.ylabel('λ(t)')
plt.title('Failure Rate [Weibull Dist.]')
plt.show()
p72 例題4.6 ワイブル分布
from scipy.special import gamma
import math
# 設定値
alpha = 5 # 形状
beta = 150 # 尺度
time = 100 # 指定時間
# 平均μ
myu = beta * gamma(1+1/alpha)
print(f'MTTF={round(myu,1)}[時間]')
# 標準偏差σ
left = gamma(1+2/alpha)
right = (gamma(1+1/alpha))**2
std = beta * math.sqrt(left - right)
print(f'標準偏差σ={round(std,2)}[時間]')
# 確率
rel = math.exp(-(time/beta)**alpha)
print(f'運用時間{time}時間における信頼度R:{round(rel*100,2)}[%]')
# 故障率λ
lambda_value = (alpha * time**(alpha-1))/(beta **alpha)
print(f'運用時間{time}時間における故障率λ:{round(lambda_value*100,4)}[%/時間]')
MTTF=137.7[時間] 標準偏差σ=31.55[時間] 運用時間100時間における信頼度R:87.66[%] 運用時間100時間における故障率λ:0.6584[%/時間]
p72 図4.8(a) 三母数ワイブル分布 確率密度関数
(処理工程)
- パラメータ α、β、γのリストを設定
- ワイブル分布の関数を設定(t<γのとき、値無しとする)
- 各パラメータについてワイブル分布を計算
- グラフを描画
import numpy as np
import math
from matplotlib import pyplot as plt
# 設定データ
alpha_list = [0.5, 1, 2, 4] # 形状母数α
beta_list = [1,1,1,1] # 尺度母数β
gamma_list = [0.2, 0.5, 1, 1.5]
t_list = np.arange(0.01,3,0.01)
# 関数 ワイブル分布(三母数)の確率密度 f(t)
def Weibull(t_value, alpha, beta, gamma):
if t_value > gamma:
ft = alpha/beta * ((t_value-gamma)/beta)**(alpha-1) * math.exp(-((t_value-gamma)/beta)**alpha)
else: # t_value < gammma のとき値なし
ft = None
return ft
# グラフ描画
for alpha,beta,gamma in zip(alpha_list,beta_list,gamma_list): # 全てのαβγについて
ft_list = []
for t_value in t_list:
ft_list.append(Weibull(t_value,alpha,beta,gamma))
plt.plot(t_list,ft_list,label=f'α={alpha}, β={beta},γ={gamma}')
# 凡例
plt.xlim(0,)
plt.ylim(0,2)
plt.legend()
plt.xlabel('t')
plt.ylabel('f(t)')
plt.title('Probability Density [Weibull_3parameters Dist.]')
plt.show()
p72 図4.8(b) 三母数ワイブル分布 故障確率関数
# コードは上記の続き
# 関数 ガンマ関数
def Weibull_lambda(t_value,alpha,beta,gamma):
if t_value > gamma:
lambda_value = alpha/beta * ((t_value-gamma)/beta)**(alpha-1)
else:
lambda_value = None
return lambda_value
for alpha,beta,gamma in zip(alpha_list,beta_list,gamma_list): # 全ての平均と分散と位置について
lambda_list = []
for t_value in t_list:
lambda_list.append(Weibull_lambda(t_value, alpha, beta, gamma))
plt.plot(t_list,lambda_list,label=f'α={alpha}, β={beta}, γ={gamma}')
plt.xlim(0,)
plt.ylim(0,4)
plt.legend()
plt.xlabel('t')
plt.ylabel('λ(t)')
plt.title('Failure Rate [Weibull_3parameters Dist.]')
plt.show()
p73 演習問題4.1 二項分布とポアソン分布
(処理工程)
- 母確率、サンプル数、所定故障上限を設定
- 故障確率を求める関数(二項分布、ポアソン分布)を設定
- 所定故障上限まで積算する
- 両関数で計算した積算結果の誤差を算出
import math
# 設例値
prob = 0.002
number = 1000
failure_limit = 4
# 二項分布による確率F(4)
def binal(number,failure,prob):
return math.comb(number,failure) *prob**failure *(1-prob)**(number-failure)
F_binal = 0
for failure in range(failure_limit+1):
F_binal += binal(number,failure,prob)
print(f'二項分布に従う場合の確率F({failure_limit}):{round(F_binal*100,2)}%')
# ポアソン分布による確率F(4)
myu = number *prob # 平均
F_poisson = 0
for failure in range(failure_limit+1):
F_poisson += (myu**failure)/math.factorial(failure) * math.exp(-myu)
print(f'ポアソン分布に従う場合の確率F({failure_limit}):{round(F_poisson*100,2)}%')
# 誤差
error = 1-F_poisson/F_binal
print(f'誤差:{round(error*100,2)}%')
二項分布に従う場合の確率F(4):94.75% ポアソン分布に従う場合の確率F(4):94.73% 誤差:0.02%
p73 演習問題4.2 ポアソン分布
(処理工程)
- 部分集合の故障率、個数を設定
- 混合集合の平均故障数を算出
- 平均故障数、所定故障数より、確率を算出
import math
# 設定値
lambda_a = 0.5
lambda_b = 0.3
num_a = 2
num_b = 2
failure_limit = 4
# 混合集団の平均
myu_a = lambda_a * num_a
myu_b = lambda_b * num_b
myu = myu_a + myu_b
# ポアソン分布による確率
F_poisson = 0
for failure in range(failure_limit+1):
F_poisson += (myu**failure)/math.factorial(failure) * math.exp(-myu)
print(f'故障{failure_limit}台以下となる確率:{round(F_poisson*100,2)}%')
故障4台以下となる確率:97.63%
p73 演習問題4.3 ポアソン分布
(処理工程)
- 故障率、個数、時間より、平均故障数を算出
- 平均故障数、所定故障数より、確率を算出
import math
# 設定値
lambda_value = 0.005 # 故障率[/時間]
num = 20
time = 15
failure_list = [0,1] # 故障数
# 平均故障数
myu = lambda_value * num * time
# ポアソン分布による故障確率
for failure in failure_list:
P_poisson = (myu**failure)/math.factorial(failure) * math.exp(-myu)
print(f'故障{failure}台となる確率:{round(P_poisson*100,2)}%')
故障0台となる確率:22.31% 故障1台となる確率:33.47%
p74 演習問題4.4 λ、MTTF、σ、R、t
(処理工程)
- 運用時間のデータを設定
- 故障率を算出
- 故障率より、平均故障寿命、標準偏差を算出
- 故障率と所定運用時刻より、信頼度を算出
- 故障率と所定信頼度より、運用時刻を算出
import math
Ope_hours = [380,60,140,430,230,310,100,160,270,290,190,250,210,340]
time_2 = 300 # (2)の運用時間
R_2 = 0.9 # (3)の信頼度
# (1) 故障率λ、平均故障寿命MTTF、標準偏差σ
lambda_value = len(Ope_hours)/sum(Ope_hours) # 故障率
MTTF = 1/lambda_value
sigma = 1/lambda_value
print(f'平均故障寿命MTTF:{MTTF}時間')
print(f'標準偏差σ:{sigma}時間')
# (2) 信頼度R
R_value = math.exp(-lambda_value * time_2)
print(f'運用{time}時間における信頼度R:{round(R_value*100,2)}%')
# (3) 運用時間t
t_3 = math.log(R_2)/(-lambda_value)
print(f'信頼度{R_2*100}%となる運用時間t:{round(t_3,2)}時間')
平均故障寿命MTTF:240.0時間 標準偏差σ:240.0時間 運用300時間における信頼度R:28.65% 信頼度90.0%となる運用時間t:25.29時間
p74 演習問題4.5 信頼度
(処理工程)
- 平均、分散を設定
- 正規分布の左側確率を計算
from scipy.stats import norm
import math
# 平均
myu_a = 65
myu_b = 70
# 分散
var_a = 25
var_b = 100
# 設定時刻
time = 50
# 確率
prob_a = norm.cdf((myu_a-time)/math.sqrt(var_a))
prob_b = norm.cdf((myu_b-time)/math.sqrt(var_b))
print(f'時刻{time}時間における信頼度R_A:{round(prob_a*100,4)}%')
print(f'時刻{time}時間における信頼度R_B:{round(prob_b*100,4)}%')
時刻50時間における信頼度R_A:99.865% 時刻50時間における信頼度R_B:97.725%
p74 演習問題4.6(1) 和の平均、分散
(処理工程)
- 所定の各時間の平均、分散を設定
- 各時間の和について、平均、分散を計算
- 分散より標準偏差を計算
- 一覧表示
import pandas as pd
import math
from scipy.stats import norm
# 設定値のDF化
ind_list = ['故障検知時間','修理時間','再調整時間']
col_list = ['平均','分散']
DF = pd.DataFrame([[6,5],[20,7],[3,4]],index=ind_list, columns=col_list)
DF.loc['総修復時間'] = DF.sum()
# 和の平均、分散
MTTR = DF['平均']['総修復時間']
sigma = math.sqrt(DF['分散']['総修復時間'])
print(f'総修復時間の期待値MTTR:{MTTR}分')
print(f'総修復時間の標準偏差σ:{sigma}分')
DF
総修復時間の期待値MTTR:29分 総修復時間の標準偏差σ:4.0分 平均 分散 故障検知時間 6 5 修理時間 20 7 再調整時間 3 4 総修復時間 29 16
p74 演習問題4.6(2) 所定時間以上となる確率=左側確率
(処理工程)
- 10台の総修復時間の平均、分散を計算
- 総修復時間5時間に対応する左側確率を求める
# コードは上記の続き
time = 5 *60
DF.loc['10台の総修復時間'] = DF.loc['総修復時間']*10
myu10 = DF['平均']['10台の総修復時間']
var10 = DF['分散']['10台の総修復時間']
# 左側確率
prob = norm.cdf((myu10-time)/math.sqrt(var10))
print(f'総修復時間が{time}分以上となる確率P:{round(prob*100,2)}%')
DF
総修復時間が300分以上となる確率P:21.46% 平均 分散 故障検知時間 6 5 修理時間 20 7 再調整時間 3 4 総修復時間 29 16 10台の総修復時間 290 160
p74 演習問題4.7
(処理工程)
- α、β、γパラメータを設定
- 公式(平均、標準偏差、信頼度、故障率)に代入
from scipy.special import gamma
import math
# 設定値
alpha, beta, gam = 4,80,15
time = 100 # (2)の設定時間
# 平均μ
myu = gam + beta * gamma(1+1/alpha)
print(f'平均故障寿命MTTF:{round(myu,2)}時間')
# 標準偏差σ
std = beta * (math.sqrt(gamma(1+2/alpha)-(gamma(1+1/alpha))**2))
print(f'標準偏差σ:{round(std,2)}時間')
# 信頼度R
Rel = math.exp(-((time-gam)/beta)**alpha)
print(f'時刻{time}時間における信頼度R:{round(Rel*100,2)}%')
# 故障率λ
lam = alpha/beta * ((time-gam)/beta)**(alpha-1)
print(f'時刻{time}時間における故障率λ:{round(lam*100,3)}%')
平均故障寿命MTTF:87.51時間 標準偏差σ:20.34時間 時刻100時間における信頼度R:27.96% 時刻100時間における故障率λ:5.997%







