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)np.pi,1000)

y=myfun(x_lin)

plt.figure()

x_out=np.linspace(np.pi,2orders = [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 degree`xs=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 degree`xs=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!