# 慣性モーメント計算 仕様書

```yaml
document_status: draft
project: mechanical-tools
role: implementation_specification
based_on: MP-MOMENT-OF-INERTIA-SPEC-001
depends_on: docs/research/basic-design-foundation-audit.md
spec_date: 2026-07-28
```

## 1. 目的

基礎設計6テーマの1つである「慣性モーメント」について、実装前に仕様を確定する。対象形状、回転軸、入力値、内部単位、公式、平行軸の定理、検算値、入力バリデーション、ページ構成案、既存ページとの責務境界を文書化し、次の実装Unitの正本とする。

本書はHTML・CSS・JavaScriptの実装を含まない。すべて仕様の確定であり、実ファイルの作成・変更は仕様書自体（本ファイル）以外に行っていない。

## 2. 対象範囲

- 単一の剛体（質点、中実円柱、中空円柱、細長い棒、長方形薄板）について、質量・寸法から質量慣性モーメント`J`を求める
- 重心を通る軸まわりの`J`から、平行軸の定理を用いて偏心した回転軸まわりの`J`を求める

## 3. 対象外

- 複数部品の自動合算（複合体入力UI）
- モータ軸換算慣性
- 減速比による慣性の反映
- 負荷側・モータ側の慣性比判定
- 加速トルク計算
- 実効トルク計算
- モータ容量選定
- メーカー固有の許容慣性値の判定
- 複雑なCAD形状からの自動積分、3Dモデルからの慣性取得

## 4. 記号と内部単位

```yaml
symbols:
  J:
    name: 質量慣性モーメント
    unit: kg_m2
    note: 記号はJへ統一する（決定事項、6章参照）
  m:
    name: 質量
    unit: kg
  r:
    name: 半径
    unit: m
  D:
    name: 直径
    unit: m
  Di:
    name: 内径
    unit: m
  Do:
    name: 外径
    unit: m
  a:
    name: 一辺または幅
    unit: m
  b:
    name: 一辺または高さ
    unit: m
  L:
    name: 長さ
    unit: m
  e:
    name: 重心軸から回転軸までの距離
    unit: m
```

内部計算はすべてSI単位（m、kg、kg·m²）へ正規化してから行い、途中で丸めない。

### 4.1 入力単位の決定

```yaml
length_input_units:
  candidates: [mm, m]
  decision: 採用する
  reason: linear-rotational-speed.htmlの直径単位（mm・m）と同一パターンであり、既存サイトの慣例と整合する。
mass_input_units:
  candidates: [g, kg]
  decision: 採用する
  reason: data/units.jsonのmass量（g・kg・t・lb等）と矛盾しない基本単位であり、機械設計実務での代表的な入力単位である。本Unitではdata/units.json自体は変更しない。
```

## 5. 対象形状（MVP）

MVP対象形状は次の6件とする（5.1〜5.5の候補形状＋平行軸の定理の適用）。

### 5.1 質点

回転軸から距離`r`にある質点。

```text
J = m × r²
```

質量慣性モーメントの定義（J = Σ mᵢrᵢ²）そのものであり、形状固有の裏付け資料を要しない一般定義式である。

### 5.2 中実円柱・円盤

中心軸（円柱の対称軸）まわり。

```text
J = 1/2 × m × r²
```

直径入力の場合は `J = 1/8 × m × D²`（r = D/2を代入した等価な式）。

### 5.3 中空円柱・円環

中心軸まわり。

```text
J = 1/2 × m × (ro² + ri²)
```

`ro`：外半径、`ri`：内半径。

### 5.4 細長い棒

#### 5.4.1 中心軸（棒の中心を通り、棒に垂直な軸）

```text
J = 1/12 × m × L²
```

#### 5.4.2 端軸（棒の端を通り、棒に垂直な軸）

```text
J = 1/3 × m × L²
```

### 5.5 長方形薄板

重心を通り、面に垂直な軸。

```text
J = 1/12 × m × (a² + b²)
```

### 5.6 裏付け状況

すべて7章の一次資料（OpenStax *University Physics Volume 1*）に掲載されている式と一致することを確認済み。裏付けできない形状はない。

## 6. 回転軸の定義

```yaml
axis_definitions:
  point_mass:
    passes_through: 質点そのものではなく回転中心
    direction: 質点と回転中心を結ぶ線分に垂直な軸（点と軸の距離がr）
    centroid_axis: 該当なし（質点に「重心軸」の概念はなく、rは常に回転軸までの距離）
    end_axis: 該当なし
    offset_axis: rの値そのものが偏心距離に相当する
  solid_cylinder:
    passes_through: 円柱の中心（対称軸）
    direction: 円柱の長さ方向（中心軸）
    centroid_axis: 中心軸は同時に重心を通る軸
    end_axis: 該当なし（本MVPでは中心軸のみを対象とし、直径まわりの軸は対象外）
    offset_axis: 7章の平行軸の定理を適用すれば算出可能（本MVPの基本形状式には含まない）
  hollow_cylinder:
    passes_through: 円環の中心（対称軸）
    direction: 円柱（円環）の長さ方向
    centroid_axis: 中心軸は同時に重心を通る軸
    end_axis: 該当なし
    offset_axis: 平行軸の定理で算出可能（基本形状式には含まない）
  slender_rod_center_axis:
    passes_through: 棒の中点
    direction: 棒の長さ方向に垂直
    centroid_axis: 該当する（棒の中点は重心と一致する一様な棒を前提とする）
    end_axis: 該当しない（これは中心軸の式）
    offset_axis: 該当なし
  slender_rod_end_axis:
    passes_through: 棒の端点
    direction: 棒の長さ方向に垂直
    centroid_axis: 該当しない
    end_axis: 該当する（これは端軸の式）
    offset_axis: 端軸公式は、中心軸公式へ平行軸の定理（e = L/2）を適用した結果と等しいことを7章で確認済み。したがって「端軸」は独立した基本形状ではなく、中心軸＋平行軸の定理の特別なケースである。
  rectangular_plate:
    passes_through: 薄板の重心（中心）
    direction: 薄板の面に垂直
    centroid_axis: 中心軸は同時に重心を通る軸
    end_axis: 該当なし
    offset_axis: 平行軸の定理で算出可能（基本形状式には含まない）
```

利用者が回転軸を誤認しないよう、実装ページでは各形状の入力欄付近に「どの軸まわりか」を文章で明記する方針とする。簡易図の作成は本Unitでは行わず、実装Unit側で検討する（本Unitでは図を作成しない）。

## 7. 採用公式

```yaml
source_type: academic_open_textbook
primary_source:
  organization: OpenStax（Rice University）
  book: University Physics Volume 1
  chapter_title:
    - "10.5 Moment of Inertia and Rotational Kinetic Energy"
    - "10.6 Calculating Moments of Inertia"
  hosted_via: Physics LibreTexts（UC Davis等の支援を受けるオープン教材プロジェクト）
  url:
    - https://phys.libretexts.org/Bookshelves/University_Physics/University_Physics_(OpenStax)/Book:_University_Physics_I_-_Mechanics_Sound_Oscillations_and_Waves_(OpenStax)/10:_Fixed-Axis_Rotation__Introduction/10.05:_Moment_of_Inertia_and_Rotational_Kinetic_Energy
    - https://phys.libretexts.org/Bookshelves/University_Physics/University_Physics_(OpenStax)/Book:_University_Physics_I_-_Mechanics_Sound_Oscillations_and_Waves_(OpenStax)/10:_Fixed-Axis_Rotation__Introduction/10.06:_Calculating_Moments_of_Inertia
  license: CC BY 4.0
  confirmed_date: 2026-07-28
  confirmed_content:
    - "Figure 10.5.4（Values of rotational inertia for common shapes of objects）に、円環（annular cylinder）I=M/2×(R1²+R2²)、中実円柱 I=MR²/2、棒の中心軸 I=ML²/12、棒の端軸 I=ML²/3、長方形薄板 I=M(a²+b²)/12 の各式を確認"
    - "平行軸の定理 I_parallel-axis = I_center-of-mass + m×d² の記載を確認"
    - "棒の端軸公式が、中心軸公式へ平行軸の定理（d=L/2）を適用した結果と一致することの導出例を確認"
secondary_source:
  organization: University of Victoria
  author: Jeremy Tatum
  book: Classical Mechanics
  chapter_title: "2.3 Moments of Inertia of Some Simple Shapes"
  url: https://phys.libretexts.org/Bookshelves/Classical_Mechanics/Classical_Mechanics_(Tatum)/02:_Moments_of_Inertia/2.03:_Moments_of_Inertia_of_Some_Simple_Shapes
  license: CC BY-NC 4.0
  confirmed_date: 2026-07-28
  purpose: 円盤の中心軸公式（I=1/2ma²）と棒の中心軸公式（I=1/3ml²、l=半長のため全長Lで1/12mL²と等価）を独立した資料で相互確認するため
formulas_confirmed:
  - point_mass: "J = m r²（定義式）"
  - solid_cylinder: "J = 1/2 m r²（一次資料・二次資料の双方で確認）"
  - hollow_cylinder: "J = 1/2 m (ro² + ri²)（一次資料で確認）"
  - slender_rod_center_axis: "J = 1/12 m L²（一次資料・二次資料の双方で確認）"
  - slender_rod_end_axis: "J = 1/3 m L²（一次資料で確認、かつ平行軸の定理による導出で内部整合を確認）"
  - rectangular_plate: "J = 1/12 m (a² + b²)（一次資料で確認）"
  - parallel_axis_theorem: "J = JG + m e²（一次資料で確認）"
```

メーカー固有の係数・許容値は一切使用していない。すべて一般的な剛体力学の関係式である。

## 8. 平行軸の定理

```text
J = JG + m × e²
```

- `JG`：重心を通る平行軸まわりの慣性モーメント
- `e`：重心軸と実際の回転軸の距離

### 8.1 適用条件

- 移動先の軸は、`JG`の軸と平行でなければならない（平行でない軸には使用しない）
- `JG`は必ず「重心を通る軸」まわりの値でなければならない（重心を通らない軸を`JG`として使うと二重に誤差が生じる）

### 8.2 `e = 0`の扱い

`e = 0`は有効な入力とし、`J = JG`（平行軸項が0）としてそのまま計算する。エラーとしない。

### 8.3 基本形状計算との入力分離・二重適用防止

- 「基本形状の`JG`を求める入力」と「平行軸の定理を適用するかどうか・偏心距離`e`」は、UI上で別ステップの入力として分離する（9章参照）。
- 5.4.2「細長い棒・端軸」は、中心軸公式（`J=1/12mL²`）へ平行軸の定理（`e=L/2`）を適用した結果と数学的に同一である（7章で確認済み）。したがって、実装ページで「端軸」を選択肢として提供する場合、内部的には次のいずれかの設計を取り、二重加算を防止する。
  - (a) 「端軸」を独立した既製公式（`J=1/3mL²`）として直接計算し、その形状に対して平行軸の定理チェックボックスを追加提供しない、または
  - (b) 「中心軸」のみを基本形状として提供し、「端軸」は「中心軸 + 平行軸の定理（e=L/2固定）」の組み合わせとしてのみ提供する
  - どちらを採用するかは実装Unitで決定する（本Unitでは(a)(b)いずれも仕様上矛盾なく成立することのみを確定する）。いずれの設計でも、同一の偏心分を二重に加算しないことを実装時のテスト項目とする。

## 9. 複合体の扱い

MVPでは、複数部品の慣性モーメントを自動合算する機能は実装しない。

一般関係として次を記録する。

```text
Jtotal = J1 + J2 + ... + Jn
```

前提：各部品が同一回転軸へ換算済みであること。

複合体入力UI、部品追加・削除、表形式編集は将来拡張として分離する（17章）。

## 10. 入力仕様

共通入力：

- 形状
- 質量、質量単位（g・kg）
- 寸法、寸法単位（mm・m）
- 回転軸（形状ごとに選択肢が異なる。5.4のみ中心軸／端軸の選択を持つ）
- 偏心距離を適用するか（チェックボックス等）
- 偏心距離、偏心距離単位（適用する場合のみ表示）

形状別入力：

```yaml
point_mass:
  - mass
  - radius

solid_cylinder:
  - mass
  - diameter

hollow_cylinder:
  - mass
  - outer_diameter
  - inner_diameter

slender_rod:
  - mass
  - length
  - axis_type   # center | end

rectangular_plate:
  - mass
  - side_a
  - side_b
```

## 11. 出力仕様

最低限、次を出力する。

- 慣性モーメント`kg·m²`（最終値）
- 入力値のSI換算値
- 使用した公式
- 数値を代入した途中式
- 基本重心軸まわりの値（`JG`）
- 平行軸項`m × e²`（適用した場合のみ）
- 最終慣性モーメント（`JG` + 平行軸項）
- 選択した回転軸の説明
- 適用条件
- 対象外の注意

将来の加速トルクページで再利用しやすいよう、主結果の単位は`kg·m²`へ固定する。

## 12. 入力バリデーション

次の場合は計算を停止し、日本語のエラーを表示する。

- 必須入力が空
- 数値として解釈できない
- `NaN`
- `Infinity`
- 質量が0以下
- 必要寸法（半径・直径・長さ・辺）が0以下
- 外径が0以下
- 内径が負数
- 内径が外径以上
- 偏心距離が負数
- 未定義の形状
- 未定義の軸
- 未定義の単位
- 結果が有限値でない

次は有効値とする。

```yaml
valid_boundaries:
  eccentricity_zero: true   # J = JGとして計算する
  inner_diameter_zero:
    decision: 有効値として扱う
    treatment: 中空円柱の式 J=1/2×m×(ro²+ri²) はri=0のとき自動的に中実円柱の式 J=1/2×m×ro² と数学的に一致するため、特別な分岐処理やUI誘導を追加せず、そのまま計算する。
    reason: 12章の禁止条件は「内径が負数」「内径が外径以上」のみであり、内径0はいずれにも該当しない。数式が自然に整合するため、推測ではなく数学的根拠に基づく決定である。
```

## 13. 表示と丸め

- 中間値を丸めない
- 表示時のみ丸める（有効数字6桁程度を目安とする。他の計算ページ（torque.html等）の`toPrecision(6)`方式と統一する）
- 非常に小さい値・大きい値は、指数表記または読みやすい表記を許可する
- 不要な末尾ゼロを大量に表示しない
- 単位表記は`kg·m²`（中点`·`）に統一する。`kg・m²`（全角中黒）は使用しない。理由：`linear-rotational-speed.html`や`torque.html`など既存ページはASCIIに近い`N·m`表記（半角中点`·`、U+00B7）を採用しており、これと統一する。
- 記号は`J`に統一し、`I`とは表記しない（4章）。理由：本仕様書のPM TASK原文および本書全体で`J`が一貫して使われており、他の記号（`I`は断面二次モーメント等、材料力学の別の量と混同されやすい）との衝突を避けるため。

## 14. 検算値

以下はすべて独立に計算し、PM TASK記載の期待値と一致することを確認した（誤りなし、修正不要）。

```yaml
case_point_mass:
  mass: 2 kg
  radius: 0.5 m
  formula: J = m r²
  calculation: 2 × 0.5² = 2 × 0.25
  expected_J: 0.5 kg_m2
  verified: true

case_solid_cylinder:
  mass: 10 kg
  diameter: 0.4 m
  formula: J = 1/2 m r²  (r = D/2 = 0.2 m)
  calculation: 0.5 × 10 × 0.2²= 0.5 × 10 × 0.04
  expected_J: 0.2 kg_m2
  verified: true

case_hollow_cylinder:
  mass: 8 kg
  outer_diameter: 0.4 m
  inner_diameter: 0.2 m
  formula: J = 1/2 m (ro² + ri²)  (ro = 0.2 m, ri = 0.1 m)
  calculation: 0.5 × 8 × (0.2² + 0.1²) = 0.5 × 8 × (0.04 + 0.01) = 0.5 × 8 × 0.05
  expected_J: 0.2 kg_m2
  verified: true

case_slender_rod_center_axis:
  mass: 3 kg
  length: 2 m
  formula: J = 1/12 m L²
  calculation: (1/12) × 3 × 2² = (1/12) × 3 × 4 = 12/12
  expected_J: 1 kg_m2
  verified: true

case_slender_rod_end_axis:
  mass: 3 kg
  length: 2 m
  formula: J = 1/3 m L²
  calculation: (1/3) × 3 × 2² = (1/3) × 3 × 4 = 4
  cross_check_via_parallel_axis: "center_J(1) + m×e²(3×1²=3) = 4"
  expected_J: 4 kg_m2
  verified: true

case_rectangular_plate:
  mass: 6 kg
  side_a: 2 m
  side_b: 1 m
  formula: J = 1/12 m (a² + b²)
  calculation: (1/12) × 6 × (2² + 1²) = (1/12) × 6 × 5 = 30/12
  expected_J: 2.5 kg_m2
  verified: true

case_parallel_axis:
  base_J: 0.2 kg_m2
  mass: 10 kg
  eccentricity: 0.3 m
  formula: parallel_axis_term = m e²; total_J = base_J + parallel_axis_term
  calculation_term: 10 × 0.3² = 10 × 0.09
  expected_parallel_axis_term: 0.9 kg_m2
  calculation_total: 0.2 + 0.9
  expected_total_J: 1.1 kg_m2
  verified: true
```

検算に使用した一時ファイルはリポジトリ内に残していない（暗算・手計算で確認）。

## 15. ページ構成案

将来の実装ページは最低限、次の構成とする。

```text
パンくず
H1
ページ概要
適用範囲
形状選択
入力フォーム
回転軸の説明
計算結果
使用した式
途中式
検算例
使用上の注意
関連ページ
出典
```

関連ページ候補：

- `design-calculations.html`
- `torque.html`
- `linear-rotational-speed.html`
- 将来の加速トルクページ（未実装）
- 将来のモータ選定フロー（未実装）

未実装ページへはリンクしない（実装Unit側で、リンク時点の公開状況に合わせて追加する）。

## 16. 既存ページとの責務境界

[docs/logs/2026-07-24-torque-scope-separation.md](../logs/2026-07-24-torque-scope-separation.md)が定める「A. 回転軸設計」「B. 駆動系選定」の責務分離方針において、慣性モーメントは「B. 駆動系選定」グループの対象（負荷慣性モーメント）として明記されている。本ページはこの方針に従い、「A. 回転軸設計」（軸のねじり強度等）とは別ページとして扱う。

慣性モーメントページが行うこと：

- 単一物体の形状・質量・寸法から`J`を求める
- 必要に応じて平行軸の定理を適用する
- SI単位へ換算する
- 式と途中式を表示する

行わないこと：

- モータ軸換算
- 減速比による反映
- 負荷側・モータ側の慣性比判定
- 加速トルク計算
- 実効トルク計算
- モータ容量選定
- メーカー固有の許容値判定
- 複雑なCAD形状の自動積分
- 3Dモデルからの慣性取得

`torque.html`との境界：`torque.html`は出力・回転速度からのトルク計算、および力・腕長からの一般トルク計算を扱い、慣性モーメントは扱わない。

`linear-rotational-speed.html`との境界：同ページは直径・回転速度・周速度の幾何学的換算のみを扱い、質量や慣性モーメントは扱わない。

## 17. 将来拡張との境界

- 複合体入力UI（部品追加・削除、表形式編集）
- モータ軸換算慣性、慣性比計算（駆動系選定グループの別ページ）
- 加速トルク計算（駆動系選定グループの別ページ、本ページの`J`を入力として利用する想定）
- 追加形状の候補：7章で参照した一次資料には、球（中実球）、球殻、中空円環（フープ）についても公式（`J=2/5mR²`、`J=2/3mR²`、`J=MR²`等）が掲載されている。これらは本MVPの対象形状（5章）には含まれていないが、同一の一次資料で裏付け済みであるため、将来のMVP拡張候補として記録する。
- 回転軸の簡易図（本Unitでは作成しない）

## 18. 出典管理

```yaml
source_requirements:
  formula_source:
    priority:
      - 公的機関
      - 大学等の教育機関
      - メーカー公式技術資料
    applied: OpenStax（Rice University）およびUniversity of Victoriaの教育機関資料を一次・二次資料として使用（7章）
  axis_definition_required: true
  axis_definition_recorded: 6章に形状ごとに記録済み
  confirmation_date_required: true
  confirmation_date_recorded: 2026-07-28（7章）
  url_required: true
  url_recorded: true（7章）
  copied_figures_prohibited: true
  copied_figures_status: 遵守（出典資料の図・表は転載せず、公式と数値のみを自分の言葉で要約した）
  copied_tables_prohibited: true
  copied_tables_status: 遵守
```

外部資料の図、表、文章は転載していない。本書の公式・検算値はすべて独自に計算し直したものである。

## 19. 実装前の未確認事項

- 5.4.2「端軸」をUI上でどう提供するか（8.3節の(a)(b)のいずれか）は、実装Unitで決定する
- 回転軸の簡易図の要否・作成方法は、実装Unitで検討する
- `data/units.json`へ質量（g・kg）・長さ（mm・m）以外の新規quantity追加が必要かどうかは、既存quantityで十分と考えられるが、実装Unit側で最終確認する
- 球・球殻・フープ等の追加形状をMVP-2として実装するかどうかは、PMの優先順位判断が必要（17章）

## 20. 今回実施しないこと

- HTML・CSS・JavaScriptの作成・変更
- `design-calculations.html`・`data/pages.json`・`data/units.json`・`torque.html`・`linear-rotational-speed.html`の変更
- モータ軸換算慣性、減速比計算、加速トルク計算、慣性比判定、モータ選定機能の実装
- メーカー固有の許容慣性値の組込み
- Issue更新、push、次Unit開始

---

```yaml
implementation_readiness:
  point_mass: ready
  solid_cylinder: ready
  hollow_cylinder: ready
  slender_rod_center_axis: ready
  slender_rod_end_axis: ready
  rectangular_plate: ready
  parallel_axis_theorem: ready
overall: ready
unresolved_items:
  - 端軸のUI提供方式（8.3節(a)/(b)の選択、実装Unitで決定）
  - 回転軸の簡易図の要否（実装Unitで検討）
  - data/units.jsonへの新規quantity追加要否の最終確認
recommended_mvp_shapes:
  - point_mass
  - solid_cylinder
  - hollow_cylinder
  - slender_rod_center_axis
  - slender_rod_end_axis
  - rectangular_plate
  - parallel_axis_theorem
deferred_shapes:
  - solid_sphere（将来拡張候補、一次資料で裏付け可能だが本MVP対象外）
  - spherical_shell（将来拡張候補、同上）
  - hoop_ring（将来拡張候補、同上）
```
