100本ノック / 数値計算 / 数値計算100本ノック

製造業の補間・近似入門|疎な工程測定から品質曲線をPythonで推定

疎な工程測定から安全な条件設定を導く:補間と近似の数値計算10本ノック(No.051〜No.060)

本記事では、限られた実験点・センサー点から連続的な工程特性を推定する「補間と近似」を、架空の熱処理工程における温度設定、品質予測、制御目標、検証計画へ結び付けます。ラグランジュ補間から回帰との違いまでを比較し、曲線が描けることと、意思決定に使えることの間にある注意点も明確にします。

[!NOTE] 本資料は、数理工房 (もしくは代表である和山個人) が過去に企業研修において使用した notebook を企業様の許可を得て再構成・編集のうえ公開しています。
掲載データはすべて架空のものであり、実在する企業・工場・数値とは一切関係ありません。

はじめに:この記事で扱う製造業の実務課題

熱処理条件を決める際、すべての温度で試験することはできません。試験片、設備時間、検査費用には制約があり、手元にあるのは数点の温度と強度だけです。一方、現場は未測定温度の品質、規格下限を満たす運転範囲、制御器へ渡す滑らかな目標軌道を必要とします。

そこで本記事では「測定点の間をどう埋めるか」「ノイズを含む点群から傾向をどう取り出すか」「推定結果の不確かさをどう判断へ反映するか」を扱います。

現場でよくある状況

  • 実験計画で測定した温度は5〜8水準に限られる
  • センサー値には測定誤差があり、同じ条件でも品質がばらつく
  • PLCやシミュレーターには連続値の参照テーブルが必要
  • 測定範囲外まで曲線を延ばし、根拠の弱い外挿をしてしまう
  • 滑らかなグラフを「正しい工程モデル」と誤認してしまう

なぜこの問題は判断が難しいのか

補間は原則として既知点を通りますが、点間の真値を保証しません。近似は点を必ずしも通らない代わりに、ノイズを平均化して全体傾向を表せます。さらに、同じ点群でも手法、次数、節点配置、境界条件により曲線は変わります。したがって、目的を「表示」「制御」「予測」「原因説明」のどれに置くかを先に決める必要があります。

今回扱うノックの全体像

No.テーマ製造業での主な用途
051ラグランジュ補間少数の校正点を通る参照曲線
052ニュートン補間測定点追加時の逐次更新
053スプライン補間局所的で滑らかな工程曲線
054最小二乗近似ばらつきから全体傾向を抽出
055チェビシェフ近似区間全体の最大誤差を抑制
056ベジェ曲線搬送・ロボット軌道の設計
057フーリエ近似周期的な設備変動の表現
058多項式近似次数と汎化性能の比較
059補間誤差追加測定点の配置判断
060回帰との違い補間・近似・回帰の使い分け

Python 環境の準備

NumPy で数値計算、pandas で表、SciPy で補間、matplotlib で可視化します。乱数シードは固定し、同じ結果を再現できるようにします。

%matplotlib inline
import platform
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import japanize_matplotlib
from scipy.interpolate import lagrange, BarycentricInterpolator, CubicSpline

rng = np.random.default_rng(20260712)
pd.set_option("display.precision", 3)
print(f"Python: {platform.python_version()}")
print(f"NumPy: {np.__version__}, pandas: {pd.__version__}, matplotlib: {matplotlib.__version__}")
Python: 3.13.1
NumPy: 2.5.1, pandas: 3.0.3, matplotlib: 3.11.0

架空データの作成

熱処理炉の設定温度 TT と、処理後の引張強度 SS の関係を作ります。真の関係は説明・誤差評価のためだけに使い、実務では未知である点に注意してください。校正用データはノイズのない5点、実験データは測定・個体差を含む18点です。また、周期変動と搬送軌道の例も用意します。

def true_strength(temp):
    x = (np.asarray(temp) - 800.0) / 100.0
    return 930 + 85*x - 48*x**2 + 8*np.sin(2.5*x)

temp_cal = np.array([700, 750, 800, 850, 900], dtype=float)
strength_cal = true_strength(temp_cal)
temp_dense = np.linspace(700, 900, 401)

temp_exp = np.linspace(705, 895, 18)
strength_exp = true_strength(temp_exp) + rng.normal(0, 8, len(temp_exp))
data_df = pd.DataFrame({"設定温度_℃": temp_exp, "引張強度_MPa": strength_exp})
display(data_df.head(8))

plt.figure(figsize=(8, 4.2))
plt.scatter(temp_exp, strength_exp, label="ばらつきを含む実験値", color="tab:blue")
plt.plot(temp_dense, true_strength(temp_dense), label="評価用の真値", color="black", linestyle="--")
plt.title("架空の熱処理実験データ")
plt.xlabel("設定温度 (℃)"); plt.ylabel("引張強度 (MPa)")
plt.grid(True, alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()
設定温度_℃ 引張強度_MPa
0 705.000 806.289
1 716.176 823.553
2 727.353 838.499
3 738.529 854.902
4 749.706 870.813
5 760.882 886.412
6 772.059 895.513
7 783.235 915.293

png

No.051:ラグランジュ補間

実務での意味

校正点を必ず通る参照値が必要な場合、ラグランジュ補間は補間の基本を明快に示します。試験点間の強度を参照する簡易テーブルの理解に有効です。

分析・モデル化の考え方

n+1n+1 個の節点 (xi,yi)(x_i,y_i) に対し、補間多項式は

Pn(x)=i=0nyiLi(x),Li(x)=jixxjxixjP_n(x)=\sum_{i=0}^{n}y_iL_i(x),\qquad L_i(x)=\prod_{j\ne i}\frac{x-x_j}{x_i-x_j}

です。Pn(xi)=yiP_n(x_i)=y_i を満たしますが、高次数化すると端部で振動しやすく、外挿には特に弱い点が重要です。

Pythonで確認する

lag_poly = lagrange(temp_cal, strength_cal)
lag_pred = lag_poly(temp_dense)
check_051 = pd.DataFrame({"温度_℃": temp_cal, "実測_MPa": strength_cal,
                          "補間_MPa": lag_poly(temp_cal),
                          "差_MPa": lag_poly(temp_cal) - strength_cal})
display(check_051.round(6))
plt.figure(figsize=(8, 4.2))
plt.plot(temp_dense, true_strength(temp_dense), "k--", label="評価用の真値")
plt.plot(temp_dense, lag_pred, label="ラグランジュ補間")
plt.scatter(temp_cal, strength_cal, color="tab:red", label="校正点")
plt.title("ラグランジュ補間:校正点を通る曲線")
plt.xlabel("設定温度 (℃)"); plt.ylabel("引張強度 (MPa)")
plt.grid(True, alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()
/var/folders/3y/fmw40k0x78xblvb3gkcyvy1h0000gn/T/ipykernel_3921/1114524623.py:1: DeprecationWarning: `lagrange` is deprecated and will be removed in SciPy 1.20.0. Use `scipy.interpolate.BarycentricInterpolator` instead.
  lag_poly = lagrange(temp_cal, strength_cal)
温度_℃ 実測_MPa 補間_MPa 差_MPa
0 700.0 792.212 792.212 -0.0
1 750.0 867.908 867.908 -0.0
2 800.0 930.000 930.000 -0.0
3 850.0 968.092 968.092 -0.0
4 900.0 971.788 971.788 -0.0

png

結果の読み取り

校正点で差がほぼゼロとなり、条件を満たすことが確認できます。ただし、点を通ることは点間の物理現象が正しいことを意味しません。採用時は測定範囲内に限定し、追加確認点で最大誤差を評価します。

No.052:ニュートン補間

実務での意味

実験点が順次追加される開発工程では、全式を作り直さず、新しい差分係数を追加できるニュートン形式が便利です。

分析・モデル化の考え方

分割差分 f[xi,,xj]f[x_i,\ldots,x_j] を使い、

Pn(x)=f[x0]+f[x0,x1](xx0)++f[x0,,xn]j=0n1(xxj)P_n(x)=f[x_0]+f[x_0,x_1](x-x_0)+\cdots+f[x_0,\ldots,x_n]\prod_{j=0}^{n-1}(x-x_j)

と表します。ラグランジュ形式と同じ補間多項式ですが、点追加時の更新構造が異なります。

Pythonで確認する

def divided_differences(x, y):
    coef = np.array(y, dtype=float).copy()
    for j in range(1, len(x)):
        coef[j:] = (coef[j:] - coef[j-1:-1]) / (x[j:] - x[:-j])
    return coef

def newton_eval(x_eval, x_nodes, coef):
    value = np.zeros_like(np.asarray(x_eval), dtype=float) + coef[-1]
    for k in range(len(coef)-2, -1, -1):
        value = coef[k] + (np.asarray(x_eval) - x_nodes[k]) * value
    return value

coef4 = divided_differences(temp_cal[:4], strength_cal[:4])
coef5 = divided_differences(temp_cal, strength_cal)
display(pd.DataFrame({"次数": range(5), "5点の分割差分係数": coef5}).round(6))
plt.figure(figsize=(8, 4.2))
plt.plot(temp_dense, newton_eval(temp_dense, temp_cal[:4], coef4), label="4点で作成")
plt.plot(temp_dense, newton_eval(temp_dense, temp_cal, coef5), label="900℃を追加")
plt.scatter(temp_cal, strength_cal, color="tab:red", label="校正点")
plt.title("ニュートン補間:測定点追加による更新")
plt.xlabel("設定温度 (℃)"); plt.ylabel("引張強度 (MPa)")
plt.grid(True, alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()
次数 5点の分割差分係数
0 0 7.922e+02
1 1 1.514e+00
2 2 -2.721e-03
3 3 -1.400e-05
4 4 0.000e+00

png

結果の読み取り

900℃の点を追加すると、その点を含む項が加わり、特に高温側の推定が更新されます。逐次更新は便利ですが、古い測定条件と新しい測定条件の測定系が同等であることを確認しなければ、差分係数に測定系変更が混入します。

No.053:スプライン補間

実務での意味

温度帯ごとの局所的な形状を保ちながら滑らかにつなぎたい場合、3次スプラインが有力です。校正テーブルや滑らかな設定値生成に向きます。

分析・モデル化の考え方

区間ごとに3次多項式を置き、節点で関数値・1階微分・2階微分を連続にします。自然スプラインでは両端の2階微分をゼロとします。全区間を単一の高次多項式で表さないため、1点の変更が遠方へ与える影響を抑えられます。

Pythonで確認する

spline = CubicSpline(temp_cal, strength_cal, bc_type="natural")
spline_pred = spline(temp_dense)
compare_053 = pd.DataFrame({
    "手法": ["ラグランジュ", "自然3次スプライン"],
    "区間内最大絶対誤差_MPa": [np.max(np.abs(lag_pred-true_strength(temp_dense))),
                                np.max(np.abs(spline_pred-true_strength(temp_dense)))]})
display(compare_053.round(3))
plt.figure(figsize=(8, 4.2))
plt.plot(temp_dense, true_strength(temp_dense), "k--", label="評価用の真値")
plt.plot(temp_dense, spline_pred, label="自然3次スプライン")
plt.scatter(temp_cal, strength_cal, color="tab:red", label="校正点")
plt.title("スプライン補間:局所的で滑らかな推定")
plt.xlabel("設定温度 (℃)"); plt.ylabel("引張強度 (MPa)")
plt.grid(True, alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()
手法 区間内最大絶対誤差_MPa
0 ラグランジュ 0.551
1 自然3次スプライン 1.646

png

結果の読み取り

この架空例では自然スプラインの区間内最大誤差を定量比較できます。境界条件は端部の傾きを左右するため、端部で既知の勾配があるなら、その知識を境界条件へ反映します。滑らかさだけで手法を選ばず、誤差と物理整合性で判断します。

No.054:最小二乗近似

実務での意味

実験値にばらつきがあるとき、すべての点を通る補間はノイズまで再現します。最小二乗近似は、品質傾向、管理用基準線、感度の概算に使えます。

分析・モデル化の考え方

モデル yXβy\approx X\beta に対し、残差平方和

minβXβy22\min_{\beta}\|X\beta-y\|_2^2

を最小にします。ここでは温度を中心化・尺度化して数値安定性を高め、2次式を当てはめます。係数の解釈には単位変換を意識します。

Pythonで確認する

x_exp = (temp_exp - 800) / 100
coef_ls = np.polyfit(x_exp, strength_exp, deg=2)
ls_pred = np.polyval(coef_ls, (temp_dense-800)/100)
resid = strength_exp - np.polyval(coef_ls, x_exp)
metrics_054 = pd.DataFrame({"指標": ["RMSE", "平均残差", "最大絶対残差"],
                            "値_MPa": [np.sqrt(np.mean(resid**2)), np.mean(resid), np.max(np.abs(resid))]})
display(metrics_054.round(3))
plt.figure(figsize=(8, 4.2))
plt.scatter(temp_exp, strength_exp, label="実験値", color="tab:blue")
plt.plot(temp_dense, ls_pred, label="2次最小二乗近似", color="tab:orange")
plt.title("最小二乗近似:ばらつきから全体傾向を抽出")
plt.xlabel("設定温度 (℃)"); plt.ylabel("引張強度 (MPa)")
plt.grid(True, alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()
指標 値_MPa
0 RMSE 5.247
1 平均残差 -0.000
2 最大絶対残差 9.420

png

結果の読み取り

近似曲線は各点を通りませんが、残差の平均はほぼゼロとなり、全体傾向を表します。RMSEは「典型的なずれ」の目安です。規格下限付近の条件決定では、平均予測だけでなく予測区間や安全余裕を設けます。

No.055:チェビシェフ近似

実務での意味

区間全体で極端に悪い誤差を避けたい校正や組込み計算では、チェビシェフ多項式が有効です。通常のべき基底より高次で数値的に扱いやすい利点もあります。

分析・モデル化の考え方

z[1,1]z\in[-1,1] 上のチェビシェフ多項式は Tk(z)=cos(karccosz)T_k(z)=\cos(k\arccos z) で定義されます。節点を端部に密に置くことで、多項式補間の端部振動を抑えます。ここでは同数の等間隔節点とチェビシェフ節点を比較します。

Pythonで確認する

n_nodes = 8
z_equal = np.linspace(-1, 1, n_nodes)
z_cheb = np.cos((2*np.arange(n_nodes)+1)*np.pi/(2*n_nodes))
t_equal = 800 + 100*z_equal
t_cheb = 800 + 100*z_cheb
p_equal = BarycentricInterpolator(t_equal, true_strength(t_equal))(temp_dense)
p_cheb = BarycentricInterpolator(t_cheb, true_strength(t_cheb))(temp_dense)
err_055 = pd.DataFrame({"節点": ["等間隔", "チェビシェフ"],
                        "最大絶対誤差_MPa": [np.max(np.abs(p_equal-true_strength(temp_dense))),
                                           np.max(np.abs(p_cheb-true_strength(temp_dense)))]})
display(err_055.round(4))
plt.figure(figsize=(8, 4.2))
plt.plot(temp_dense, np.abs(p_equal-true_strength(temp_dense)), label="等間隔節点")
plt.plot(temp_dense, np.abs(p_cheb-true_strength(temp_dense)), label="チェビシェフ節点")
plt.title("節点配置による補間誤差の比較")
plt.xlabel("設定温度 (℃)"); plt.ylabel("絶対誤差 (MPa)")
plt.grid(True, alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()
節点 最大絶対誤差_MPa
0 等間隔 1.900e-03
1 チェビシェフ 6.000e-04

png

結果の読み取り

最大誤差で比較すると、平均誤差だけでは見えない最悪箇所を確認できます。実験温度を自由に配置できる場合、端部も含めた精度向上の候補になります。ただし、安全・設備制約で選べない温度を数学的な節点だけで要求してはいけません。

No.056:ベジェ曲線

実務での意味

ベジェ曲線は、ロボットや搬送装置の経路を制御点で直感的に設計する考え方です。通過点補間ではなく、始点・終点と接線方向を制御する用途に向きます。

分析・モデル化の考え方

3次ベジェ曲線は制御点 P0,,P3P_0,\ldots,P_3 を用いて

B(t)=(1t)3P0+3(1t)2tP1+3(1t)t2P2+t3P3,0t1B(t)=(1-t)^3P_0+3(1-t)^2tP_1+3(1-t)t^2P_2+t^3P_3,\quad 0\le t\le1

です。曲線は一般に中間制御点を通りません。制御点の凸包内に収まる性質は、安全領域の粗い確認に役立ちます。

Pythonで確認する

P = np.array([[0.0, 0.0], [1.5, 2.8], [4.0, 2.4], [5.5, 0.5]])
tau = np.linspace(0, 1, 201)
B = ((1-tau)**3)[:,None]*P[0] + (3*(1-tau)**2*tau)[:,None]*P[1] +     (3*(1-tau)*tau**2)[:,None]*P[2] + (tau**3)[:,None]*P[3]
path_length = np.sum(np.linalg.norm(np.diff(B, axis=0), axis=1))
display(pd.DataFrame({"指標": ["近似経路長"], "値_m": [path_length]}).round(3))
plt.figure(figsize=(7, 4.5))
plt.plot(B[:,0], B[:,1], label="ベジェ軌道", linewidth=2)
plt.plot(P[:,0], P[:,1], "o--", label="制御多角形")
plt.title("搬送装置の3次ベジェ軌道")
plt.xlabel("X位置 (m)"); plt.ylabel("Y位置 (m)")
plt.grid(True, alpha=0.3); plt.axis("equal"); plt.legend(); plt.tight_layout(); plt.show()
指標 値_m
0 近似経路長 6.831

png

結果の読み取り

中間制御点を動かすと、始終端を変えずに曲率と進入方向を調整できます。ただし、この図だけでは速度、加速度、ジャーク、障害物余裕、機構限界を保証できません。実機導入では時間パラメータ化と衝突検証を別途行います。

No.057:フーリエ近似

実務での意味

設備負荷、周囲温度、電力使用量のような周期変動は、正弦・余弦の和で表せます。周期成分を分離すると、基準変動と異常変動を区別しやすくなります。

分析・モデル化の考え方

周期 PP の信号を

y(t)a0+k=1K[akcos(2πkt/P)+bksin(2πkt/P)]y(t)\approx a_0+\sum_{k=1}^{K}\left[a_k\cos(2\pi kt/P)+b_k\sin(2\pi kt/P)\right]

と近似します。次数 KK を増やすほど追従しますが、ノイズも拾います。ここでは24時間と8時間の成分を含む信号を最小二乗で推定します。

Pythonで確認する

hour = np.arange(0, 7*24)
load = 60 + 9*np.sin(2*np.pi*hour/24) + 4*np.cos(2*np.pi*hour/8) + rng.normal(0, 2, len(hour))
Xf = np.column_stack([np.ones(len(hour))] +
                     [f(2*np.pi*k*hour/24) for k in range(1, 4) for f in (np.cos, np.sin)])
beta_f, *_ = np.linalg.lstsq(Xf, load, rcond=None)
load_fit = Xf @ beta_f
display(pd.DataFrame({"指標": ["元信号標準偏差", "残差標準偏差"],
                      "値": [np.std(load), np.std(load-load_fit)]}).round(3))
plt.figure(figsize=(9, 4.2))
plt.plot(hour, load, label="設備負荷", alpha=0.55)
plt.plot(hour, load_fit, label="3次フーリエ近似", linewidth=2)
plt.title("周期的な設備負荷のフーリエ近似")
plt.xlabel("経過時間 (h)"); plt.ylabel("設備負荷 (%)")
plt.grid(True, alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()
指標
0 元信号標準偏差 7.191
1 残差標準偏差 1.974

png

結果の読み取り

残差標準偏差が小さくなれば、周期的な基準変動を説明できています。残差を異常監視へ使う場合は、曜日、操業カレンダー、品種切替などの非周期要因を分離し、停止期間を通常運転と混ぜないことが重要です。

No.058:多項式近似

実務での意味

多項式は実装しやすい一方、次数を上げれば良いとは限りません。工程条件式を選ぶ際には、訓練データへの適合と未使用データでの再現性を分けて評価します。

分析・モデル化の考え方

データを訓練・検証へ分け、次数 dd ごとのRMSEを比較します。高次数では訓練誤差が下がっても検証誤差が増えることがあり、これは過学習の兆候です。中心化・尺度化は係数計算の悪条件化を軽減します。

Pythonで確認する

train_idx = np.arange(len(temp_exp)) % 3 != 0
x_scaled = (temp_exp-800)/100
rows = []
for degree in range(1, 9):
    c = np.polyfit(x_scaled[train_idx], strength_exp[train_idx], degree)
    pred_train = np.polyval(c, x_scaled[train_idx])
    pred_valid = np.polyval(c, x_scaled[~train_idx])
    rows.append([degree,
                 np.sqrt(np.mean((strength_exp[train_idx]-pred_train)**2)),
                 np.sqrt(np.mean((strength_exp[~train_idx]-pred_valid)**2))])
degree_df = pd.DataFrame(rows, columns=["次数", "訓練RMSE", "検証RMSE"])
display(degree_df.round(3))
plt.figure(figsize=(7.5, 4.2))
plt.plot(degree_df["次数"], degree_df["訓練RMSE"], "o-", label="訓練")
plt.plot(degree_df["次数"], degree_df["検証RMSE"], "o-", label="検証")
plt.title("多項式次数と汎化誤差")
plt.xlabel("多項式の次数"); plt.ylabel("RMSE (MPa)")
plt.grid(True, alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()
次数 訓練RMSE 検証RMSE
0 1 17.850 16.309
1 2 4.106 7.834
2 3 2.713 5.832
3 4 2.707 5.878
4 5 2.350 7.120
5 6 2.328 5.974
6 7 2.030 7.261
7 8 1.795 11.717

png

結果の読み取り

採用候補は訓練誤差が最小の次数ではなく、検証誤差が小さく、かつ説明・保守しやすい次数です。データ分割による偶然性があるため、本番では交差検証、残差診断、工程知識による単調性や上限の確認も行います。

No.059:補間誤差

実務での意味

補間曲線を運転条件の決定に使うには、「どこでどの程度外れるか」を測る必要があります。誤差分布は追加実験の温度を選ぶ根拠になります。

分析・モデル化の考え方

nn 次補間の誤差は、十分滑らかな関数なら

f(x)Pn(x)=f(n+1)(ξ)(n+1)!i=0n(xxi)f(x)-P_n(x)=\frac{f^{(n+1)}(\xi)}{(n+1)!}\prod_{i=0}^{n}(x-x_i)

と表せます。実務では高階微分が不明なことが多いため、保留した検証点で誤差を直接測り、最大絶対誤差や用途別許容差と比較します。

Pythonで確認する

validation_temp = np.arange(725, 900, 25, dtype=float)
validation_true = true_strength(validation_temp)
methods = {
    "ラグランジュ": lag_poly(validation_temp),
    "自然スプライン": spline(validation_temp),
    "2次最小二乗": np.polyval(coef_ls, (validation_temp-800)/100),
}
error_df = pd.DataFrame({"温度_℃": validation_temp, **{
    name: pred-validation_true for name, pred in methods.items()}})
display(error_df.round(3))
plt.figure(figsize=(8, 4.2))
for name in methods:
    plt.plot(validation_temp, error_df[name], "o-", label=name)
plt.axhline(0, color="black", linewidth=1)
plt.axhspan(-5, 5, color="tab:green", alpha=0.12, label="例:許容差 ±5 MPa")
plt.title("保留した検証点における推定誤差")
plt.xlabel("設定温度 (℃)"); plt.ylabel("推定誤差 (MPa)")
plt.grid(True, alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()
温度_℃ ラグランジュ 自然スプライン 2次最小二乗
0 725.0 -0.506 -0.603 4.521
1 750.0 -0.000 0.000 7.441
2 775.0 0.235 0.125 6.789
3 800.0 -0.000 0.000 3.665
4 825.0 -0.235 0.304 -0.162
5 850.0 -0.000 0.000 -2.921
6 875.0 0.506 -1.540 -3.511

png

結果の読み取り

誤差が大きい温度帯は追加測定の優先候補です。全体RMSEが小さくても、規格境界付近だけ誤差が大きければ意思決定には不適切です。許容差は分析者が任意に決めず、品質リスク、測定誤差、顧客要求から設定します。

No.060:回帰との違い

実務での意味

補間、近似、回帰は曲線を引く点では似ていますが、目的が異なります。誤った使い分けは、センサー校正、工程条件探索、品質説明の結論を変えます。

分析・モデル化の考え方

  • 補間:観測点を通り、点間の値を構成する。測定誤差が小さい参照表に向く。
  • 近似:複雑な関数や点群を扱いやすい式で表す。計算量・最大誤差・滑らかさを重視する。
  • 回帰:確率的なばらつきを含む目的変数と説明変数の関係を推定する。係数、不確かさ、予測を扱う。

ここでは、ばらつきを含む実験値へ補間と回帰的な最小二乗を適用し、未知の評価点で比較します。

Pythonで確認する

interp_noisy = BarycentricInterpolator(temp_exp, strength_exp)
test_temp = np.linspace(710, 890, 73)
test_true = true_strength(test_temp)
test_interp = interp_noisy(test_temp)
test_reg = np.polyval(coef_ls, (test_temp-800)/100)
comparison_060 = pd.DataFrame({
    "方法": ["全実験点を通る補間", "2次最小二乗(回帰的利用)"],
    "実験点でのRMSE_MPa": [0.0, np.sqrt(np.mean(resid**2))],
    "未知点でのRMSE_MPa": [np.sqrt(np.mean((test_interp-test_true)**2)),
                           np.sqrt(np.mean((test_reg-test_true)**2))]})
display(comparison_060.round(3))
plt.figure(figsize=(8, 4.2))
plt.scatter(temp_exp, strength_exp, s=24, label="実験値", color="tab:gray")
plt.plot(test_temp, test_interp, label="ノイズを補間", alpha=0.8)
plt.plot(test_temp, test_reg, label="2次最小二乗", linewidth=2)
plt.plot(test_temp, test_true, "k--", label="評価用の真値")
plt.title("補間と回帰的近似:未知点での違い")
plt.xlabel("設定温度 (℃)"); plt.ylabel("引張強度 (MPa)")
plt.grid(True, alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()
方法 実験点でのRMSE_MPa 未知点でのRMSE_MPa
0 全実験点を通る補間 0.000 61.922
1 2次最小二乗(回帰的利用) 5.247 4.625

png

結果の読み取り

補間は実験点で誤差ゼロでも、ノイズまで通るため未知点誤差が大きくなり得ます。最小二乗は実験点に残差を持つ一方、傾向推定では安定する場合があります。因果関係を主張するには、曲線の適合だけでなく実験計画、交絡管理、残差の仮定、再現試験が必要です。

対象ノックを通して見える実務上の示唆

  1. 目的から手法を選ぶ:参照点を厳密に通すなら補間、ノイズから傾向を得るなら最小二乗・回帰、周期性ならフーリエ近似、軌道形状ならベジェ曲線が候補です。
  2. 滑らかさと正しさは別である:見栄えの良い曲線でも、点間・端部・外挿先の妥当性は保証されません。
  3. 平均誤差だけを見ない:規格境界や端部での最大誤差、保留データでの誤差を確認します。
  4. 測定点の配置も意思決定である:誤差の大きい区間、曲率が大きい区間、品質リスクの高い区間へ追加試験を配分します。
  5. 数理モデルへ物理制約を加える:単調性、上下限、速度・加速度、操業可能範囲を無視しないことが重要です。

実務導入する場合に必要なこと

  • 用途と損失の定義:表示用、制御用、規格判定用のどれかを明確にし、誤差が生む損失を定義する
  • 測定系の保証:ゲージR&R、校正履歴、サンプリング条件を確認する
  • 検証設計:学習・補間に使わない条件を保留し、RMSEだけでなく最大誤差と規格境界で評価する
  • 適用範囲の固定:内挿範囲を明示し、外挿時には警告または計算停止を実装する
  • 変更管理:設備、材料、レシピ、測定器の変更時に再検証する
  • 運用監視:入力分布と残差を監視し、再学習・再校正の基準を定める

まとめ

No.051〜No.060では、少数点を通る補間、ばらつきをならす近似、周期・軌道を表す専用基底、誤差検証、回帰との違いを扱いました。実務で重要なのは最も複雑な曲線を作ることではなく、意思決定の目的、許容誤差、適用範囲、検証方法をセットで設計することです。

法人向けのご相談

数理工房では、製造業における実験計画、センサー校正、工程条件のモデル化、品質予測、数値計算の内製化支援を承っています。手法選定だけでなく、データ設計、検証基準、現場運用まで一体でご相談いただけます。

📩 お問い合わせ: surikobo.co.jp/contact
まずはお気軽にご相談ください。