浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【Python】スプライン曲線の書き方

 スプライン曲線はいくつかの式を組み合わせて自由な曲線をなるべく簡単に作ろうとする手法です。画像でいえば赤の曲線と青の曲線とまた別の赤の曲線を組み合わせて複雑な曲線を作っています。

B-スプライン曲線 – Wikipedia
 ざっくばらんに中身の式の例を書けば次の様になります。適当に分けられた区分の中でそれぞれ別の式が定義されているわけです。

 このそれぞれの式の作り方を与えられた点群に近似し、連続した値にする、という目的を達成する作り方としてPython上で扱います。
 コード例は次です。
 scipy.interpolate.UnivariateSpline — SciPy v1.4.1 Reference Guide

import matplotlib.pyplot as plt
from scipy.interpolate import UnivariateSpline
import numpy as np


def main():
    # テストデータの適当な点を作成
    x = np.linspace(-3, 3, 50)
    y = np.exp(-x ** 2) + 0.1 * np.random.randn(50)
    # 点をプロット
    plt.plot(x, y, 'ro', ms=5)

    # スプライン曲線を定義. ライブラリからの呼び出しだけでOK.
    # kは滑らかさを定義する引数
    spl = UnivariateSpline(x, y, k=5)

    # スプライン曲線を描画するX軸の値を定義
    xs = np.linspace(-3, 3, 1000)
    # スプライン曲線をプロット
    plt.plot(xs, spl(xs), 'g', lw=3)
    # プロットした諸々を表示
    plt.show()


if __name__ == '__main__':
    main()

 結果は次の画像です。ランダムノイズ等がのった荒れた点を滑らかに表現するのに便利です(単に表現するだけでなく滑らかにする方法を探索する場合はさすがに別の畑ですが)。無理に移動平均を取るなどして重い処理をする必要もありません。

 少々複雑になりますが例で使用した UnivariateSpline 関数以外にも制御と表現が複雑になった他関数がいくつもあります。
Interpolation (scipy.interpolate) — SciPy v1.4.1 Reference Guide

  • この記事いいね! (0)