Bienvenidos a MasLibertad

Bienvenidos a MasLibertad

¿Quién soy yo?

Experiencias Informáticas

Aprendiendo a Programar

Currículum Informático

Auge y Caída de Infonos

Programando la Gravedad

Mis Favoritos

Cosas que me han Pasado

Paseos y Excursiones

Novelas y Relatos

Novedades y Proyectos

Miscelánea

Cartas al Autor

Torrejón de Ardoz

Areas de Ciencias

Documentales y Libros

Áreas de Religión

Economía y Política

La Última Página

Datos de Usuario

AnónimoEntrar
IP54.162.239.233

Datos de Pagina

Análisis y desarrollo de un programa en JavaScript para calcular la fuerza  gravitatoria de un planeta en porciones

Creada09-07-2018
Modificada09-07-2018
Total Visitas10
Septiembre5

Calcular Gravedad Planetaria

Para calcular la fuerza de gravedad de un planeta en la superficie se suele asumir que la masa del planeta se encuentra concentrada en un punto, en su centro de gravedad.

Hace años descubrí que existen dos factores, el Gradiente Gravitatorio y la Dispersión Gravitatoria, que a distancias muy cortas producen Variaciones Gravitatorias.

Las dos alteraciones son simultáneas, pero de sentido inverso. No eran de la misma intensidad, pero tampoco el volumen del planeta está distribuido de una forma homogénea hacia nosotros.

Si calculáramos la masa de cada átomo, uno a uno, calculáramos distancia y dirección y luego sumáramos todos los vectores ¿sería el mismo resultado que si supusiéramos que todos los átomos están en un pequeño agujero negro, a 6.378 Km de nuestros pies?

Decidido por fin a resolver ese problema, vamos a programar un proceso que calcule, con la mayor precisión posible, la atracción gravitatoria que un planeta ejerce sobre una masa de 1 Kg situada en la superficie del mismo.

Análisis de Programación

Vamos a dividir el planeta en porciones cúbicas de un tamaño determinado y vamos a recorrer, a través de las tres coordenadas del espacio (x, y, z) cada una de esas porciones.

Mientras más pequeñas sean las porciones, mayor será su cantidad y más preciso será el resultado, pero también será mayor el tiempo de proceso.

Si establecemos el tamaño de cada porción en 100 Km, dado que el diámetro de la Tierra es de 12.756 Km, tendríamos 128*128*128 = 2 millones de porciones.

Dos millones de iteraciones con una decena de operaciones de punto flotante cada una puede tardar bastante tiempo, según la velocidad del ordenador. Como aún no sabemos cuánto, durante el desarrollo del programa vamos a ser más modestos y hacer porciones de 200 Km, lo que nos dejará sólo con 64*64*64 = 262.144 iteraciones. Una vez completado el programa podremos cambiar este parámetro para ser más precisos en los cálculos, aunque el proceso sea más lento. La mitad de tamaño serían 2³=8 veces más porciones y tiempo de cálculo.

Un Cuarto de ManzanaAún podemos reducir el proceso si tenemos en cuenta que, al ser la Tierra bastante simétrica, sólo tenemos que calcular UN cuadrante de la Tierra, el equivalente a cortar la manzana de Newton en cuatro porciones iguales, y el total multiplicarlo por 4. Así reducimos las iteraciones hasta 64*32*32 = 65.536.

Y para reducir aún más este proceso, cualquier coordenada (x,y,z) que se encuentre a más distancia del centro que el radio del planeta tendrá de masa un valor de 0. En vez de recorrer el planeta desde fuera hacia dentro, lo haremos desde dentro hacia fuera, y en el momento que lleguemos a una masa 0 ya podemos considerar que el resto de esa coordenada está vacía, pudiendo entonces finalizar el bucle y ahorrar iteraciones. De esta forma las reduciremos a unas 40.000.

Por supuesto, nos interesa que la Tierra sea perfectamente simétrica alrededor del punto central de nuestros cálculos, pero si empezamos a contar volúmenes desde la superficie no lo conseguiremos. En la coordenada x, que va a recorrer el planeta de Arriba Abajo, tenemos que empezar a contar en una distancia tal que al llegar al centro del planeta coincida con el límite entre dos capas de x.

Como el radio de la Tierra es 6.378 Km, eso nos llevaría a que el primer valor de x, para un tamaño de 200 Km cada porción, llegaría a 6.200 más media porción, igual a 6.300.

En las coordenadas y,z debemos contar desde el centro del tamaño de cada porción.

Esto nos plantea un nuevo problema.

El objetivo de este programa es demostrar que el Gradiente Gravitatorio y la Dispersión Gravitatoria van a hacer que la suma de las fuerzas de todas las porciones va a ser distinta (mayor) que si consideráramos toda la masa del planeta concentrada en su centro. Pero precisamente por eso la fuerza de atracción de las porciones más cercanas al Kg de muestra van a ser bastante más elevadas que las que le corresponderían.

Utilizando el mismo programa que estamos diseñando, con unas pocas modificaciones, podríamos calcular en qué proporción se produce esa variación, pero por no alargar el tiempo de programación vamos a llegar a una solución de compromiso.

Cálculo de Gravedad descartando los Polos

Vamos a prescindir de contar las porciones que estén demasiado cerca de nuestro Kg, por ejemplo, las que estén más cerca de 3 veces el Tamaño de cada porción.

Y para dejar las demás condiciones simétricas, en el extremo opuesto del planeta haremos lo mismo.

El resultado será que, si dibujamos cada porción del planeta a calcular, será como si en el polo Norte y el Sur hubiera un bocado hemisférico, como un cráter, de masa que no se tiene en cuenta para este cálculo.

Con porciones del tamaño de 200 Km vamos a realizar unas 40.000 iteraciones, y en cada una de ellas calcularemos la distancia al Centro. Según esta distancia calcularemos su densidad y su masa. Después calcularemos la Distancia al Kg y a las antípodas. Si es mayor que el límite de Tamaño*3 calcularemos la fuerza de atracción, y ésta la reduciremos al componente vertical de dicha fuerza, ignorando el componente horizontal, que quedaría anulado con la porción del cuadrante opuesto.

Como todas estas operaciones son de punto flotante, que requieren bastante tiempo de proceso, vamos a hacer que dentro del bucle se calculen sólo las operaciones imprescindibles. En este caso obviaremos la multiplicación del parámetro G, que postergaremos hasta el final del bucle aplicándola sobre el resultado final.

Por último, cuando se lanza un proceso que puede tardar bastante tiempo queremos ver también un reloj o una barra en la que se indique el progreso del programa y saber que no se ha bloqueado o metido en un bucle infinito.

En lugar de poner una barra vamos a hacer algo más útil: Dibujar el planeta.

Por cada iteración de x,y (no de z) vamos a dibujar un punto en un lienzo. Así veremos, punto a punto, cómo se va dibujando el planeta y cuando llegue al final conseguiremos los resultados.

Ahora llega la parte más fácil del problema: convertir todos nuestros razonamientos en un programa de ordenador.

// Inicializar Variables
    Leer Tabla de Densidades según Radio
    Leer Radio del Planeta
    Diametro = Radio * 2
    Leer Tamaño de las Porciones
    Primer_x = Modulo del Radio sobre Tamaño
    Primer_y = Tamaño / 2
    Primer_z = Tamaño / 2
    Limite = Tamaño * 3

// Iniciar proceso
Para x = Primer_x hasta Diametro cada Tamaño
  Para y = Primer_y hasta Radio cada Tamaño
    Para z = Primer_z hasta Radio cada Tamaño
      Calcular Distancia de x,y,z a Radio,0,0 // el centro del planeta
      Aplicar Densidad según Distancia
      Si Densidad es mayor que 0
        Calcular DistanciaKg de x,y,z a 0,0,0 // el Kg de muestra
        Si DistanciaKg es mayor que Limite
          Calcular DistanciaOpuesta de x,y,z a Diametro,0,0
          Si DistanciaOpuesta es mayor que Limite
            Calcular Masa
            Sumar a MasaTotal
            Calcular FuerzaAtracción (menos G)
            Calcular FuerzaVertical
            Sumar a FuerzaTotal
          Fin de DistanciaOpuesta mayor que Limite
        Fin de DistanciaKg mayor que Limite
      Si no, si Densidad es 0 // en z hemos salido del planeta
        Si y > z // también en y
          y = Radio
        z = Radio
      Fin de Densidad mayor que 0
    Siguiente z
  Siguiente y
Siguiente x
Multiplicar MasaTotal por 4
Multiplicar FuerzaTotal por 4 y por G
Imprimir Resultados

Y, por fin, una vez resueltas todas las consideraciones a tener en cuenta, vamos a decidir en qué lenguaje vamos a escribir el programa.

El lenguaje más rápido de ejecución sería C, puro y duro, sin usar las utilidades de C++, con todas las operaciones dentro del bucle interno sin realizar llamadas a funciones externas.

Pero eso no permitiría que el programa se ejecutara en la página web, y me gustaría que, como en todas las calculadoras que he publicado en mi página, los usuarios puedan introducir y modificar los parámetros del problema para comprobar los posibles resultados.

Así que la solución es hacer el programa en JavaScript.

Depuraciones y Mejoras

Y llegamos a lo más pesado y trabajoso de la programación: la depuración.

Después de escribir el programa, una agradable sorpresa: El ordenador es mucho más rápido de lo que pensaba y tarda menos de un segundo en realizar las operaciones.

Pero cuando pruebo con porciones más pequeñas, como 50 Km, el programa se eterniza y el navegador, detectando que estoy acaparando muchísimo tiempo de cálculo, me pregunta si quiero detener el proceso. Le digo que no y, tras varios nuevos avisos llega a su fin, al cabo de casi un minuto.

En cada iteración tengo que realizar, unas 50 sumas, 30 multiplicaciones, 20 divisiones y 8 raíces cuadradas. Las sumas son rápidas, pero las multiplicaciones y divisiones son bastante más lentas, y aún más las raíces.

Intentando ahorrar tiempo de proceso encuentro una forma en que puedo ahorrarme casi el 25% de las operaciones y, además, reducir a la mitad las iteraciones.

En vez de dividir la Tierra en 4 cuartos, la divido en 8 octavos. ¿Cómo no se me había ocurrido antes? En cada iteración realizo 8 sumas más pero ahorro 6 multiplicaciones, 4 divisiones y dos raíces. Y además, hago la mitad de iteraciones.

En vez de recorrer la Tierra desde el Polo Norte hasta el Polo Sur, sólo voy a contar desde el Centro hasta el Polo Sur. Una vez calculada la distancia al centro del planeta me vale para las 8 porciones, desde x,y,z hasta -x,-y,-z.

Con un único cálculo consigo la distancia al Kg y a la Antípoda. y de cada iteración ahorro gran cantidad de operaciones. 

Una vez puesta en práctica esa idea, la segunda versión del programa es bastante más rápida que la primera. ¡Y elimina el problema de las porciones excesivamente cercanas al Kg.

Una desagradable sorpresa. Quería que el dibujo de la Tierra funcionara como un sistema de barra de progreso, y de haberlo hecho en C o en Visual C así hubiera sido, pero Windows no funciona así.

Windows realiza los dibujos y gráficos en memoria, y cuando tiene tiempo libre los publica en pantalla. Pero como el procesador está realizando varios millones de operaciones a toda velocidad, no tiene tiempo para enviar la imagen a pantalla en cada modificación, así que lo único que vemos es el resultado final.

Y, por supuesto, al primer intento salieron los resultados más absurdos que os podáis imaginar, pero tras varias horas de depuración y correcciones (un + por -, una variable equivocada, una condición innecesaria, etc.) por fin he conseguido dejarlo a punto, como debe ser.

Y dejando para el final algunos aspectos estéticos, y algunas ideas añadidas, aquí tenéis el resultado.

Datos Oficiales de la Tierra

Radio Ecuatorial 6.378 Km
Volumen 1'0832 e12 Km³
Masa 5'9736 e24 Kg
Densidad Media 5'515 g/cm³
Fuerza Gravitatoria 9'7803 Newtons

Parámetros de Cálculo

Distancia al Centro de la Tierra Km
Tamaño de Porción Km
Descartar Porciones Cercanas Km
Radio Tierra-Hueca Km

Tabla de Densidades

Zona Radio Densidad Color
Núcleo Interno
Núcleo Externo
Manto Interno
Manto Externo
Corteza

Resultados

Su navegador no soporta canvas :(
Número de Porciones 17005
Volumen 1.088e12 Km³
Masa 6.008e24 Kg
Densidad Media Densidad g/cm³
Fuerza Calculada Fuerza Newtons
Fuerza en Tierra-Punto Fuerza Newtons
Diferencia Fuerza %

Datos del Proceso

Número de Iteraciones 17005
Operaciones Matemáticas 17005
Tiempo de Cálculo 1 segundos

Recapitulando

Después de una buena cantidad de pruebas, correcciones y mejoras, el programa es bastante más rápido de lo que pensaba. Por curiosidad le he puesto un contador de iteraciones y lo he multiplicado por las operaciones que tiene que realizar en cada ciclo. Con porciones de 100 Km, se realizan 139.000 iteraciones, ejecutando 7'6 Millones de operaciones matemáticas, entre 4 M de sumas, 2'8 M de multiplicaciones y 820.000 raíces cuadradas. Y todo ello en menos de medio segundo.

¡Uau!

Si quieres comprender mejor las opciones que ofrece esta calculadora, visita La Gravedad Planetaria y otros artículos que encontrarás en la misma sección.

Perdón por la interrupción

La Ley me obliga a darte el siguiente

Aviso Legal

Utilizamos cookies propias y de terceros para mejorar nuestros servicios y mostrarle publicidad relacionada con sus preferencias mediante el análisis de sus hábitos de navegación.

Si continua navegando, consideramos que acepta su uso.

Si lo desea, puede Ampliar Información

Aceptar Cookies

Bienvenidos a MasLibertad | ¿Quién soy yo? | Cartas al Autor | Aviso Legal sobre Cookies