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 1
B-splines expresados analíticamente





En este capítulo presentamos el algoritmo implementado (algoritmo al que hemos decidido llamar algoritmo BFEA ) para generar las expresiones analíticas de las funciones B-splines con algún sistema de cálculo simbólico. Partimos de la definición recursiva, planteada por Cox-deBoor, de las funciones B splines y a partir de ella elaboramos una definición alternativa que constituye por sí misma el algoritmo BFEA.

1.1 Definición recursiva de los B-splines
Sean y una sucesión no decreciente de números reales de longitud por lo menos k + 1, llamada vector de nodos o sucesión de nodos. El i-ésimo B-spline de orden k respecto al vector de nodos se define por
…(1)
para todo número real t, con
…(2)
Aquí se adopta la convención .

1.2 Fundamentos del algoritmo BFEA
En (2) las funciones ya tienen una expresión analítica clara. Veamos que sucede para los valores . Por ejemplo y de acuerdo a (1), la expresión analítica de las funciones se obtiene así
.

Al reemplazar las funciones y por sus respectivas expresiones analíticas obtenemos

. ... (3)

La dificultad que encontramos es que no se obtiene directamente un valor 1 ó 0, para y , sino que aparecen las “condicionales”
y .

Por supuesto que en forma manual la expresión (3) puede operarse hasta obtener el siguiente resultado



más aun, esta expresión puede simplificarse aplicando las reglas de suma de funciones de tal manera que se obtiene

. ... (4)
Pero los lenguajes de programación simbólica no piensan ni toman decisiones para efectuar estas operaciones.

Ante semejante situación debemos buscar una forma de llegar al mismo resultado, efectuando operaciones matemáticas válidas, pero siguiendo un “camino” diferente.

Planteemos entonces la posibilidad de operar por intervalos. Ilustremos lo que se plantea trabajando con la misma función, . Para esta función en intervalo se tiene

,

puesto que en este intervalo el valor de las funciones es 1 y el de las funciones es 0; y en el intervalo las mismas funciones se expresan

,

ya que en este otro intervalo el valor de las funciones es 0 y el de las funciones es 1. Teniendo en cuenta que fuera de estos intervalos el valor de las funciones es cero, podemos escribir las expresiones analíticas de las funciones como en (3).

De acuerdo a lo hasta aquí planteado vemos que surge la necesidad de conseguir, de alguna manera, que las funciones puedan trabajarse por intervalos para luego anexarle los respectivos dominios. ¿Y cómo lograr semejante resultado? Una primera idea para responder a esta interrogante es la que se explica a continuación.

Sea la secuencia de nodos , con . Con respecto a se pueden definir funciones , a saber:

, , , .

Nótese que la secuencia se particiona en intervalos, los cuales son: , , , .

A continuación vamos a construir una matriz cuadrada de orden . En esta matriz las columnas indicaran los intervalos que se han generado con los nodos y las filas indicaran el valor de cada una de las funciones , definidas con respecto a , en los intervalos indicados por las columnas. Esta matriz, entonces tiene la siguiente forma:

... (5)

Claramente se aprecia que la matriz así formada es una matriz identidad. Lo que resta es aprovechar esta construcción para nuestro propósito. Con esta finalidad anotaremos, a continuación, dos ideas clave:

i. Primeramente ha surgido, con esta construcción, una forma de obtener el valor de cualquiera de las funciones indicadas en las columnas en cualquiera de los intervalos indicados en las filas de la matriz obtenida.

ii. En segundo lugar destaquemos que es factible utilizar el algoritmo para construir una matriz identidad, el cual nos dice lo siguiente:
,
donde es la función delta de Kronecker.

Para lograr nuestro propósito definamos ahora a como el ésimo intervalo formado a partir de los nodos . A continuación añadiremos el subíndice a para indicar que el valor que se obtenga es el valor de en el intervalo , en forma breve podemos anotar .

Como podrá verse esta nueva notación nos permitirá obtener el valor de cualquier función en algún -ésimo intervalo. Por ejemplo, devuelve el valor de en el primer intervalo (esto es, en ), así tenemos . De la misma manera devuelve el valor de en el segundo intervalo (esto es, en ), por lo cual ; etc.

Este resultado no sería útil de no ser porque es factible añadir este mismo subíndice a las funciones y de esta manera puede operarse por intervalos para obtener las funciones ( ) expresadas analíticamente. Estas operaciones se asemejan a las que se realizaron cuando se obtuvo (4) y (5).

Por ejemplo, para obtener las expresiones analíticas de las funciones procederemos como sigue. En el intervalo (esto es ) de acuerdo a (1) obtenemos

y en el intervalo (esto es ) también de acuerdo a (1) obtenemos
.
Y puesto que fuera de estos intervalos el valor de las funciones es cero, obtenemos nuevamente la expresión (3).

De manera similar podemos trabajar por intervalos para valores de mayores que 2 y así partiendo de las ideas (i) y (ii) hemos llegado a implementar un algoritmo que puede emplearse para obtener las expresiones analíticas de las funciones B-splines con asistencia de un lenguaje de programación simbólico. Esto gracias a que al operar por intervalos nos independizamos de “condicionales” como las que aparecieron en (2) y trabajamos directamente con el valor 1 o con el valor 0.

1.3 Algoritmo BFEA para generar las expresiones analíticas de los B-splines
En resumen, las expresiones analíticas de las funciones B splines de orden definidas respecto al vector de nodos , pueden obtenerse mediante la siguiente fórmula recursiva
,
con ; donde representa el -ésimo intervalo y es la función delta de Kronecker. Incluyendo la convención ,

1.4 El algoritmo BFEA codificado en Mathematica
La codificación del algoritmo BFEA en Mathematica es bastante sencilla. En este texto damos la idea general de la misma, siendo ésta la misma que se ha utilizado en la codificación del paquete BsplinesCurves y cuya funcionalidad se explica en detalle en el capítulo 3.

A continuación definimos dos comandos: $Divide y NN. El comando $Divide permite adoptar la convención y el comando NN es la definición recursiva de las funciones B-splines.

Definición de los comandos $Divide y NN.
$Divide[nn_, dd_] := If[dd === 0, 0, nn/dd];

NN[t_, i_, k_, j_, x_] :=
Plus[$Divide [t - x[[i]], x[[i + k - 1]] - x[[i]]]*
NN[t, i, k - 1, j, x],
$Divide [x[[i + k]] - t, x[[i + k]] - x[[i + 1]]]*
NN[t, i + 1, k - 1, j, x]
]

NN[t_, i_, 1, j_, x_] := If[i == j, 1, 0]

Con estos dos comandos ya es posible generar las expresiones analíticas de los B splines. Primero daremos una idea explicativa de la obtención de las mismas por intervalos, como lo mencionamos en el artículo anterior, donde explicábamos la obtención del algoritmo.

Supongamos que para la secuencia de nodos se desea encontrar las ecuaciones matemáticas de la funciones B splines de primer orden (k = 1) en el primer intervalo, esto es en el intervalo . Teniendo en cuenta que se generan seis funciones, digitamos

Funciones B-splines con respecto a la secuencia de nodos X = {0,1,2,3,4,5,6} en el intervalo .
Table[NN[t,i,1,1,{0,1,2,3,4,5,6}],{i,6}]
{1, 0, 0, 0, 0, 0}

Obtengamos, para la misma secuencia de nodos, las ecuaciones matemáticas de las funciones B splines de primer orden (k = 1) en el segundo intervalo, esto es en el intervalo .

Funciones B-splines con respecto a la secuencia de nodos X = {0,1,2,3,4,5,6} en el intervalo .
Table[NN[t,i,1,2,{0,1,2,3,4,5,6}],{i,6}]
{0, 1, 0, 0, 0, 0}

Más aún podemos obtener las expresiones analíticas de las funciones B-splines de primer orden en todos los intervalos que se forman para la secuencia de nodos .

Funciones B-splines con respecto a la secuencia de nodos X = {0,1,2,3,4,5,6}.
Table[
NN[t,i,1,j,{0,1,2,3,4,5,6}],
{i,6},{j,6}]
{{1,0,0,0,0,0},{0,1,0,0,0,0},{0,0,1,0,0,0},{0,0,0,1,0,0},
{0,0,0,0,1,0},{0,0,0,0,0,1}}
MatrixForm[%]


La última salida obtenida es un caso particular de la matriz identidad (5) presentada en la sección 1.3.

Obtengamos, ahora, las expresiones analíticas de las funciones B-splines de segundo orden (k = 2), definidas con respecto a la misma secuencia de nodos.



Funciones B-splines con respecto a la secuencia de nodos X = {0,1,2,3,4,5,6} .
Table[
NN[t,i,2,j,{0,1,2,3,4,5,6}],
{i,5},{j,6}]
{{t,2-t,0,0,0,0},{0,-1+t,3-t,0,0,0},
{0,0,-2+t,4-t,0,0},{0,0,0,-3+t,5-t,0},{0,0,0,0,-4+t,6-t}}
MatrixForm[%]


Y luego las expresiones analíticas de las funciones B splines de tercer orden (k = 3), definidas con respecto a la misma secuencia de nodos.

Funciones B-splines con respecto a la secuencia de nodos X = {0,1,2,3,4,5,6} .
Table[
NN[t,i,3,j,{0,1,2,3,4,5,6}],
{i,5},{j,6}]

MatrixForm[%//Simplify]