有没有一种方法可以在不知道系数的情况下用Python生成B样条函数?

时间:2019-05-16 22:12:14

标签: python scipy bspline

我正在尝试通过定义b样条的顺序,基本函数的数量,结数和评估范围来生成基本样条函数。请引导我使用Python可以帮助我的合适函数。

我当前的实现是使用johntfoster / bspline方法。它不允许我定义基本函数的数量,并且结果与MATLAB的结果不同。 https://github.com/johntfoster/bspline

scipy.interpolate.BSpline.basis_element函数不允许我定义样条的顺序,基函数的数量,结点

Matlab实现:

nbreaks = 20;
nbasis = nbreaks + norder - 2;
breaks = linspace(0,taufmax,nbreaks)';

%Create a smooth function that passes through the break point / knots
wtaubasis = create_bspline_basis([0,max(breaks)], nbasis, norder, breaks);

% Create a matrix of basis functions at each break points for the entire Tau
basisValueMat_f = full(eval_basis(wtaubasis, tauf));

Python实现(johntfoster / bspline方法)

import numpy as np
import bspline
import bspline.splinelab as splinelab

norder = 4
nbreaks = 20

#This defines the number of basis function
nbasis = nbreaks + norder - 2

#For the spline, it has to pass thorough the corresponding break points
breaks = np.linspace(0,tauf_max,nbreaks)
k = splinelab.augknt(breaks, norder)

# create spline basis of order p on knots k  
B = bspline.Bspline(k, norder)  
A0 = B.collmat(np.squeeze(tau_f), deriv_order=0)

我想在指定点评估B样条基函数。 与MATLAB类似的结果将令人鼓舞。

2 个答案:

答案 0 :(得分:1)

evaluate_all_bsplhttps://github.com/scipy/scipy/blob/v1.3.0/scipy/interpolate/_bspl.pyx#L163 在给定的评估点上,计算给定结点的所有非零b样条曲线。但是,它不是公共功能,因此,如果最终使用它,您将自己承担责任。

答案 1 :(得分:0)

scipy.interplolate具有函数make_interp_spline,该函数适合Bspline并将其返回到由两个向量xy表示的2D数据集中。此函数具有参数kt,用于控制样条和结的程度。