2

スプラインの結び目と係数に関してのみ指定されている紙から関数を再現しようとしています。これを stackoverflowで見つけた後、scipy 補間オブジェクトを指定して、そのノットと係数から、scipy 補間を再作成できます。ただし、論文で指定されている機能については、このアプローチは失敗します。scipy 補間を再現するには、次のようにします。

using PyCall, PyPlot, Random
Random.seed!(5)
sp = pyimport("scipy.interpolate")
x = LinRange(0,1,50)
y = (0.9 .+ 0.1rand(length(x))).*sin.(2*pi*(x.-0.5))
t = collect(x[2:2:end-1]) # knots
s1 = sp.LSQUnivariateSpline(x, y, t)
x2 = LinRange(0, 1, 200) # new x-grid
y2 = s1(x2) # evaluate spline on that new grid
figure()
plot(x, y, label="original")
plot(x2, y2, label="interp", color="k")
knots = s1.get_knots()
c = s1.get_coeffs()
newknots(knots, k) = vcat(fill(knots[1],k),knots,fill(knots[end],k)) # func for boundary knots of order k
forscipyknots = newknots(knots, 3)
s2 = sp.BSpline(forscipyknots, c, 3)
y3 = s2(x2)
plot(x2,y3,"--r", label="reconstructed \nfrom knots and coeff")
legend()

これにより、期待どおりに以下が提供されます。 ここに画像の説明を入力

knots = [.4,.4,.4,.4,.7]指定された係数を使用して関数 (下の画像) を再現しようとすると、次のようになりますc = [2,-5,5,2,-3,-1,2]ここに画像の説明を入力 ここに画像の説明を入力

以下のコードと上記のノットと係数を使用すると、次のようになります。

knots = [.4,.4,.4,.4,.7]
c = [2,-5,5,2,-3,-1,2]
forscipyknots = newknots(knots, 3)
s2 = sp.BSpline(forscipyknots, c, 3)
figure()
plot(x2, s2(x2))

代わりに次(以下)を取得します。境界ノットを台無しにしていると確信しています - どうすれば修正できますか? ここに画像の説明を入力

4

1 に答える 1