# 慣性モーメント計算 実装記録

```yaml
page: moment-of-inertia.html
based_on: docs/research/moment-of-inertia-specification.md
related_task: MP-MOMENT-OF-INERTIA-IMPLEMENT-001
implementation_date: 2026-07-28
```

## 正本仕様書

本実装は [docs/research/moment-of-inertia-specification.md](moment-of-inertia-specification.md) を正本とする。式・記号・単位・平行軸の定理・回転軸の定義・出典（OpenStax *University Physics Volume 1*、University of Victoria *Classical Mechanics*）の技術根拠は同文書に記録済みであり、本記録では重複記載しない。

正本仕様書と本PM TASK（`MP-MOMENT-OF-INERTIA-IMPLEMENT-001`）の間に競合は確認されなかった。中実円柱・中空円柱の入力を半径ではなく直径とする点も、仕様書5.2・5.3節が「直径入力の場合」の等価な式を明記済みであり、矛盾しない。

## 実装対象

`moment-of-inertia.html` に、次の6形状・軸条件を実装した。

- 質点
- 中実円柱・円盤（中心を通る対称軸）
- 中空円柱・円環（中心を通る対称軸）
- 細長い棒・中心軸
- 細長い棒・端軸
- 長方形薄板（重心を通り面に垂直な軸）

各形状は、`shape-select`で選択すると必要な入力欄のみが表示される。選択中の形状に属さない入力欄は非表示にし、計算処理も選択中の形状に対応する入力IDのみを参照するため、他形状の入力値が計算へ混入しない。

## 採用公式

```text
質点：                J = m × r²
中実円柱・円盤：       J = 1/8 × m × D²
中空円柱・円環：       J = 1/8 × m × (Do² + Di²)
細長い棒・中心軸：     J = 1/12 × m × L²
細長い棒・端軸：       J = 1/3 × m × L²
長方形薄板：           J = 1/12 × m × (a² + b²)
平行軸の定理：         J = JG + m × e²
```

中空円柱の直径式 `J = 1/8 × m × (Do² + Di²)` は、正本仕様書の半径式 `J = 1/2 × m × (ro² + ri²)`（ro=Do/2, ri=Di/2）と数学的に同値であることを確認済み。画面の途中式にも「（半径式 J = 1/2 × m × (ro² + ri²) と同値）」と明記している。

## 入力単位

```yaml
mass_units: [g, kg]
length_units: [mm, m]
```

質量単位・寸法単位は、形状によらず共通の選択欄（`mass-unit`・`dimension-unit`）を使用する。偏心距離の単位は独立した選択欄（`eccentricity-unit`、mm・m）とした。

## 内部単位

```yaml
mass: kg
length: m
moment_of_inertia: kg_m2
```

- g → kg：入力値 ÷ 1000
- mm → m：入力値 ÷ 1000

中間計算では丸めず、表示直前にのみ有効数字6桁程度（`toPrecision(6)`相当）へ丸める。

## 平行軸の定理

```text
J = JG + m × e²
```

「平行軸の定理を適用する」チェックボックスをONにした場合のみ、偏心距離の入力欄を表示する。偏心距離`e = 0`は有効値として計算する（Case 7の派生確認：e=0のときparallel_axis_term=0、J=JGと一致することを確認済み）。

## 二重適用防止

細長い棒・端軸（`slender_rod_end`）を選択すると、次を行う。

- 「平行軸の定理を適用する」チェックボックスを`disabled`にし、チェック状態を強制的に外す
- 偏心距離入力欄を非表示にする
- 「端軸の公式は中心軸の公式へ平行軸の定理を適用した結果を含むため、追加適用できません。」という注記を画面へ表示する

これにより、端軸公式（`J=1/3×m×L²`）に対して、さらに偏心距離を加算する二重適用を構造的に禁止している。結果表示でも、端軸の基本値を「重心を通る軸まわりのJG」ではなく「端軸まわりの慣性モーメントJ」というラベルで区別して表示する。

## 内径0の扱い

中空円柱の内径（`inner-diameter-value`）に`0`を入力した場合、エラーとせず中空円柱の式へそのまま`Di=0`を代入して計算する。これは中実円柱の式と数学的に一致する（正本仕様書12章の決定を踏襲）。バリデーションで禁止しているのは「内径が負数」「内径が外径以上」のみであり、内径0はいずれにも該当しない。

ブラウザ実測：質量8kg・外径0.4m・内径0m → J = 0.2 kg·m²（中実円柱相当、質量8kg・直径0.4mの中実円柱の結果 J=1/8×8×0.16=0.16 kg·m²とは異なる値になる点に注意。内径0の中空円環式は「外径のみの円盤」の式と同値であり、中実円柱の式とは質量分布の前提が異なるため、数値が一致するのは式の構造上の連続性であり、中実円柱と全く同じ結果になることを意味しない。ここでは「エラーにならず計算が完了すること」を確認した。）

## 検算結果

| Case | 入力 | 期待値 | 実測値 | 判定 |
|---|---|---|---|---|
| 1 質点 | m=2kg, r=0.5m | 0.5 kg·m² | 0.5 kg·m² | 一致 |
| 2 中実円柱 | m=10kg, D=0.4m | 0.2 kg·m² | 0.2 kg·m² | 一致 |
| 3 中空円柱 | m=8kg, Do=0.4m, Di=0.2m | 0.2 kg·m² | 0.2 kg·m² | 一致 |
| 4 棒・中心軸 | m=3kg, L=2m | 1 kg·m² | 1 kg·m² | 一致 |
| 5 棒・端軸 | m=3kg, L=2m | 4 kg·m² | 4 kg·m² | 一致 |
| 6 長方形薄板 | m=6kg, a=2m, b=1m | 2.5 kg·m² | 2.5 kg·m² | 一致 |
| 7 平行軸（中実円柱） | JG=0.2kg·m², m=10kg, e=0.3m | 平行軸項0.9・合計1.1 kg·m² | 平行軸項0.9・合計1.1 kg·m² | 一致 |

すべてブラウザ上でJavaScript内部計算値（`result`要素の表示値）を用いて確認した。7件すべて一致し、修正は不要だった。

## 単位換算確認

```yaml
case: 質点
input:
  mass: 2000 g
  radius: 500 mm
converted:
  mass: 2 kg
  radius: 0.5 m
expected_J: 0.5 kg_m2
actual_J: 0.5 kg_m2
result: 一致
```

g・mmを使用した単位換算経路も、m・kg入力の場合と同じ結果になることを確認した。

## 異常系確認

| 確認項目 | 結果 |
|---|---|
| 必須入力（質量）が空 | 「質量には0より大きい数値を入力してください。」を表示 |
| 質量が非数値 | 同上のエラーを表示 |
| 質量が0 | 同上のエラーを表示 |
| 質量が負数 | 同上のエラーを表示 |
| 寸法（半径）が0 | 「半径には0より大きい数値を入力してください。」を表示 |
| 寸法（半径）が負数 | 同上のエラーを表示 |
| 外径が0 | 「外径には0より大きい数値を入力してください。」を表示 |
| 内径が負数 | 「内径には0以上の数値を入力してください。」を表示 |
| 内径と外径が同じ | 「内径は外径より小さい値を入力してください。」を表示 |
| 内径が外径より大きい | 同上のエラーを表示 |
| 偏心距離が負数 | 「偏心距離には0以上の数値を入力してください。」を表示 |
| 細長い棒・端軸で平行軸チェックボックスが無効化される | `disabled=true`を確認 |
| 質量欄に`NaN`という文字列を入力 | `parseFloat("NaN")`がNaNとなり、質量エラーを表示 |
| 質量欄に`Infinity`という文字列を入力 | `parseFloat("Infinity")`がInfinityとなり、`isFinite`判定でエラーを表示 |

いずれの場合も、結果欄に`NaN`・`Infinity`・`undefined`・`null`が露出しないことを確認した。

## モバイル確認

```yaml
width: 375
scrollWidth: 375
clientWidth: 375
horizontal_scroll: false
```

中空円柱・平行軸適用（最も入力欄と結果表示が多い組み合わせ）で375px幅を確認し、横スクロールが発生しないこと、長い公式・注意文が画面レイアウトを崩さないことを確認した。

## JavaScriptコンソール確認

`moment-of-inertia.html`および更新後の`design-calculations.html`を、正常系・異常系・モバイル表示のすべての操作を通してブラウザで確認したが、コンソールエラーは発生しなかった。

## 既存ページとの責務境界

[docs/logs/2026-07-24-torque-scope-separation.md](../logs/2026-07-24-torque-scope-separation.md)が定める「B. 駆動系選定」グループの対象（負荷慣性モーメント）として、本ページを`torque.html`・`linear-rotational-speed.html`とは別ページで実装した。

- `torque.html`：出力・回転速度からのトルク計算、力・腕長からの一般トルク計算。慣性モーメントは扱わない。
- `linear-rotational-speed.html`：直径・回転速度・周速度の幾何学的換算。質量や慣性モーメントは扱わない。
- `moment-of-inertia.html`（本ページ）：単一物体の質量慣性モーメントと、平行軸の定理による偏心軸まわりの値のみを扱う。

## 今回実装しなかったこと

- モータ軸換算慣性、減速比の反映、負荷側・モータ側の慣性比判定
- 加速トルク計算、実効トルク計算、モータ容量選定
- メーカー固有の許容慣性値の判定
- 複数部品の自動合算（複合体入力UI）
- CAD・3Dモデルからの慣性取得
- 球、球殻、独立した薄肉円環（フープ）など、正本仕様書で`deferred`とされた形状
- 回転軸の簡易図（正本仕様書19章の未確認事項として残る）
