Google
En toda la web
En eumed·net






Pulse aquí para acceder al índice general del libro.

Esta página muestra solo parte del texto, y carece de formato, notas, fórmulas, esquemas, tablas o gráficos.
Pulse aquí para bajarse el Libro completo en formato ZIP (37 páginas, 254 Kb)

 

B-splines con Mathematica 5.1

Capítulo 3
El paquete BsplinesCurves





En este capítulo se describe el paquete BsplinesCurves, señalando los comandos en él implementados.

3.1 Comandos implementados
El paquete BsplinesCurves incorpora los siguientes comandos: Uniform, Open, Bspline, Curve, cuyo uso se describe a continuación.

Comando Descripción
Uniform[n+1, k] genera un vector de nodos uniforme para n+1 puntos y orden k
Open[n+1, k] genera un vector de nodos abierto para n+1 puntos y orden k
Bspline[k] genera la expresión analítica de una función b-spline de orden k para un vector de nodos uniforme
Bspline[var, k] genera la expresión analítica de una función b-spline de orden k para un vector de nodos uniforme en la variable var
Bspline[val, k] genera el valor de la función b-spline de orden k para el vector de nodos uniforme evaluada en val
Curve[pts] genera la expresión analítica de una curva de b-splines de orden 3 para un vector de nodos abierto en la variable t
Curve[var, pts] genera la expresión analítica de una curva de b-splines de orden 3 para un vector de nodos abierto en la variable var
Curve[val, pts] genera el valor de una curva de b splines de orden 3 para un vector de nodos abierto evaluada en val

Adicionalmente los comandos Bspline y Curves incorporan las siguientes opciones:

Opción Valor por defecto Descripción
Knots Uniform es una opción de los comandos Bspline y Curve que permite ingresar el vector de nodos.
Order 3 es una opción del comando Curve que permite ingresar el orden de la curva.
Range True es una opción del comando Curve que permite obtener la curva con o sin el intervalo válido.

3.2 Guía de usuario
Para utilizar el paquete BsplinesCurves primero debe grabarse el archivo BsplinesCurves.m en la carpeta ExtraPackages de WolframResearch, específica-mente en la dirección que se indica a continuación C:\Archivos de programa\Wolfram Research\Mathematica\5.1\AddOns\ExtraPackages

Después de realizar el proceso anterior podemos cargar el paquete mediante

<<BsplinesCurves`

Una vez ejecutado este comando, es decir, después de presionar en simultáneo las teclas Shift Enter, es posible obtener los resultados que se detallan a continuación.

3.2.1 Mensajes de ayuda
Cada uno de los comandos implementados posee un mensaje de ayuda que puede ser invocado digitando ?Comando, por ejemplo

Invocando los mensajes de ayuda para los comandos Uniform y Bsplines.
?Uniform
Uniform[nmas1, k] is a command that returns an uniform knots vector of order 'k', for 'nmas1' points. Remember that 1 <= k <= nmas1.
?Bspline
Bspline[(var,) k, x] is a command which admits a variable 'var', order 'k' and knots sequence 'x' and returns the B splines function of order 'k' defined regarding the knots sequence 'x'. In the case of not entering the variable is assumed that it is 't'.

3.2.2 Secuencias de nodos
Para obtener secuencias de nodos uniformes y abiertas lo hacemos como se indica a continuación.

Dos secuencias de nodos: uniforme y abierta, respectivamente.
Uniform[6,3]
{0,1,2,3,4,5,6,7,8}
Open[6,3]
{0,0,0,1,2,3,4,4,4}

El paquete sólo acepta valores entero positivos para n+1 y k (1  k  n+1), en caso de ingresar otro tipo de datos devuelve la misma entrada.

Casos en los que se devuelve la misma entrada.
Uniform[m,3]
Uniform[m,3]

Open[y,x]
Open[y,x]

3.3.3 Funciones B-splines
Para obtener funciones B-splines de orden k (1, 2, 3, ...) definidas con repecto a la secuencia de nodos x = {x1, x2, x3, ...} lo hacemos como se indica a continuación.

Función B-spline de orden 3 (k=3) definida con respecto a una secuencia de nodos uniforme.
Bspline[3]


Función B-spline de orden 1 (k=1) definida con respecto a la secuencia de nodos X={x[1],x[2]}.
Bspline[1,Knots->Array[x,2]]


Función B-spline de orden 2 (k=2) definida con respecto a la secuencia de nodos X={x[4],x[5],x[6]}.
Bspline[2,Knots->Array[x,3,4]]


Los resultados mostrados anteriormente son para casos generales. En estos casos no es posible obtener una expresión gráfica de las ecuaciones matemáticas de las funciones obtenidas.

Caso en que nos es posible graficar la función B-spline.
Bspline[1,Knots->Array[x,2]]


Plot[%,{t,x[1],x[2]}]

Plot[%,{t,x[1],x[2]}]

En casos particulares, en los cuales se obtienen funciones que pueden ser graficadas por Mathematica, tenemos

Función B-spline de orden 3 (k=3) definida con respecto a la secuencia de nodos X={0,0,1,2}.
f=Bspline[3,Knots->{0,0,1,2}]


Gráfica de la función f, anteriormente definida
Plot[f,{t,-1,3},PlotRange->All]


Note que hasta aquí las funciones obtenidas dependen de la variable t, puesto que ésta es asumida por defecto. Sin embargo, también es posible obtener funciones B-splines dependientes de cualquier variable (que se ajuste a cierta necesidad del usuario).

En el siguiente ejemplo se muestra un caso en el que la función B-spline depende de la variable .

Función B-spline de orden 5 (k=5) definida con respecto a la secuencia de nodos X={-2,-1,0,1,3,6} que depende de la variable .
f=Bspline[,5]


Función B-spline de orden 5 (k=5) definida con respecto a la secuencia de nodos X={-2,-1,0,1,3,6} que depende de la variable .
f=Bspline[,5,Knots->{-2,-1,0,1,3,6}]



Gráfica de la función f, anteriormente definida.
Plot[f,{,-2,6},PlotRange->All]


También es posible obtener el valor de la función en cualquier número real del dominio.

Función B-spline de orden 7 (k=7) definida con respecto a la secuencia de nodos X={0,0,1,2,6,7,8,9}; evaluada en –10, 0.5 y , respectivamente.
Bspline[-10,7,Knots->{0,0,1,2,6,7,8,9}]
0
Bspline[0.5,7,Knots->{0,0,1,2,6,7,8,9}]
0.000231454
Bspline[Sqrt[3],7,Knots->{0,0,1,2,6,7,8,9}]

Utilizaremos, a continuación, el comando Partition (ver [2]) como una forma práctica de obtener las funciones B splines de orden 3 (k = 3) definidas con respecto a la secuencia de nodos {0,1,1,3,4,6,6,6}.

Aplicando Partition a la secuencia de nodos X={0,1,1,3,4,6,6,6}.
k=3;
kv=Partition[{0,1,1,3,4,6,6,6},{k+1},{1}]
n=Length[kv];
{{0,1,1,3},{1,1,3,4},{1,3,4,6},{3,4,6,6},{4,6,6,6}}

Ahora hacemos uso del comando Map, que también puede escribirse /@ (ver [2]), para obtener funciones B-splines requeridas.

Funciones B splines de orden 3 (k = 3) definidas con respecto a la secuencia de nodos {0,1,1,3,4,6,6,6}.
ff=Bspline[k,Knots->#]&/@kv





Gráfica de las funciones B splines de orden 3 definidas con respecto a la secuencia de nodos {0,1,1,3,4,6,6,6}.
Plot[
ff//Evaluate,{t,0,6},PlotStyle->Table[Hue[i/n],{i,n}]
]


Cabe mencionar que un caso particular de las fucniones B-splines son las llamadas funciones de Bézier (ver [1]), las cuales se obtienen cuando el orden (k) es igual al número de puntos (n+1). El siguiente ejemplo nos presenta un caso particular en el que se obtienen funciones de Bézier. En este caso el orden elegido es 6 y la secuencia de nodos, es {0,0,0,0,0,0,1,1,1,1,1,1}.

Funciones B splines de orden 6 (k = 6) definidas con respecto a la secuencia de nodos {0,0,0,0,0,0,1,1,1,1,1,1}.
k=6;
kv=Partition[Open[k,k],{k+1},{1}]
n=Length[kv];
{{0,0,0,0,0,0,1},{0,0,0,0,0,1,1},{0,0,0,0,1,1,1},
{0,0,0,1,1,1,1},{0,0,1,1,1,1,1},{0,1,1,1,1,1,1}}
ff=Bspline[k,Knots->#]&/@kv



Gráfica de las funciones B splines de orden 6 definidas con respecto a la secuencia de nodos {0,0,0,0,0,0,1,1,1,1,1,1}.
Plot[
ff//Evaluate,{t,0,1},PlotStyle->Table[Hue[i/n],{i,n}]
]


3.3.4 Curvas de B-splines
Para obtener las ecuaciones matemáticas de las curvas de B-splines, como puede leerse en el artículo 2, se ha implementado el comando Curve. Con este comando podemos obtener curvas definidas de R en R, de R en R2, de R en R3 y en general de R en Rn. Por supuesto que las gráficas sólo pueden obtenerse para los tres primeros casos.

En los ejemplos dados a continuación se presentan algunos de estos casos.

Curva de B-splines de orden 3 definida para un vector de nodos abierto y los puntos de control (1),(2),(1),(4).
pts={1,2,1,4};
c=Curve[pts]



Gráfica de la Curva de B-splines definida anteriormente.
Plot[c//Evaluate]


Curva de B-splines de orden 3 definida para un vector de nodos abierto y los puntos de control (0,0),(1,2), (-1,3),(0,1),(3,0).
pts = {{0,0},{1,2},{-1,3},{0,1},{3,0}};
c=Curve[pts]


Gráfica de la Curva de B-splines definida anteriormente.
cc=ParametricPlot[c//Evaluate]


Curva de B-splines de orden 3 definida para un vector de nodos abierto y los puntos de control (0,0),(1,2), (-1,3),(0,1),(3,0) y la poligonal que une estos puntos.
Show[
Graphics[{RGBColor[1, 0, 0],Line[pts]}],
cc,PlotRange->All,Axes->True
]



Curva de B-splines de orden 3 definida para un vector de nodos abierto y los puntos de control (0,0,2),(1,2,1), (-1,3,-2),(0,1,-2),(3,0,2).
pts={{0,0,2},{1,2,1},{-1,3,-2},{0,1,-2},{3,0,2}};
c=Curve[pts]





Gráfica de la Curva de B-splines definida anteriormente.
cc=ParametricPlot3D[c//Evaluate]



Curva de B-splines de orden 3 definida para un vector de nodos abierto y los puntos de control (0,0,2),(1,2,1), (-1,3,-2),(0,1,-2),(3,0,2) y la poligonal que une estos puntos.
Show[
Graphics3D[{RGBColor[1, 0, 0],Line[pts]}],
cc, Axes->True
]



Curva de B-splines de orden 3 definida para un vector de nodos abierto y los puntos de control (0,0,2,-1),(1,2,1,0),(-1,3,-2,4),(0,1,-2,3),(3,0,2,1).
pts={{0,0,2,-1},{1,2,1,0},{-1,3,-2,4},{0,1,-2,3},{3,0,2,1}};
c=Curve[pts]


Para finalizar veamos algunos ejemplos en los que se cambian los valores por defecto de las opciones implementadas en el comando Curve.

Curva de B-splines de orden 5 definida para un vector de nodos abierto y los puntos de control (0,0),(1,2), (-1,3),(0,1),(3,0).
pts = {{0,0},{1,2},{-1,3},{0,1},{3,0}};
c=Curve[pts,Order->5]

cc=ParametricPlot[c//Evaluate]

Curva de B-splines de orden 5 definida para un vector de nodos abierto y los puntos de control (0,0),(1,2), (-1,3),(0,1),(3,0) y la poligonal que une estos puntos.
Show[
Graphics[{RGBColor[1, 0, 0],Line[pts]}],
cc,PlotRange->All,Axes->True
]


Curva de B-splines de orden 4 definida para el vector de nodos {-1,-1,2,3.5,4,6,7,7,7} y los puntos de control (0,0),(1,2), (-1,3),(0,1),(3,0).
pts = {{0,0},{1,2},{-1,3},{0,1},{3,0}};
c=Curve[pts,Order->4,Knots->{-1,-1,2,7/2,4,6,7,7,7}]

cc=ParametricPlot[c//Evaluate]

Curva de B-splines de orden 4 definida para el vector de nodos {-1,-1,2,3.5,4,6,7,7,7} y los puntos de control (0,0),(1,2), (-1,3),(0,1),(3,0) y la poligonal que une estos puntos.
Show[
Graphics[{RGBColor[1, 0, 0],Line[pts]}],
cc,PlotRange->All,Axes->True
]