寸法公差の積み上げをモンテカルロ法でシミュレーションする方法|Pythonでばらつきを可視化

複数部品を組み合わせる機械設計では、個々の寸法が公差内に入っていても、組立後の寸法や隙間が狙いどおりになるとは限りません。

そこで必要になるのが公差の積み上げです。

最も単純な方法は、各寸法が最悪方向へ同時にずれると考える最悪値計算です。しかし実際の加工寸法にはばらつきがあり、その分布や相関まで考えたい場合には、統計的な計算やモンテカルロシミュレーションが利用できます。

この記事では、

  • 最悪値による公差積み上げ
  • 標準偏差による統計的な積み上げ
  • モンテカルロシミュレーション
  • Pythonによる実装
  • 実務で注意すべき仮定

を順に整理します。

重要なのは、図面公差と確率分布は別物だという点です。

「±0.1 mmだから標準偏差は○○ mm」と、根拠なく変換してはいけません。

目次

寸法チェーンを数式にする

まず、評価したい組立寸法を数式として表します。

たとえば3つの寸法AA、BB、CCから隙間YYが決まる場合、Y=A−B−CY=A-B-C

とします。

一般化すると、Y=a1X1+a2X2+⋯+anXnY=a_1X_1+a_2X_2+\cdots+a_nX_n

です。

ここで、

  • XiX_i:各部品や形状の寸法
  • aia_i:その寸法が結果へ与える符号・倍率
  • YY:評価したい組立寸法

を表します。

単純な寸法チェーンではaia_iが11または−1-1になることが多いですが、計算式によっては別の係数になる場合もあります。

公差解析で最初に行うべきなのは、確率計算ではなく寸法チェーンを正しく式にすることです。

ここを間違えると、その後どれだけ高度なシミュレーションをしても結果は正しくなりません。

最悪値による公差積み上げ

各寸法が、Xi=xi±TiX_i=x_i\pm T_i

で規定されているとします。

線形な寸法チェーンについて、すべての寸法が結果を悪化させる方向へ同時にずれる場合の最大変動量は、TY=∑i=1n∣ai∣TiT_Y= \sum_{i=1}^{n}|a_i|T_i

で求められます。

たとえば、Y=A−B−CY=A-B-C

で、A=50.00±0.10A=50.00\pm0.10B=20.00±0.05B=20.00\pm0.05C=10.00±0.03C=10.00\pm0.03

なら、公差の最悪値は、TY=0.10+0.05+0.03=0.18 mmT_Y = 0.10+0.05+0.03 = 0.18\ \mathrm{mm}

です。

基準寸法は、Y=50−20−10=20 mmY=50-20-10=20\ \mathrm{mm}

なので、Y=20.00±0.18 mmY=20.00\pm0.18\ \mathrm{mm}

という範囲になります。

この方法は非常に分かりやすく、各寸法が定められた範囲を超えないという前提なら、最悪の組み合わせを直接確認できます。

一方で、すべての寸法が同時に最悪方向へ偏るケースまで含んでいるため、量産品の実際のばらつきを評価する目的では保守的になる場合があります。

統計的な公差積み上げ

加工実績などから各寸法の標準偏差が分かっている場合には、統計的なばらつきとして扱えます。

たとえば、Y=a1X1+a2X2+⋯+anXnY=a_1X_1+a_2X_2+\cdots+a_nX_n

で、各XiX_iが互いに独立しているなら、YYの分散は、σY2=∑i=1nai2σi2\sigma_Y^2 = \sum_{i=1}^{n}a_i^2\sigma_i^2

となります。

したがって標準偏差は、σY=∑i=1nai2σi2\sigma_Y = \sqrt{ \sum_{i=1}^{n}a_i^2\sigma_i^2 }

です。

いわゆるRSS、Root Sum of Squaresの形です。

ただし、これは単純な独立条件の場合です。

入力同士に相関がある場合、一般には共分散を含めて、Var(Y)=∑iai2Var(Xi)+2∑i<jaiajCov(Xi,Xj)\mathrm{Var}(Y) = \sum_i a_i^2\mathrm{Var}(X_i) + 2\sum_{i<j}a_i a_j\mathrm{Cov}(X_i,X_j)

と考える必要があります。

同じ加工機、同じ基準面、同じ温度条件などによって寸法同士が連動する場合、独立と仮定してよいとは限りません。

公差と標準偏差を混同しない

ここは特に重要です。

図面に、

50 ±0.1 mm

と書かれていても、それだけでは、

  • 正規分布なのか
  • 一様分布なのか
  • 中心に集まっているのか
  • 上限側へ偏っているのか
  • 標準偏差はいくつなのか

は分かりません。

図面公差は基本的に許容される寸法範囲を示します。

一方、モンテカルロシミュレーションで必要なのは、寸法が実際にどのような確率で現れるかという確率モデルです。

したがって理想的には、実測データから、μ\mu

と、σ\sigma

あるいは実際の分布形状を求めます。

データがない場合に何らかの分布を仮定することはできますが、その場合は「実測結果」ではなく「仮定したモデルによるシナリオ計算」であることを明確にする必要があります。

モンテカルロ法とは

モンテカルロ法では、各入力寸法について確率分布からランダムな値を発生させ、組立寸法を何度も計算します。

処理は単純です。

Aをランダム生成
Bをランダム生成
Cをランダム生成
↓
Y = A - B - C
↓
結果を保存
↓
何度も繰り返す

多数回繰り返すことで、組立寸法YYの分布を数値的に近似します。

線形で単純な問題なら解析式でも計算できますが、モンテカルロ法は、

  • 非線形な計算
  • 上限・下限のある分布
  • 異なる分布の混在
  • 条件分岐
  • 複雑な組立ロジック

などにも拡張しやすい点が大きな利点です。

Pythonで寸法積み上げをシミュレーションする

例として、次の寸法チェーンを考えます。Y=A−B−CY=A-B-C

ここでは説明用として、加工実績から次の平均値と標準偏差が得られているものと仮定します。

寸法平均値 mm標準偏差 mm
A50.000.04
B20.000.03
C10.000.02

これらの標準偏差は図面公差から換算した値ではありません。

あくまでシミュレーション例の入力条件です。

各寸法が独立した正規分布に従うと仮定すると、Python標準ライブラリだけでも計算できます。

import random
import statistics

rng = random.Random(42)

n = 100_000
results = []

for _ in range(n):
    a = rng.gauss(50.00, 0.04)
    b = rng.gauss(20.00, 0.03)
    c = rng.gauss(10.00, 0.02)

    y = a - b - c
    results.append(y)

mean_y = statistics.mean(results)
std_y = statistics.pstdev(results)

print(f"mean = {mean_y:.5f} mm")
print(f"std  = {std_y:.5f} mm")

乱数シードを固定しておくと、同じ実行条件を再現しやすくなります。

解析式では、σY=0.042+0.032+0.022\sigma_Y = \sqrt{ 0.04^2+0.03^2+0.02^2 }

なので、σY≈0.0539 mm\sigma_Y \approx 0.0539\ \mathrm{mm}

です。

十分な試行回数でモンテカルロ計算を行えば、シミュレーションから得られる標準偏差もこの値付近へ近づくことが期待されます。

組立規格内に入る割合を調べる

モンテカルロ法の便利な用途の一つが、組立寸法の上下限と比較することです。

たとえば説明用として、

下限 = 19.85 mm
上限 = 20.15 mm

という判定条件を設定するなら、

lower = 19.85
upper = 20.15

ok_count = sum(
    lower <= value <= upper
    for value in results
)

rate = ok_count / len(results)

print(f"within limits = {rate:.4%}")

と計算できます。

ここで得られる割合は、実際の製造歩留まりそのものではありません。

あくまで、

  • 入力した平均
  • 入力した標準偏差
  • 仮定した確率分布
  • 仮定した相関関係
  • 作成した寸法チェーン

が正しいとした場合のモデル結果です。

シミュレーション結果の桁数だけを精密にしても、入力モデルが実態と合っていなければ意味はありません。

正規分布だけに限定する必要はない

モンテカルロ法では、すべての変数を正規分布にする必要はありません。

たとえば入力条件によっては、

  • 一様分布
  • 三角分布
  • 正規分布
  • 実測データから得た経験分布

などを使うことも考えられます。

ただし、「どの分布を使うか」は計算テクニックではなくモデル化の問題です。

加工寸法だから自動的に正規分布になるわけではありません。

設備の補正、工具摩耗、ロット差、測定分解能、選別、工程管理などによって分布形状は変化します。

そのため、量産データが利用できる場合には、ヒストグラムや基本統計量などを確認してから分布モデルを決める方が合理的です。

相関がある寸法に注意する

単純なコードでは、

a = rng.gauss(...)
b = rng.gauss(...)

を別々に生成しているため、AとBを独立な変数として扱っています。

しかし実際の加工では、

共通基準面
共通工具
同じ機械の熱変位
同じ素材ロット
同じ補正値

などによって複数寸法が同時に動くことがあります。

この場合、独立な乱数を発生させるモデルでは実際のばらつきを再現できません。

特に重要な寸法チェーンでは、単独寸法の標準偏差だけでなく、寸法間の相関も確認する必要があります。

モンテカルロ法が有効になる場面

最悪値計算をモンテカルロ法で置き換える、と考える必要はありません。

両者は目的が違います。

最悪値計算は、

許容範囲の端同士が組み合わされた場合に成立するか

を見る方法です。

モンテカルロ法は、

設定した確率モデルのもとで、結果がどのように分布するか

を見る方法です。

設計初期には最悪値計算で構造的な成立性を確認し、その後、工程データが得られた段階で統計解析を加えるという使い分けもできます。

データ構造として保存しておく

公差解析を繰り返し利用するなら、寸法条件をコードへ直接書くより、データとして分離した方が扱いやすくなります。

たとえば、

{
  "output": "gap",
  "formula": "A-B-C",
  "variables": {
    "A": {
      "distribution": "normal",
      "mean_mm": 50.0,
      "std_mm": 0.04
    },
    "B": {
      "distribution": "normal",
      "mean_mm": 20.0,
      "std_mm": 0.03
    },
    "C": {
      "distribution": "normal",
      "mean_mm": 10.0,
      "std_mm": 0.02
    }
  }
}

のような形式が考えられます。

こうしておけば、

寸法条件
↓
JSON
↓
計算エンジン
↓
モンテカルロ計算
↓
ヒストグラム
↓
規格内率

という流れを構築できます。

さらにWebツール化するなら、画面から平均値、標準偏差、分布、組立上下限などを入力し、結果分布を表示する構成にも発展できます。

シミュレーションで見落としやすい点

モンテカルロ法を使ったからといって、解析の信頼性が自動的に上がるわけではありません。

特に確認したいのは次の点です。

  • 寸法チェーンの符号は正しいか
  • 単位が統一されているか
  • 図面公差と標準偏差を混同していないか
  • 分布の仮定に根拠があるか
  • 寸法同士を独立とみなしてよいか
  • 工程平均の偏りを無視していないか
  • 工具摩耗や経時変化を無視していないか
  • 試行回数を変えて結果が安定するか
  • シミュレーション結果を実測データと比較したか

特に危険なのは、入力条件の根拠が弱いまま大量の乱数を発生させ、細かい小数点まで結果を表示して安心してしまうことです。

計算回数の多さとモデルの正しさは別問題です。

まとめ

寸法公差の積み上げには、大きく分けて、

最悪値による評価
統計式による評価
モンテカルロシミュレーション

という方法があります。

線形な寸法チェーンで最悪値を求めるなら、TY=∑∣ai∣TiT_Y= \sum |a_i|T_i

で計算できます。

独立したばらつきの標準偏差を合成するなら、σY=∑ai2σi2\sigma_Y = \sqrt{ \sum a_i^2\sigma_i^2 }

です。

さらに複雑な分布や非線形処理を含めたい場合には、モンテカルロ法が有効です。

ただし、最も重要なのはシミュレーション手法ではありません。

どの寸法が結果に影響するのかを正しくモデル化し、入力した確率分布に根拠を持たせることです。

まず寸法チェーンを数式化し、最悪値を確認する。そのうえで実測データが得られたら統計モデルを作り、必要に応じてモンテカルロシミュレーションへ進む。

この順序で考えると、公差解析を単なる手計算から、再利用可能な計算ロジックへ発展させやすくなります。

参考情報

  • NIST Technical Note 1297 — Law of Propagation of Uncertainty
  • NIST/SEMATECH Engineering Statistics Handbook
  • Python Documentation — random module
参考になったらシェアしてください
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

機械設計・油圧・CAD・Python・AIなど、ものづくりに関わる技術を扱っています。工学知識を整理・構造化し、設計や自動化に再利用できる形へ変えていくことを目指しています。

目次