「信頼性工学のはなし―信頼度99.9999…%をめざして」4章
大村平「信頼性工学のはなし―信頼度99.9999…%をめざして」日科技連 の読後行間補充メモ
同書籍は、印刷数表による信頼性工学の啓蒙書。
本稿では、同書籍の設例について、Python [Google Colaboratory]による演算処理例を示す。
4章 直列と並列の信頼性
p77 直列システムの信頼度
(処理工程)
- システム機能予定時間\(t\) と各部品の \(MTBF\) とを設定
- \(MTBF\) の逆数として故障率\(k\) を求める
- 故障率\(k\) とシステム機能予定時間\(t\) に基づき部品の信頼度\(r\) を求める
- 各部品の信頼度\(r\) を乗じて、直列システムの信頼度\(R\) を求める
import math # 設例値 MTBF1 = 1000 MTBF2 = 2000 MTBF3 = 2500 time = 100 # 故障率 k1 = 1/MTBF1 k2 = 1/MTBF2 k3 = 1/MTBF3 # 部品の信頼度 r1 = math.exp(-k1* time) r2 = math.exp(-k2* time) r3 = math.exp(-k3* time) Reliability = r1*r2*r3 print(f'直列システム[{time}時間経過後]の信頼度:{round(Reliability,3)}')
直列システム[100時間経過後]の信頼度:0.827
p79 直列システムの信頼度
同じ信頼度 \(r\) を有する部品の部品点数(横軸)と直列システムの信頼度\(R\)(縦軸)との関係グラフ。
from matplotlib import pyplot as plt import numpy as np # 設定値 reliability = [0.98, 0.99, 0.995, 0.997, 0.998, 0.999, 0.9995, 0.9999] numbers = np.arange(0,2001,1) # 直列システムの信頼度 Rel = [] for rel in reliability: Rel.append(rel ** numbers) # グラフ描画 for graph in range(len(reliability)): plt.plot(numbers,Rel[graph], label = reliability[graph]) # 表示設定 plt.ylim(0.01,1) plt.xlabel('Number of parts') plt.ylabel('Reliability') plt.legend(loc='right') plt.title('Series System') plt.show()
p79 図42 直列システムの信頼度
上記と同じデータを、縦軸について、対数表示とした場合。
# コードは上記の続き for graph in range(len(reliability)): plt.plot(numbers,Rel[graph], label = reliability[graph]) # y軸を対数表記 plt.yscale('log') # 補助目盛 plt.grid(which='major',color='gray',linestyle='--') plt.grid(which='minor',color='gray',linestyle='--') # 表示設定 plt.ylim(0.01,1) plt.xlabel('Number of parts') plt.ylabel('Reliability') plt.legend(loc='right') plt.title('Series System') plt.show()
p85 並列システムの信頼度
(処理工程)
- システム機能予定時間\(t\) と各部品の \(MTBF\) を設定
- \(MTBF\) の逆数として故障率\(k\) を求める
- 故障率\(k\) とシステム機能予定時間\(t\) に基づき部品の信頼度\(r\) を求める
- 各部品の故障している確率\(1-r\) から、並列システムの信頼度\(R\) を求める
import math # 設例値 MTBF1 = 1000 MTBF2 = 2000 MTBF3 = 2500 time = 100 # 故障率 k1 = 1/MTBF1 k2 = 1/MTBF2 k3 = 1/MTBF3 # 部品の信頼度 r1 = math.exp(-k1* time) r2 = math.exp(-k2* time) r3 = math.exp(-k3* time) Reliability = 1-(1-r1)*(1-r2)*(1-r3) print(f'並列システム[{time}時間経過後]の信頼度:{round(Reliability,5)}')
並列システム[100時間経過後]の信頼度:0.99982
p86 表4.1 並列システムの信頼度
(処理工程)
- 部品点数(冗長度)\(m\) と各部品の信頼度 \(r\) を設定
- 各部品の故障している確率\(1-r\) から並列システムの信頼度\(R\) を求める関数を設定
- 各部品の信頼度\(r\) と冗長度\(m\) との組み合わせに対応した並列システムの信頼度\(R\) を計算
- 信頼度\(R\) の計算結果を一覧表化
- 一覧表上で1でも、実際数値が1ではないものを空欄処理
# 表4.1 import pandas as pd # 設例値 rels = [0.6, 0.8, 0.9, 0.95, 0.98] # 部品の信頼度リスト m_vals = [1,2,3,4,5] # 部品点数(冗長度)リスト # 関数 並列システム信頼度 def Reliability(rel,m_value): # 部品信頼度、部品点数 return 1-(1-rel)** m_value # 信頼度と点数との組合せ datas = [] for rel in rels: vals = [] for m_val in m_vals: vals.append(Reliability(rel, m_val)) # 関数で演算 datas.append(vals) # DF化 DF = pd.DataFrame(datas, columns=m_vals,index =rels ).T pd.options.display.precision = 7 # 桁数表記の調整 # 数値が1でないセルの情報を表記し、DF上では空白化する for column in DF.columns: for index in DF.index: if DF.loc[index,column] == 1: # 数値が1である場合 DF.at[index,column] =1 elif DF.loc[index,column] >= 0.999999995: # 9桁目四捨五入で1になる場合 print(f'部品点数{index}・部品信頼度{column}の数値:{DF.loc[index,column]}\n') DF.at[index,column] = '' DF
p92 表4.2 直列・並列などが混ざったシステム(排反事象の一覧)
(処理工程)
- 部品番号、各部品の信頼度、ルート情報(システム稼働と言えるにはどの部品を通過することが必要かの複数の排反事象=選択肢)を設定
- 各部品の正常/故障の全パターンを生成
- 特定の正常/故障パターンにおける正常部品が、ルート情報に含まれる特定の部品通過ルートの部品を全て包含するか(システムが稼働と言えるか)を、全部品通過ルートについて判定する
- 上記判定の結果、いずれかの部品通過ルートで包含判定(システム稼働判定)が出れば、当該正常/故障パターンを〇とし、いずれの部品通過ルートでも包含判定が出ない場合(システム稼働せず)は、当該正常/故障パターンを×とする
- 上記3と4を処理する関数を設定し、同関数に基づき、システムが稼働と言えるか否かを、各部品の正常/故障パターンの全てについて、〇×判定する
- 判定結果を、一覧表化
- 組み合わせパターン取得: itertools.combinations を利用
- 集合の包含関係の判定: issuperset を利用
- セット型への変換: set を利用
import itertools import pandas as pd # 設定情報 original = [1,2,3,4,5] # 部品番号 rlist = [1, 0.9, 0.8, 0.7, 0.6, 0.5] # 部品の信頼度(冒頭1は位置合わせ用) route_list = [[1,3] ,[1,5,4] ,[2,4] ,[2,5,3]] # 移動可能ルート # 関数 combi集合 が route_list の要素 route 集合のいずれかを包含するか def contain(combi, route_list): check = [] for route in route_list: check.append(combi.issuperset(route)) # 集合包含の判定結果をリスト化 return any(check) # リスト中にTrueが1つでも含まれるか(combiは〇判定か) # combi を original より生成 combination = [] for num in range(1,len(original)+1): # 1個~5個 for combi in itertools.combinations(original, num): # 組合せ=combi combination.append(set(combi)) # set型に変換してリスト格納 combination.append(set({})) # 0個コンビも追加 combination.sort(key=len,reverse = True) # 並べ替え # combi の〇×判定 pass_fail = [] for combi in combination: pass_fail.append([combi,contain(combi,route_list)]) # 関数で包含判定 # 判定結果のDF化 DF = pd.DataFrame(pass_fail,columns =['Item','System']) DF_all = DF.replace({True:'〇', False:'×'}) # 〇×表記に変換 DF_all
Item System 0 {1, 2, 3, 4, 5} 〇 1 {1, 2, 3, 4} 〇 2 {1, 2, 3, 5} 〇 3 {1, 2, 4, 5} 〇 4 {1, 3, 4, 5} 〇 5 {2, 3, 4, 5} 〇 6 {1, 2, 3} 〇 7 {1, 2, 4} 〇 8 {1, 2, 5} × 9 {1, 3, 4} 〇 10 {1, 3, 5} 〇 11 {1, 4, 5} 〇 12 {2, 3, 4} 〇 13 {2, 3, 5} 〇 14 {2, 4, 5} 〇 15 {3, 4, 5} × 16 {1, 2} × 17 {1, 3} 〇 18 {1, 4} × 19 {1, 5} × 20 {2, 3} × 21 {2, 4} 〇 22 {2, 5} × 23 {3, 4} × 24 {3, 5} × 25 {4, 5} × 26 {1} × 27 {2} × 28 {3} × 29 {4} × 30 {5} × 31 {} ×
p93 表4.3 直列・並列などが混ざったシステム(信頼度の集計計算)
(処理工程)
- 一覧表(システムが稼働と言えるか否かを、各部品の正常/故障パターンの全てについて、〇×判定したもの)から、〇のもののみを抽出する。
- 各パターンについて、正常部品の信頼度、故障部品の故障している確率を乗じて、システムの信頼度を計算する
- 一覧表化
# コードは上記の続き DFT = DF[DF['System'] == True] # ○判定のものを抽出 DFT = DFT.reset_index(drop=True) # 関数 システム信頼度計算 def rcalc(passline): # DFTの行数 # 正常部品の信頼度 mult_p = 1 mult_pl = [] for items in list(DFT['Item'][passline]): mult_pl.append(rlist[items]) mult_p = mult_p * rlist[items] # 故障部品の故障確率 diff = set(original) - DFT['Item'][passline] # 差分 mult_f = 1 mult_fl = [] for diffitems in diff: mult_fl.append(round(1-rlist[diffitems],1)) mult_f = mult_f * round(1-rlist[diffitems],1) return [mult_pl, mult_fl, mult_p * mult_f] # 正常確率、故障確率、信頼度 # 演算 p_parts = [] # 正常部品の信頼度リスト f_parts = [] # 故障部品の故障確率リスト system_r = [] # 信頼度リスト for tline in range(DFT.shape[0]): p_parts.append(rcalc(tline)[0]) f_parts.append(rcalc(tline)[1]) system_r.append(rcalc(tline)[2]) # DF化 DFTR = pd.DataFrame([p_parts, f_parts, system_r]).T DFTR.columns = ['正常部品の信頼度','故障部品の故障確率','信頼度'] print(f'システムの信頼度:{DFTR.iloc[:,2].sum()}\n') DFTR