Skip to main content
`Ctrl`+`K`
scipy.interpolate.BSpline.

# from_power_basis

classmethod BSpline.from_power_basis(pp, bc_type='not-a-knot')

  Construct a polynomial in the B-spline basis from a piecewise polynomial in the power basis.

  For now, accepts `CubicSpline` instances only.

  Parameters:
    pp CubicSpline

      A piecewise polynomial in the power basis, as created by `CubicSpline`

    bc_type str, optional

      Boundary condition type as in `CubicSpline`: one of the `not-a-knot`, `natural`, `clamped`, or `periodic`. Necessary for construction an instance of `BSpline` class. Default is `not-a-knot`.

  Returns:
    b `BSpline` object

      A new instance representing the initial polynomial in the B-spline basis.

  Notes

  Added in version 1.8.0.

  Accepts only `CubicSpline` instances for now.

  The algorithm follows from differentiation the Marsden’s identity [1]: each of coefficients of spline interpolation function in the B-spline basis is computed as follows:

  \[c_j = \sum_{m=0}^{k} \frac{(k-m)!}{k!} c_{m,i} (-1)^{k-m} D^m p_{j,k}(x_i)\]

  \(c_{m, i}\) - a coefficient of CubicSpline, \(D^m p_{j, k}(x_i)\) - an m-th defivative of a dual polynomial in \(x_i\).

  `k` always equals 3 for now.

  First `n - 2` coefficients are computed in \(x_i = x_j\), e.g.

  \[c_1 = \sum_{m=0}^{k} \frac{(k-1)!}{k!} c_{m,1} D^m p_{j,3}(x_1)\]

  Last `nod + 2` coefficients are computed in `x[-2]`, `nod` - number of derivatives at the ends.

  For example, consider \(x = [0, 1, 2, 3, 4]\), \(y = [1, 1, 1, 1, 1]\) and bc_type = `natural`

  The coefficients of CubicSpline in the power basis:

  \([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [1, 1, 1, 1, 1]]\)

  The knot vector: \(t = [0, 0, 0, 0, 1, 2, 3, 4, 4, 4, 4]\)

  In this case

  \[c_j = \frac{0!}{k!} c_{3, i} k! = c_{3, i} = 1,~j = 0, ..., 6\]

  References

  [1]

  Michael Floater, An introduction to spline theory, 2025, Section 4.1 https://www.uio.no/studier/emner/matnat/math/MAT4170/v25/undervisningsmateriale/spline_notes.pdf