線形補間の計算方法|2点から途中の値を求める式とPython実装

機械設計や工学計算では、必要な値が表にぴったり掲載されているとは限りません。

たとえば、ある材料特性が20℃と40℃では分かっていても、設計条件が30℃ということがあります。メーカーの性能表でも、回転数、流量、温度、圧力などが一定間隔でしか掲載されていないことがあります。

このようなとき、2つの既知データの間を直線と仮定して途中の値を求める方法が**線形補間(linear interpolation)**です。

NumPyにも1次元線形補間を行うnumpy.interpが用意されており、離散データから中間値を求める基本的な数値計算として利用できます。

この記事では、線形補間の式、計算例、Python実装、外挿との違い、実務で使用するときの注意点を整理します。

目次

線形補間とは

2点、(x1,y1)(x_1,y_1)

と、(x2,y2)(x_2,y_2)

が分かっているとします。

この2点を直線で結び、その途中にあるxxに対応するyyを求めるのが線形補間です。

基本式は、y=y1+x−x1x2−x1(y2−y1)y = y_1+ \frac{x-x_1}{x_2-x_1} (y_2-y_1)

です。

式を分解すると、x−x1x2−x1\frac{x-x_1}{x_2-x_1}

は、既知区間の中で目的のxxがどの位置にあるかを表しています。

これを比率rrとすると、r=x−x1x2−x1r= \frac{x-x_1}{x_2-x_1}

なので、y=y1+r(y2−y1)y=y_1+r(y_2-y_1)

と考えることもできます。

r=0r=0なら最初の点、r=1r=1なら最後の点、r=0.5r=0.5ならちょうど中間です。

線形補間の計算例

次のデータがあるとします。

温度値
20 ℃100
40 ℃140

30℃での値を求めます。

既知点は、x1=20x_1=20y1=100y_1=100x2=40x_2=40y2=140y_2=140

です。

求めたい位置は、x=30x=30

なので、y=100+30−2040−20(140−100)y = 100+ \frac{30-20}{40-20} (140-100)

となります。

まず位置の比率は、1020=0.5\frac{10}{20}=0.5

です。

したがって、y=100+0.5×40y = 100+0.5\times40y=120y=120

となります。

30℃は20℃と40℃のちょうど中間なので、結果も100と140の中間になります。

一般式は直線の式から導ける

2点間の傾きをmmとすると、m=y2−y1x2−x1m= \frac{y_2-y_1}{x_2-x_1}

です。

点(x1,y1)(x_1,y_1)を通る直線は、y−y1=m(x−x1)y-y_1=m(x-x_1)

なので、y=y1+y2−y1x2−x1(x−x1)y = y_1+ \frac{y_2-y_1}{x_2-x_1}(x-x_1)

となります。

これは線形補間の式そのものです。

つまり線形補間は特殊な計算ではなく、既知の2点を結ぶ直線の方程式から途中の値を求めているだけです。

補間と外挿は違う

線形補間で重要なのが、補間と外挿を区別することです。

既知データが、20≤x≤4020\leq x\leq40

なら、30℃を求めるのは補間です。

一方、50℃を同じ直線で求める場合は既知範囲の外側なので**外挿(extrapolation)**になります。

数学的には同じ直線式で計算できます。

しかし工学的な意味は大きく異なります。

既知区間内では近似的に直線とみなせても、その外側でも同じ傾向が続く保証はありません。

たとえば、

  • 材料物性
  • 粘度
  • 摩擦係数
  • ポンプ効率
  • モーター特性
  • 熱特性

などには非線形性があります。

したがって、プログラムで自動計算するときも、補間と外挿を区別する方が安全です。

Pythonで線形補間を関数化する

基本式はPythonで簡単に実装できます。

def linear_interpolate(x, x1, y1, x2, y2):
    if x2 == x1:
        raise ValueError("x1とx2は異なる値である必要があります")

    ratio = (x - x1) / (x2 - x1)
    return y1 + ratio * (y2 - y1)


result = linear_interpolate(
    x=30,
    x1=20,
    y1=100,
    x2=40,
    y2=140,
)

print(result)

出力は、

120.0

です。

この関数を再利用すれば、温度だけでなく、

  • 圧力
  • 流量
  • 回転数
  • 寸法
  • 荷重
  • 速度

など、さまざまな数値表へ適用できます。

外挿を禁止する実装

設計ツールでは、意図せず表の範囲外を計算してしまうことがあります。

そのため、外挿を禁止するなら明示的にチェックします。

def linear_interpolate(x, x1, y1, x2, y2):
    if x2 == x1:
        raise ValueError("x1とx2は異なる値である必要があります")

    lower = min(x1, x2)
    upper = max(x1, x2)

    if not lower <= x <= upper:
        raise ValueError("補間範囲外です")

    ratio = (x - x1) / (x2 - x1)

    return y1 + ratio * (y2 - y1)

このようにしておけば、

linear_interpolate(
    x=50,
    x1=20,
    y1=100,
    x2=40,
    y2=140,
)

のような入力をエラーにできます。

計算式だけでなく、どの範囲で使用可能なのかまでロジック化することが重要です。

NumPyで複数データを補間する

データ点が2つではなく多数ある場合は、NumPyのinterpを利用できます。

NumPy公式リファレンスでは、numpy.interpは与えられた離散データ点から1次元の区分線形補間値を返す関数として定義されています。

import numpy as np

temperature = np.array([
    20.0,
    40.0,
    60.0,
    80.0,
])

value = np.array([
    100.0,
    140.0,
    175.0,
    200.0,
])

result = np.interp(
    50.0,
    temperature,
    value,
)

print(result)

この場合、50℃は40℃と60℃の間なので、その2点を使って補間されます。

複数点の表を扱う場合、

入力値
↓
前後の2点を探索
↓
線形補間
↓
結果

という処理を自分で作ることもできますが、標準的なライブラリを利用できる場合は既存機能を活用した方が実装を簡潔にできます。

ただしNumPy公式ドキュメントでは、補間元のxpは増加順であることが期待され、非増加データでは意味のある結果にならないと注意されています。

したがって、外部データを読み込む場合は入力検証も必要です。

if not np.all(np.diff(temperature) > 0):
    raise ValueError("xデータは昇順である必要があります")

線形補間が向いているデータ

線形補間は、既知点の間で値がほぼ直線的に変化すると考えられる場合に適しています。

たとえば、データ点が十分細かく、

既知点 ─── 未知点 ─── 既知点

という狭い範囲だけを補う用途です。

工学表では、

  • メーカー性能表の中間値
  • 実験データの中間値
  • 計算表の中間値
  • 物性値表の中間値

などで使いやすい方法です。

一方、実際の関係が強く曲がっている場合には誤差が大きくなります。

線形補間を使わない方がよいケース

次のような場合には注意が必要です。

非線形性が強い

2点間でも曲率が大きい場合、直線近似が適切とは限りません。

不連続点がある

バルブの切替点や制御ロジックの境界のように、値が連続的に変化しない場合には線形補間は適しません。

相変化や状態変化がある

温度による物性値などでは、区間内で物理状態が変化する場合があります。

データ間隔が広すぎる

2点が大きく離れているほど、その間を直線と仮定する根拠は弱くなります。

メーカーが補間を認めていない

選定表や保証範囲では、単純補間ではなくメーカー指定の計算方法が存在することがあります。

仕様書・カタログ・規格に計算方法が記載されている場合はそちらを優先します。

単位にも注意する

線形補間では、xx方向とyy方向それぞれの単位を統一する必要があります。

たとえば温度側で、

20 ℃
40 ℃

のデータに対して、

303.15 K

をそのまま投入すれば、数値としては全く違う位置として扱われます。

プログラムでは値だけでなく、

{
  "x_unit": "degC",
  "y_unit": "mm2_s",
  "points": [
    {"x": 20.0, "y": 100.0},
    {"x": 40.0, "y": 140.0}
  ]
}

のように単位もデータとして保持すると、安全性を高められます。

設計計算ツールへ組み込む場合

線形補間は単独でも便利ですが、より価値が高いのは表データを計算ロジックとして再利用できることです。

たとえば、

メーカー表
↓
CSV / JSON
↓
データ検証
↓
前後点を検索
↓
線形補間
↓
計算結果
↓
機器選定

という処理にできます。

入力データをJSONやCSVへ分離すれば、計算コードを書き換えずに表だけ更新できます。

たとえば、

{
  "parameter": "example_property",
  "x_unit": "degC",
  "y_unit": "unit",
  "interpolation": "linear",
  "allow_extrapolation": false,
  "data": [
    [20, 100],
    [40, 140],
    [60, 175],
    [80, 200]
  ]
}

という構造です。

ここまでデータ化しておけば、

  • Python計算
  • Web計算ツール
  • API
  • Excel出力
  • グラフ表示

などから同じデータを利用できます。

補間方法をデータ属性として持たせる

すべてのデータが線形補間できるとは限りません。

そのため、

"interpolation": "linear"

のように補間方法そのものをデータ属性として保持する設計も考えられます。

将来的には、

linear
nearest
cubic
none

などを切り替えられます。

SciPyには線形補間だけでなく、より一般的な補間アルゴリズムが用意されています。

ただし、高次の補間を使えば必ず精度が上がるわけではありません。

元データの性質と必要精度に応じて方法を選択する必要があります。

まとめ

線形補間は、2つの既知点、(x1,y1)(x_1,y_1)(x2,y2)(x_2,y_2)

から、その間の値を、y=y1+x−x1x2−x1(y2−y1)y = y_1+ \frac{x-x_1}{x_2-x_1} (y_2-y_1)

で求める方法です。

式自体は単純ですが、実務では、

  • 補間か外挿か
  • データは昇順か
  • 単位は統一されているか
  • 区間内を直線とみなしてよいか
  • メーカー指定の計算法がないか

を確認する必要があります。

さらに線形補間を関数化し、元データをCSVやJSONへ分離すると、単なる手計算ではなく再利用可能な計算ロジックになります。

メーカー表や工学データを機械的に読み取り、WebツールやPython計算へつなげる場合にも、線形補間は基礎となる数値処理の一つです。

参考情報

  • NumPy Reference — numpy.interp
  • SciPy — Scientific computing / interpolation
  • NIST — Model-Based Interpolation, Prediction, and Approximation
参考になったらシェアしてください
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

目次