flexibiliyとsimplicityが大きいが、連続な1次導関数、2次導関数を持つ。
そのため、関数も1次、2次導関数も十分に近似できる。
The basis functions for an n-degree cubic spline with evenly spaced breakpoints on the interval [a, b]
The n-2 breakpoints
In [2]:
function breakpoints(a::Real, b::Real, n::Real)
v = zeros(n-2)
h = (b - a) / (n - 3)
for j in 1:n-2
v[j] = a + h * (j - 1)
end
return v
end
Out[2]:
In [16]:
x = linspace(a, b, n)
function basis_func(a, b, n, x)
b = Array(Float64, n, n-2)
for i in 1:n
b[i, 0] = b[i, n] = 0
end
for i in 1:n
for j in 1:n-2
b[i, j] = ((x[i] - v[j-3]) * b[i, j-1]) / (v[j] - v[j-3]) + ((v[j+1] - x[i]) * b[])
また、曲率が最も大きい範囲にbreakpointsを集めれば曲率による近似の困難さをうまく乗り切れることがしばしばある。
Runge’s function
Runge's functionが高い曲率を示している範囲(0付近)にbreakpointsを集めた場合、breakpointsを均等に配置した場合よりもApproximation errorsは小さくなる。
In [ ]:
通常k次のスプラインはbreakpointsにおいてk-1次まで連続な導関数を持つ。
q個のbreakpointsを積み重ねることで、そのbreakpointにおいてk-q次まで連続な導関数を持つことができる。
ある点でkinkを持つことが分かっていればbreakpointsの積み重ねが役立つ。
basis functionの値が0にならない点は限られているので、sparse matrix methodを使ってspline interpolation matricesを記憶・操作できる。
sparse matrixとは成分のほとんどが0である行列のこと。
スプラインの値は有界なのでscaling effectsによって数値計算上の困難が起こる可能性は低い
特に行列が大きいとき、spline interpolation matrixを逆行列にするとsparsity構造が壊れてしまう。
近似される関数がスムーズでなく不連続のときでさえlinear splineを使えばかなり近似できる。
ただし、導関数は区分分けされた定数関数で、不連続。
導関数近似の有力候補は有限差分近似を使ったlinear spline
もともとのn個のbreakpointsの中点に新しくn-1個のbreakpointをつくる。
新しいbreakpointsにおける微分の近似
$z_i$の間または外側の値は線形補間または外挿によって得る
In [ ]:
積分近似ではもともとのbreakpointsの範囲を超えて外挿した値も使う
積分
を新しいbreakpointsで近似
ただし
この定義によって得られる積分近似はもともとのbreakpointsにおいては台形則によって得られる近似に等しい。
In [ ]:
検証?
これらの近似関数によって得られる"derivatives"や"integrals"は近似とみなしてよいが、polynomialやspline関数の場合はダメ。
しかし、もしも$\phi(X)c$の導関数を$\phi^{'}(X)c$のように定義したならばこれらの近似を使って得られるpiecewise linear functionsも同様に微分作用・積分作用について閉じている。($\phi^{'}(X)c$集合に属する?)
splineでは微分・積分はpiecewise segmentsの次数を増減させ、breakpoint sequenceは変化させない。
piecewise linear familyは逆。
finite difference operatorsを使った計算が楽。
In [ ]: