Si en alguna ocasión has querido dibujar un círculo en el display, realizar una aplicación tipo sonar presentando las lecturas del sensor ultrasónico en el display, extraer las componentes del vector aceleración del acelerómetro o, en general, hacer uso de cualquier función trigonométrica en NXT-G, te habrás dado cuenta de que simplemente no han sido implementadas. Tiene bastante sentido porque -en general- para la edad a la que va destinada la programación gráfica el concepto de trigonometría queda un poco distante. Cuando queremos hacer uso de estas funciones normalmente nos veremos programando en otros lenguajes cuyas librerías sí incorporan todo tipo de funciones matemáticas. Este artículo explica cómo podemos implementar este tipo de funciones con el NXT-G. Veamos cómo podemos implementar la función y = sin(x). La idea es extensible al resto de funciones trigonométricas y, en general, a cualquier función que pueda ser aproximada por un desarrollo en serie. Sabemos que esta función puede descomponerse según el siguiente desarrollo en serie de Taylor, donde los ángulos se miden en radianes. La siguiente identidad es válidad para cualquier valor de x.
[m]{sin}x = sum{n=0}{infty }{}{(-1)^n}/{(2n+1)!}x^{2n+1} = x – x^3/{3!} + x^5/{5!} – cdots for all x[/m]
Si optamos por trabajar en grados, la ecuación quedará:
[m]sin(theta) = {2{pi}{theta}}/360 – ({2{pi}{theta}}/360)^3/{3!} + ({2{pi}{theta}}/360)^5/{5!} – cdots{=}[/m]
[m] {=} 1,7453*10^{-2}{theta} – {theta}^3/1128546 + *10^{-10}{theta}^5/74095939437 – cdots[/m]
Pero desafortunadamente NXT-G sólo admite números enteros. Ejecuta el siguiente ejemplo y verás que el resultado de dividir 5 entre 3 no resulta 1,666 sino 1.
[m]10^3{sin}(theta) = 17{theta} – {theta}^3/1129 + {theta}^5/74095939 – cdots[/m]
[m]10^4{sin}(theta) = 175{theta} – {theta}^3/113 + {theta}^5/7409594 – cdots[/m]
Por otra parte, como tampoco podemos implementar la serie infinita en el procesador, veamos hasta qué punto afecta el cortar el desarrollo en un punto u otro. Las siguientes gráficas muestran tanto la función original y = sin(x) como varias de las aproximaciones más sencillas, con 2, 3 y términos, así como el error de cada uno de ellos entre 0 y pi. Podemos observar que en este rango el valor del error cometido por cualquiera de las aproximaciones es creciente, por lo que si tenemos en cuenta la igualdad sin(x)=sin(pi-x), nos interesa trabajar exclusivamente con valores en el primer cuadrante e implementar los restantes considerando lo anterior y el signo que proceda. De esta forma podemos reducir la cota del error cometido en la aproximación.
[m]{theta} = 90º[/m] | [m]n=2[/m] | [m]n=3[/m] | |
[m]K=10^3[/m] | [m]17{theta} – {theta}^3/1129 + {theta}^5/74095939[/m] | [m]884,30[/m] | [m]963,98[/m] |
[m]K=10^4[/m] | [m]175{theta} – {theta}^3/113 + {theta}^5/7409594[/m] | [m]9298,67[/m] | [m]10095,60[/m] |
Con los datos anteriores vemos que podemos obtener en el peor de los casos, para [m]{theta} = 90º[/m], un error máximo del 7% si [m]K=10^4[/m] y [m]n=2[/m], mientras que será inferior al 1% si [m]K=10^4[/m] y [m]n=3[/m]. Dependiendo de nuestra aplicación tendremos que decidir si preferimos precisión o velocidad de cálculo. Periodicidad: Por otra parte, y teniendo en cuenta que las funciones trigonométricas son periódicas, debemos de considerar en las aproximaciones anteriores que, dado que estamos trabajando con potencias, si no acotamos los valores del ángulo theta podemos encontrarnos con la posibilidad de salirnos fuera del rango de trabajo del procesador. Este problema lo podemos eliminar sin más que tratar con el valor de ángulo de los primeros 360º, es decir, restándole múltiplos de 360º. Simetría: Por último, si queremos trabajar exclusivamente con ángulos del primer cuadrante, podremos tener en cuenta la simetría de la función sin olvidarnos del signo.