Trigonometría en NXT-G

This entry is part 2 of 11 in the series NXT-G

sonar1Si 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.

{sin}x = sum{n=0}{infty }{}{(-1)^n}/{(2n+1)!}x^{2n+1} = x - x^3/{3!} + x^5/{5!} - cdots for all x

Si optamos por trabajar en grados, la ecuación quedará:

sin(theta) = {2{pi}{theta}}/360 - ({2{pi}{theta}}/360)^3/{3!} + ({2{pi}{theta}}/360)^5/{5!} - cdots{=}

 {=} 1,7453*10^{-2}{theta} - {theta}^3/1128546 + *10^{-10}{theta}^5/74095939437 - cdots

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.

entero
Esto quiere decir que si implementamos la serie anterior tendremos el valor cero o uno según sea la aproximación, pero no el valor real de la función sin(x) que tratamos de implementar, comprendido entre 0 y 1. Para resolver esta limitación podemos multiplicar el resultado por K=10^3 o por otro múltiplo mayor. De este modo tendremos que, trabajando exclusivamente con valors enteros:

10^3{sin}(theta) = 17{theta} - {theta}^3/1129 + {theta}^5/74095939 - cdots

10^4{sin}(theta) = 175{theta} - {theta}^3/113 + {theta}^5/7409594 - cdots

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.

Veamos la imprecisión que estamos cometiendo para un ángulo de 90º, el punto de mayor error en el contexto anterior, según el número de términos que seleccionemos y según el factor de multiplicación que tomemos. El resultado debería ser 1 si emplearamos la serie infinita.

 

{theta} = 90º n=2 n=3
K=10^3 17{theta} - {theta}^3/1129 + {theta}^5/74095939 884,30 963,98
K=10^4 175{theta} - {theta}^3/113 + {theta}^5/7409594 9298,67 10095,60

Con los datos anteriores vemos que podemos obtener en el peor de los casos, para {theta} = 90º, un error máximo del 7% si K=10^4 y n=2, mientras que será inferior al 1% si K=10^4 y n=3. 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.

Series Navigation<< Variables y Constantes en NXT-G<< NXT como catálogo de productosManejo de ficheros en NXT-G >>
facebooktwittergoogle_plusredditpinterestlinkedinmailfacebooktwittergoogle_plusredditpinterestlinkedinmail

facebooktwittergoogle_pluslinkedinrssyoutubefacebooktwittergoogle_pluslinkedinrssyoutube

Comments are closed.