スプライン曲線の求め方 pythonによる実装例



数学

公開日:2023/8/15         

 ・In English
前提知識
 ・逆行列
 ・連立方程式の求め方


■スプライン曲線とは

スプライン曲線とは、グラフ上の各点を滑らかに補間する線のことです。その際、3次曲線で補間する場合が多いです。 なお始点と終点は通るが、間の点を通らない曲線をB-スプラインといいます。



■スプライン曲線の求め方

上記を例に考えます。以下2つの3次曲線の係数を求める必要があります。



未知の係数が8つあるため、8つの方程式を立てる必要があります。まずxとyの値が既知とすると、以下4つの式を立てることができます。



次に二つの関数を滑らかに結ぶため、二つの関数が共有している点において以下が成り立つ必要があります。



そして、グラフの始点と終点を以下の様にすることで、グラフ全体を滑らかに繋げることができます。



以上の連立方程式を解くことで、2つの3次曲線を求めることができます。

■スプライン曲線のpythonによる実装例

上記グラフにおいて、各点の値を以下とします。



上記を行列で表現すると以下のとおり。



上記において、逆行列を求めることで連立方程式の解を算出することができます。 ここからはpythonを用いて計算します。プログラムコードは以下のとおり。

import numpy as np
import matplotlib.pyplot as plt

# スプライン曲線の係数k 算出
A = np.array([[1, 1, 1, 1, 0, 0, 0, 0],
    [8, 4, 2, 1, 0, 0, 0, 0],
    [0, 0, 0, 0, 8, 4, 2, 1],
    [0, 0, 0, 0, 27, 9, 3, 1],
    [12, 4, 1, 0, -12, -4, -1, 0],
    [12, 4, 0, 0, -12, -4, 0, 0],
    [6, 2, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 18, 2, 0, 0]])

b = np.array([2, 3, 3, -7, 0, 0, 0, 0])
k = np.linalg.solve(A, b)

# スプライン曲線の計算
f1x = np.arange(1, 2, 0.01)
f1y = k[0]*f1x**3 + k[1]*f1x**2 + k[2]*f1x + k[3]

f2x = np.arange(2, 3, 0.01)
f2y = k[4]*f2x**3 + k[5]*f2x**2 + k[6]*f2x + k[7]

# 曲線の結合
f3x = np.append(f1x,f2x)
f3y = np.append(f1y,f2y)

# スプライン曲線の描画
plt.plot(f3x , f3y)
plt.plot([1, 2, 3], [2,3,-7], 'o')

plt.show()


結果は以下のとおり。










サブチャンネルあります。⇒ 何かのお役に立てればと

関連記事一覧



数学