# 可変パラメータ数最適化プログラム  
実行手順書（起動時引数例付き）

---

## 1. はじめに

本手順書は、  
**パラメータ数が事前に決まらない最適化問題**（例：複数ピークフィッティング）を  
`tkoptimize_flex` フレームワークを用いて実行する際の、

- 実際の解析フロー
- 各ステップで使用する代表的な起動時引数

を対応付けて示したものです。

---

## 2. 全体フロー概要

---

可変パラメータ最適化は、以下の順序で進めます。

1. 入力ファイルの準備・確認  
2. 変数の定義・作成（モデル構造決定）  
3. シミュレーションで最適化条件を設定  
4. 線形パラメータの最適化  
5. 非線形最適化  
6. 尤度関数による誤差評価  

---

## 3. Step 1  
## 入力ファイルの準備（確認・描画）

---

### 目的

- 入力ファイルが正しく読めるか確認
- x 軸・y 軸の列指定、解析範囲が妥当か確認

---

### 起動時引数例（入力データの描画）

---

python optimize_peakfit.py plot  
--infile xrd_data.xlsx  
--xlabel 0  
--ylabel 1  
--xmin 20.0  
--xmax 40.0  

---

### この段階で確認すること

- データが正しく描画される
- 範囲指定が意図通り反映されている
- 明らかな外れ値がない

---

## 4. Step 2  
## 変数の定義・作成（モデル構造決定）

---

### 目的

- ピーク探索を行い、ピーク数を自動決定
- 初期値・制約条件を動的に生成

---

### 起動時引数例（ピーク探索）

---

python optimize_peakfit.py search  
--infile xrd_data.xlsx  
--xlabel 0  
--ylabel 1  
--xmin 20.0  
--xmax 40.0  
--nsmooth 7  
--norder 5  
--threshold 3000  
--ydiff1_threshold 1.0  

---

### 出力・挙動

- 検出されたピーク位置・幅・強度が表示される
- ピーク数に応じて  
  I0i, xci, wi  
  が内部的に生成される

---

### 注意点

- ピークが多すぎる／少なすぎる場合は  
  nsmooth, threshold, ydiff1_threshold を調整する

---

## 5. Step 3  
## シミュレーション（最適化条件の確認）

---

### 目的

- 最適化を行わず、現在のパラメータでモデル曲線を描画
- 初期値・制約条件が妥当かを確認

---

### 起動時引数例（シミュレーション）

---

python optimize_peakfit.py sim  
--infile xrd_data.xlsx  
--xmin 20.0  
--xmax 40.0  
--method simplex  

---

### この段階で調整する項目

- 初期値（x0）
- 探索幅（dx）
- パラメータ範囲（kmin, kmax）

---

### 注意

- モデルが大きく破綻している場合は  
  次のステップに進まない

---

## 6. Step 4  
## 線形パラメータの最適化

---

### 目的

- 線形パラメータ（背景・ピーク強度）を安定化
- 非線形最適化の前処理として使用

---

### 起動時引数例（線形最小二乗）

---

python optimize_peakfit.py lfit  
--infile xrd_data.xlsx  
--xmin 20.0  
--xmax 40.0  

---

### 内部処理

- 非線形パラメータを固定
- 線形最小二乗法で  
  背景項および I0i を一括最適化

---

### 確認ポイント

- ピーク強度が負になっていないか
- 不自然に大きな値になっていないか

---

## 7. Step 5  
## 非線形最適化

---

### 目的

- ピーク位置・幅を含めた本格的な最適化
- 評価関数（尤度）を最小化

---

### 起動時引数例（独自 SIMPLEX 法）

---

python optimize_peakfit.py fit  
--infile xrd_data.xlsx  
--xmin 20.0  
--xmax 40.0  
--method simplex  
--nmaxiter 500  
--tol 1.0e-6  

---

### SciPy Nelder–Mead を使う場合

---

python optimize_peakfit.py fit  
--infile xrd_data.xlsx  
--method nelder-mead  

---

### 多峰性が疑われる場合（GA / Swarm）

---

python optimize_peakfit.py fit  
--infile xrd_data.xlsx  
--method ga  

---

## 8. Step 6  
## 尤度関数による誤差評価

---

### 目的

- 非線形・非対称な誤差分布を可視化
- 共分散行列に依らない誤差評価を行う

---

### 起動時引数例（パラメータスキャン）

---

python optimize_peakfit.py scan  
--infile xrd_data.xlsx  
--scan_param xc1  
--scan_min 22.5  
--scan_max 23.5  
--scan_n 50  

---

### 評価量の解釈

---

最小化している評価関数は、

$$
f(\mathbf{x}) \approx -2 \log \mathcal{L}(\mathbf{x})
$$

と解釈できるため、

$$
\Delta f(x_i)
=
f(x_i) - f_{\min}
$$

をプロットすることで、

- 非対称な誤差
- 上下で異なる信頼区間
- 物理的制約の影響

を直接評価できます。

---

## 9. 実行フローまとめ（起動順）

---

1. plot  
   → 入力データ確認  

2. search  
   → モデル構造（パラメータ数）決定  

3. sim  
   → 初期条件・制約確認  

4. lfit  
   → 線形パラメータ最適化  

5. fit  
   → 非線形最適化  

6. scan  
   → 尤度関数による誤差評価  

---

## 10. おわりに

---

可変パラメータ数最適化では、

- 「自動化しすぎない」
- 「途中で必ず人間が確認する」

ことが、安定した解析と正しい解釈につながります。

本手順書が、  
`tkoptimize_flex` フレームワークを用いた  
**安全で再現性の高い解析作業**の指針となれば幸いです。

---
