制作物#4 アイリングモデルを用いた製品寿命予測
1. 背景と目的
アイリングモデルを使用して製品の故障時間(MTTF)を予測するためのPythonスクリプトを作成し、実験条件および市場条件下での製品寿命予測を行うことです。これにより、温度と湿度の変動が製品の寿命に及ぼす影響を定量的に評価することが可能となり、実験データから適切なパラメータを推定し、実用的な予測モデルを構築します。
スクリプトには、仮のデータを入れています。
2. システム要件
2.1 機能要件
アイリングモデルの実装:
製品の寿命予測モデルとして、以下のアイリングモデルを使用します。
MTTF = A * exp(Ea / (R * T)) * H^-B
Rは気体定数 (8.314 J/mol·K)
温度と湿度データの処理:
温度は摂氏からケルビンに変換して計算に使用します。
湿度は0〜1の範囲で相対湿度を入力します。
データ入力:
実験条件として、温度、湿度、および対応するMTTF(故障時間)を入力します。
市場条件として温度と湿度を入力し、対応するMTTFを予測します。
最適化:
実験データに基づき、アイリングモデルのパラメータ (A, Ea, B) を最適化し、推定します。
市場条件でのMTTF予測:
市場条件に基づき、予測されたMTTFを出力します。
可視化:
実験データおよび市場条件でのMTTF予測をプロットし、温度とMTTFの関係を視覚化します。
湿度も考慮したフィット曲線を描画します。
Y軸を対数表示にし、寿命と温度の関係を直感的に理解できるようにします。
データ保存:
実験データと予測結果をそれぞれCSVファイルに保存します。
2.2 非機能要件
スクリプトの実行環境:
Python 3.8以上
必要なライブラリ:
NumPy
Pandas
Matplotlib
SciPy
3.スクリプト
# アイリングモデルにおける製品寿命予測
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
# 1.モデルの設定
# アイリングモデル (MTTF = A * exp(Ea / (R * T)) * H^-B)
def eyring_model(T, H, A, Ea, B):
return A * np.exp(Ea / (R * T)) * H**(-B)
## 気体定数 (J/mol·K)
R = 8.314
## 摂氏からケルビンに変換
def celsius_to_kelvin(temp_celsius):
return temp_celsius + 273.15
# 2.データの入力
# 実験条件
experiment_conditions = {
'TemperatureC': [100, 80, 75, 75], # 試験条件_摂氏温度
'Humidity': [0.85, 0.95, 0.95, 0.65], # 試験条件_相対湿度 (0〜1)
'MTTF': [1200, 1300, 3400, 4000] # 試験結果_故障時間 (hr)
}
# 実験データをDataFrameに変換
data = pd.DataFrame(experiment_conditions)
# 温度データをケルビンに変換
data['TemperatureK'] = celsius_to_kelvin(data['TemperatureC'])
# 最適化のためのxデータ(温度と湿度のペア)
x_data = np.vstack((data['TemperatureK'], data['Humidity'])).T
# 最適化のためのyデータ(MTTF)
y_data = data['MTTF']
# アイリングモデルの関数を使用して、A, Ea, B を推定
def fit_eyring_model(x, A, Ea, B):
T = x[:, 0] # 温度 (ケルビン)
H = x[:, 1] # 湿度
return eyring_model(T, H, A, Ea, B)
# 最適化によるパラメータ推定
# 初期推定値を設定 (A, Ea, B)
initial_guess = [1e6, 50000, 1.0]
popt, pcov = curve_fit(fit_eyring_model, x_data, y_data, p0=initial_guess, maxfev=10000)
# 推定された A, Ea, B を取得
A_estimated, Ea_estimated, B_estimated = popt
print(f"推定された頻度因子 A: {A_estimated:.2e}")
print(f"推定された活性化エネルギー Ea: {Ea_estimated:.2f} J/mol")
print(f"推定された湿度指数 B: {B_estimated:.2f}")
# 3.市場条件でのMTTFを予測
market_conditions = {
'TemperatureC': [25, 45, 60], # 市場条件温度
'Humidity': [0.50, 0.70, 0.80] # 市場条件湿度
}
# 市場条件データをDataFrameに変換
market_data = pd.DataFrame(market_conditions)
market_data['TemperatureK'] = celsius_to_kelvin(market_data['TemperatureC'])
# 市場条件でのMTTFを予測
market_mttf = eyring_model(
market_data['TemperatureK'],
market_data['Humidity'],
A_estimated,
Ea_estimated,
B_estimated
)
# 市場条件での予測結果を表示
market_data['Predicted MTTF (hr)'] = market_mttf
print("\n市場条件での予測MTTF:")
print(market_data[['TemperatureC', 'Humidity', 'Predicted MTTF (hr)']])
# 実験条件と市場条件を可視化
plt.figure(figsize=(14, 7))
# 実験データのプロット
plt.scatter(data['TemperatureC'], data['MTTF'], color='green', label='Experimental Data')
# 市場条件での予測をプロット
for index, row in market_data.iterrows():
plt.scatter(row['TemperatureC'], row['Predicted MTTF (hr)'],
color='blue', edgecolor='blue', facecolors='none',
s=100, label=f'Predicted (Tc = {row["TemperatureC"]}°C, H = {int(row["Humidity"]*100)}%)')
plt.text(row['TemperatureC'], row['Predicted MTTF (hr)'],
f'{row["Predicted MTTF (hr)"]:.1f} hr',
verticalalignment='bottom', horizontalalignment='right')
# フィット曲線を描画
# 温度範囲を広げてフィット曲線を描画
temperature_range_celsius = np.linspace(min(data['TemperatureC']) - 20, max(market_conditions['TemperatureC']) + 20, 300)
temperature_range_kelvin = celsius_to_kelvin(temperature_range_celsius)
# 例えば、湿度を固定してフィット曲線を描画(ここでは平均湿度を使用)
average_humidity = np.mean(data['Humidity'])
mttf_fit = eyring_model(
temperature_range_kelvin,
average_humidity,
A_estimated,
Ea_estimated,
B_estimated
)
plt.plot(temperature_range_celsius, mttf_fit, color='orange', label=f'Fit Curve (H = {average_humidity*100:.0f}%)')
# Y軸を対数表示に設定
plt.yscale('log')
plt.title('Temperature (°C) vs MTTF (hr) with Humidity Consideration')
plt.xlabel('Temperature (°C)')
plt.ylabel('MTTF (hr)')
plt.grid(True, which="both", ls="--", linewidth=0.5)
plt.legend()
# グラフを表示
plt.tight_layout()
plt.show()
# 結果を保存する
output_file_experiment = "experiment_data_with_predictions.csv"
output_file_market = "market_conditions_predictions.csv"
data.to_csv(output_file_experiment, index=False)
market_data.to_csv(output_file_market, index=False)
print(f"\n実験データと予測結果がそれぞれ '{output_file_experiment}' と '{output_file_market}' に保存されました。")