2017-08-02 6 views
-2

est-il un moyen d'utiliser scipy pour évaluer un BSpline/Nurbs à un point donné? Je recherche une méthode qui n'a besoin que du point donné, du vecteur nœud et de l'ordre des splines.Python BSpline/Nurbs évaluation à un point donné en utilisant scipy

J'ai trouvé des méthodes qui évaluent la fonction Spline mais je veux seulement évaluer les éléments de base à un point donné. Est-ce que quelqu'un sait peut-être quoi utiliser dans ce cas? Est-ce même possible?

D'un autre côté j'ai implémenté l'algorithme Cox de Boor mais en raison de sa définition récursive, l'évaluation est plutôt lente.

Répondre

0

En scipy 0.19.0 et au-dessus, vous pouvez utiliser BSpline:

In [1]: from scipy.interpolate import BSpline 

In [2]: spl = BSpline.basis_element([0, 1, 2, 3]) 

In [3]: spl(1.5) 
Out[3]: array(0.75) 

In [4]: spl([1.5, 2, 3.6]) 
Out[4]: array([ 0.75, 0.5 , 0.18]) 

Documentation: https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.BSpline.html

Pour splines cubiques spécifiquement, vous pouvez utiliser CubicSpline, qui fonctionne réellement dans la base polynomiale.

Les NURBS ne sont pas disponibles dans scipy out of the box. Une façon serait de sous-classer BSpline et de redéfinir la méthode __call__ pour évaluer à la fois le numérateur et le dénominateur (en déléguant à BSpline.__call__). YMMV cependant.

+0

Cette fonction n'a aucun sens à mon avis. Si je ai un vecteur de noeud comme [0, 0, 0., 0.2,0.4,0.6,0.8, 1, 1, 1] je devrais obtenir par exemple. 6 Base Éléments de degré 3 comme N = {N_ {1,3}, N_ {2,3}, ..., N_ {6,3}}. Maintenant, je veux évaluer tous ces éléments de base à un point x donné. Mais la fonction spl = BSpline.basis_element me donne juste une valeur. –

+0

BSpline.basis_element ne construit qu'un seul élément de base. –