Hi everyone,
I am having troubling using the BSpline function from NGSolve.
Running with a simple test case with the function i want to interpolate being of the form f(x) = cos(2x). I find with this code (duplicating initial and end points)
Npoints=10
x_lin = np.linspace(np.pi,2np.pi,Npoints)
y=myfun(x_lin)
plt.figure()
x_out=np.linspace(np.pi,2np.pi,1000)orders = [1,2,3]
plt.plot(x_out,myfun(x_out),label=“Data”)
for order in orders:
xs=
ys=
# Duplicate start and end points according to degreexs=xs+[x_lin[0]] ys=ys+[y[0]] xs=xs+x_lin.tolist() ys=ys+y.tolist() xs=xs+[x_lin[Npoints-1]] ys=ys+[y[Npoints-1]] print(xs,ys) x_list=xs y_list=ys spline = BSpline(order, x_list, y_list)
simple_spline.pdf (11.4 KB)
Where there seems to be a slight shift of x values associated with higher orders.
I did look around the forums and there was a suggestion to duplicate the initial and end points according to the order, which I’ve done for orders 1,2,3 below
x_lin = np.linspace(np.pi,2*np.pi,Npoints)
y=myfun(x_lin)plt.figure()
x_out=np.linspace(np.pi,2*np.pi,1000)plt.plot(x_out,myfun(x_out),label=“Data”)
for Order in [1,2,3]:
xs=
ys=
# Duplicate start and end points according to degreexs=xs+[x_lin[0]] ys=ys+[y[0]] if Order>=2: ys=ys+[y[0]] xs=xs+[x_lin[0]] if Order==3: ys=ys+[y[0]] xs=xs+[x_lin[0]] xs=xs+x_lin.tolist() ys=ys+y.tolist() xs=xs+[x_lin[Npoints-1]] ys=ys+[y[Npoints-1]] if Order>=2: ys=ys+[y[Npoints-1]] xs=xs+[x_lin[Npoints-1]] if Order==3: ys=ys+[y[Npoints-1]] xs=xs+[x_lin[Npoints-1]] print(xs,ys) x_list=xs y_list=ys spline = BSpline(Order, x_list, y_list)
but I still yield the same result
simple_spline_padded_order.pdf (11.2 KB)
Is there something I am possibly missing with how I am meant to setup the control points for the problem? or is there maybe a bug with the function.
Any help is appreciated, thanks!