1  2  

 

Curvas de Bezier

Usando las definiciones anteriores podemos definir las curvas de Bezier directamente en Mathematica:

In[68]:=

Bezier[pts_] := Bernstein2[Length[pts] - 1] . pts ;

en donde  pts es una familia finita de pares ordenados de ÷µ^2. Además, en Bernstein2[Length[pts] - 1] . pts, el punto (.) denota el producto matricial, aunque puede significar muchas cosas dependiendo de los operandos que usemos (multiplicación de matrices, producto escalar, etc.). En este caso es una multiplicación de matrices cuyo resultado es una matriz 1×2. Visualicemos esto mediante el siguiente ejemplo en el que se construye un as de espadas, aunque no del todo terminado.      

In[213]:=

p1 = {{-0.144, -0.830}, {-0.069, -0.588}, {-0.037, -0.253}} ; AsespadasPlot1 = Bezier[p1] ; p2 ... e[7], RGBColor[1, 0, 0], Point /@ Join[p1, p2]}], Axes -> True, AspectRatio -> Automatic] ;

[Graphics:HTMLFiles/index_94.gif]

Figura 3: As de espadas.

AsespadasPoints = Module[{LeftSide},  LeftSide = Join[AsespadasPlot1[[1, -1, 1, 1]], Asespadas ...  * # &, LeftSide]]]] ; Sow[Graphics[Polygon[AsespadasPoints]], AspectRatio -> Automatic] ;

Si tenemos una función f : [0, 1] --> ÷µ y una familia finita de puntos I dada por

I = {x _ 1, x _ 2, ..., x _ n}    donde    a = x _ 1 < x _ 2 < ... < x _ n = b

obtenemos una familia de puntos de la forma:

{(a,f(a),(x _ 2, f(x _ 2)), ..., (b, f(b))}

Observemos con cuidado que hace Bezier, ejemplificado para el caso de una partición uniforme, por comodidad.

n = 5 ; puntos = Table[{a + k * (b - a)/n, f[a + k * (b - a)/n]}, {k, 0, n}] ; Bezier[puntos] // Expand ; %[[1]] %%[[2]] // Simplify

a - a x + b x

-(-1 + x)^5 f[a] + x (-10 (-1 + x)^3 x f[(3 a)/5 + (2 b)/5] + 10 (-1 + x)^2 x^2 f[(2 a)/5 + (3 ... 0 x^3 f[1/5 (4 a + b)] + 5 x^4 f[1/5 (4 a + b)] + 5 x^3 f[1/5 (a + 4 b)] - 5 x^4 f[1/5 (a + 4 b)])

La primera componente nos define una parametrización lineal de [0, 1] --> [a, b], mientras que la segunda componente nos da Bernstein[n, f[a + b(x - a)], x ], para x ∈ [0, 1].

 

 

Definición [q-trazadores]  Sea p : [a, b] --> ÷µ una función continua. f se llama q-trazador ("q-spline"), si existe una partición ÷ de [a, b], dada por

÷ = {a = x _ 1, x _ 2, ..., x _ (n - 1),x _ n = b}

tal que p | [x _ i, x _ (i + 1)] (p restringida al subintervalo [x _ i, x _ (i + 1)]) es un polinomio de grado q. Los puntos de ÷ se llaman los nodos del trazador. El trazador se llama trazador (q, r), ("(q,r)-spline"), si exigimos que  p ∈ ÷r^r([a, b], ÷µ).

El teorema fundamental nos dice que si f : [a, b] --> ÷µ es una función de clase ÷r^r y ÷ = {a = x _ 1, x _ 2, ..., x _ n = b} es una partición de [a, b],  entonces existe un trazador (q,r) que interpola a f hasta el orden r - 1, en los puntos x _ 1, x _ 2, ..., x _ n (en los puntos x _ 1 y x _ n a veces se dan otras condiciones).

Mathematica tiene varios paquetes útiles como Numerical Math 'SplineFit' el cual es un programa no tan general como Interpolating polynomial; es una implementación en Mathematica del algoritmo presentado por Burden ([3]), para el caso de trazadores cúbicos. No esta diseñado para el caso n-dimensional, n > 2.

Construyamos un ejemplo sencillo. Pero observemos los tipos de trazadores: Type-Cubic, CompositeBezier y Bezier.

In[186]:=

Clear[n, k] ; puntos1 = Table[{-2 + k/n, 1/(1 + 12 * (-2 + k/n))}, {k, 0, 6}] /. n -> 6

Out[187]=

{{-2, -1/23}, {-11/6, -1/21}, {-5/3, -1/19}, {-3/2, -1/17}, {-4/3, -1/15}, {-7/6, -1/13}, {-1, -1/11}}

En dichos puntos estamos haciendo un muestreo de la función f(x) = 1/(1 + 12 x) en [-2, -1].

In[196]:=

<< NumericalMath`SplineFit` gg = SplineFit[puntos1, Cubic] gg[x] Print["Primer valo ... abla de puntos"] ; gg[0] Print["Sexto valor de la tabla de puntos"] gg[6] gg[5.25]

Out[197]=

SplineFunction[  Cubic  ,   {0.`, 6.`}  , <>]

Out[198]=

(SplineFunction[  Cubic  ,   {0.`, 6.`}  , <>])[x]

Primer valor de la tabla de puntos

Out[200]=

{-2, -1/23}

Sexto valor de la tabla de puntos

Out[202]=

{-1, -1/11}

Out[203]=

{-1.125`, -0.08013972102480495`}

gg[x] define una función cuyo dominio es un intervalo cerrado que inicia en el primer k de la tabla, en este caso 0, y finaliza en el último valor de k, en este caso 6.

gg : [0, 6] --> ÷µ^2 cuya segunda componente es la aproximación por trazadores cúbicos de f. Para que nos sea útil tenemos que convertirla en una función definida sobre el intervalo [-2, -1] lo cual hacemos parametrizando linealmente; en este caso con x -> 6 (2 + x).

Usando Mathematica

In[204]:=

ggg[x_] := gg[6 * (2 + x)][[2]] ; Plot[{ggg[x], 1/(1 + 12 x)}, {x, -2, -1}, PlotStyle -> {R ... ; {PointSize[0.03], Table[Point[{-2 + k/n, 1/(1 + 12 * (-2 + k/n))}], {k, 0, 6}] /. n -> 6}] ;

[Graphics:HTMLFiles/index_153.gif]

Figura 4: Gráficas de las funciones ggg[x] y f[x].

Las gráficas de ambas funciones ggg[x] y f(x) = 1/(1 + 12 x) coinciden.

In[206]:=

hh[t_] := Bezier[puntos1] /. x -> t ; hh[-2] hh[0] hh[1] Clear[hhh] ; hhh[x_] := hh[2 + x][ ... hh[x]}, {x, -2, -1}, PlotStyle -> {RGBColor[0, 0, 1], RGBColor[0, 0, 1], RGBColor[1, 0, 0]}] ;

Out[207]=

{-4, -154867/7436429}

Out[208]=

{-2, -1/23}

Out[209]=

{-1, -1/11}

[Graphics:HTMLFiles/index_160.gif]

Figura 5: Gráficas de las funciones ggg[x], f[x] y hhh[x].

Las gráficas de color azul corresponde a las funciones ggg[x] y f(x) = 1/(1 + 12 x), las cuales coinciden. La gráfica de color rojo corresponde a la función hhh[x], generada con Bezier.

 

Bibliografía

[1] Araya Aguilar, Gerardo. Solución a algunos problemas de Korovkin. (1982), UCR, Costa Rica.
[2] Borwein, P.; T. Erdelyi. Polinomials and polinomial inequalities. (1996), SIAM Review, vol 38, # 4. pp. 705-706.
[3] Burden, Richard; Douglas Faires. Análisis numérico. Editorial Iberoamérica, México, 1985.
[4] Chui, C. K.; L. Schumaker; J. D. Wardor. Approximation theory V. (1988). Mathematics of computatino, vol 50, # 181. pp. 356.
[5] Gamelin, T. W.; R. E. Greene. Introduction to topology. (1986), American Mathematical Monthly, vol. 93, # 7. pp. 580-582.
[6] Sendov, Blagovet; Vasil A. Popov; G. M. Phillips. The averaged moduli of smoothness:with applications in numerical methods and approximation. (1991) SIAM Review, vol. 33, #3. pp. 499-501.

 

Revista Virtual Matemática, Educación e Internet

Derechos Reservados