8 votos

¿Por qué experimenta aceleraciones repentinas de grandes objetos en una simulación de la gravedad?

Estoy tratando de crear un sencillo programa que simula la gravedad. La idea es que tengo un sol central y varios planetas que puedo crear con un gesto en la pantalla, y yo uso la inicial de barrido para proporcionar a los planetas con una velocidad inicial.

Después de algún tiempo el planeta finalmente se empiezan a moverse alrededor del sol según la ley de Newton.

Mi enfoque actual es: En cualquier momento puedo calcular el valor de la fuerza gravitacional que el sol ejerce sobre el planeta ($Mp$ es la masa del planeta y $Ms$ es la masa del sol):

$$F = G \frac{Mp Ms}{r^2}$$

Y luego encontrar el valor de aceleración para el planeta con

$$A = \frac{F}{Mp}$$

Entonces puedo encontrar el ángulo, $\theta$, de la línea que une el centro del planeta con el centro del sol.

A continuación, crear un vector de aceleración a lo largo de esa línea por la creación de su x y una componente y:

$$\begin{align} Ax &= A\cos\theta & Ay &= A\sin\theta \end{align}$$

En la siguiente iteración puedo utilizar este vector de aceleración y el tiempo transcurrido desde la iteración anterior para calcular el planeta de la velocidad y su posición. Entonces todo se repite.

El principal problema con este enfoque es que tan pronto como el planeta alcanza una distancia de cerca de cero desde el sol, se pone una tremenda aceleración y en la siguiente iteración es simplemente demasiado lejos del sol y mantiene en movimiento a lo largo de una línea recta, a la derecha de la pantalla, que por supuesto no es lo que yo esperaría de la gravedad. Tenga en cuenta que todavía no tengo la detección de colisiones para lo que yo esperaría que sería el planeta permanezca tipo de todavía en el centro del sol.

Mi intuición es, gritando que yo debería usar algún tipo de integración de la aceleración para cada aceleración, que me pierdo entre una iteración y la siguiente sería tomado en cuenta y a mi planeta dejaría escapar de la gravedad, así que me he recuperado mis matemáticas y física de los libros y trató de averiguar esto por mí mismo, pero no hubo suerte.

Si tengo este derecho, el problema es que la aceleración es una función de la distancia, así que no se puede integrar en el fin de obtener la posición para el planeta, porque eso requeriría una aceleración como función del tiempo. Estoy en lo cierto? ¿Cuál es la solución adecuada a este?

13voto

Brionius Puntos 4898

Si usted realmente desea un general de la gravitación simulador (es decir, uno que se va a manejar más de dos cuerpos), entonces hay métodos para reducir el error involucrado en la simulación, pero no existen métodos para eliminar el error. A continuación son algunos de los enfoques que ninguno de estos enfoques son perfectos, ya que hay un equilibrio entre lo físico exactitud, la programación y la velocidad de cálculo, y reducir el escape de comportamiento.

  1. Adaptación pasos de tiempo - cuando su partícula está experimentando grandes cambios en la aceleración (es decir, cuando se mueve rápido cerca de un cuerpo masivo), puede reducir el tiempo de paso $dt$, de modo que usted está en "saltar" menos tiempo. Esto aumentará la física exactitud de la simulación, sino que también va a ralentizar la simulación (y lento hacia abajo de manera desigual), así que no es una buena opción si usted quiere que se vea bien en tiempo real.

  2. Esferas duras - hacer que sus masas de esferas duras que rebotan entre otros. Esto reducirá la acumulación de error, ya que las masas no se sentirá tan cerca el uno del otro. Esto puede aumentar la física exactitud de la simulación, a menos que usted se oponga a los planetas que rebotan como pelotas de goma (que es una objeción válida, supongo que también podría hacer que ellos inelástica de las esferas, que es probablemente más exacta de los planetas).

  3. Límite de velocidad - sólo podía programa en un disco duro de límite de velocidad para limitar el escape de comportamiento. Cuando la velocidad supera el límite de velocidad, cambiar el tamaño de la velocidad de la magnitud de nuevo a la velocidad límite. Esto no es físicamente muy precisa, y puede resultar en un extraño comportamiento, pero es fácil de programar, y reducir el escape de sus masas.

  4. Conservación de la energía en cada paso de tiempo, calcular la cantidad total de la gravitacional y la energía cinética de todas las misas. En cada paso de tiempo, si la cantidad total de energía ha cambiado, artificialmente ajustar las velocidades de las masas de modo que la cantidad total de energía permanece el mismo. Eso no es exacta, pero sí mantener la fidelidad con una ley de la física, y reducir el escape de comportamiento.

Si quieres ayudar a la comprensión de la aplicación de uno de estos métodos, me puede explicar en más detalle.

9voto

lfx Puntos 892

Brionus ha tocado en la clave de la adaptación pasos de tiempo. Cuando usted comienza a conseguir grandes aceleraciones, reducir el tamaño de los incrementos de tiempo. También, cuando usted no está acelerando mucho, aumentar el tamaño.

Bastante estándar, un modo de hacer esto es calcular el cambio de posición, a más de un paso. A continuación, cortar el paso a la mitad y, a partir del mismo punto de partida, calcular 2 sucesivas posición pasos. Comparar las dos de la posición final de los cambios, y si se diferencian por algunos predeterminado factor (digamos 10^-6), reemplazar el original paso de tiempo con el pequeño paso, y hacer el cálculo de nuevo. Si los dos pasos que igualó cerca, trate de un cálculo con un paso de tiempo, el doble de la original.

Esto lleva a una gran cantidad de cálculo, pero se produce una simulación que no es ni demasiado precisa ni no son lo suficientemente precisas. Para simulaciones orbitales, los grandes pasos de tiempo utilizado durante la baja gravedad de las trayectorias más que compensar por el extra de tiempo de cálculo.

EDITAR - En respuesta a la solicitud de "el cálculo de la aproximación":

El método de cálculo que se utiliza va a trabajar para un simple simulador, pero no tiene en cuenta las interacciones entre los no-cuerpos solares, así como asumir que el sol no se mueve. Para controlar esto, utilizar un enfoque generalizado. La tienda de los (x,y,z) (Vx,Vy,Vz) y (Mx,My,Mz) los valores de sus cuerpos en las matrices indexadas de la misma manera. A continuación, la gravitacional de atracción entre dos cuerpos simplemente se calcula como (Fx,Fy,Fz), donde $$F_n =\frac{\Delta n}{\sqrt{{\Delta x}^2 + {\Delta y}^2 + {\Delta z}^2}} \frac{GM_a M_b}{{\Delta x}^2 + {\Delta y}^2 + {\Delta z}^2}$$ Calculate each component separately, and integrate separately to get new velocities and positions. Also note that you will need to calculate $N(N-1)$ values for N bodies (including the sun) but that body A pulls on body B exactly as hard as body B pulls on body A, so you only need to do the numerical computation half of the apparent total, although you'll need to be careful to reverse the sign to get the other half of the values right. (The reason it's $N(N-1)$ rather than $N^2$ es que no va a calcular la fuerza de un cuerpo en sí mismo.)

Para un simple simulador, puede utilizar Euler integración. Dada la fuerza sobre un cuerpo y su masa, para un muy pequeño $\Delta t$ se puede decir $$\Delta V = \frac{F \Delta t}{M}$$ and when you know both the original velocity V and the change in velocity, the change in position $\Delta P$ is$$\Delta P = {(V + \Delta V)\Delta t}$$

Para bajito escalas de tiempo y muy pequeño $\Delta t$ esto va a funcionar, pero son fundamentalmente tratando de aproximarse a una curva irregular con segmentos rectos y a la larga vas a ver grandes y crecientes de los errores. Así que para períodos más largos, usted querrá conseguir en más sofisticados algoritmos. Como zeldridge ha comentado, los métodos de Runge-Kutta es un conocido alternativa.

SEGUNDA EDICIÓN - También, cuando la actualización de sus valores, de hacer de cada conjunto de cálculos basados en las mismas condiciones originales para todos los cuerpos. Es decir, si usted está calculando Vnew y Pnew para el cuerpo, no calcular los resultados para el cuerpo B, utilizando la versión actualizada de Pnew para el cuerpo A. Calcular una nueva matriz de V y los valores de P, entonces a sustituir los viejos valores como un bloque.

5voto

Vicfred Puntos 123

Si no estás interesado en una completa simulación de n-cuerpo y se aceptan uno donde el sol es mucho más grande que todos los planetas, se puede simplificar mucho las cosas. Tenemos una solución analítica a los dos cuerpo a cuerpo problema, así que usted puede aplicar el sol de la gravedad de esa manera. Para cada planeta, dada su posición y velocidad, usted puede calcular su momento angular y de la energía, a continuación, obtener la órbita. Esto le permite calcular la ubicación del planeta en el final del paso de tiempo ignorando los lugares de interés de todos los planetas. A orden cero, usted hace, porque usted ignorar el planeta-el planeta de las interacciones. Si desea aplicar el planeta-planeta interacciones, se puede calcular la fuerza en el planeta $i$ de todos los otros planetas y aplicar la aceleración durante todo el tiempo que paso. Como la fuerza es mucho menor que el del sol, la gravedad, el cambio en la posición será pequeño. Esto mantendrá sus errores mucho más pequeño, más o menos como es la relación de fuerzas en el planeta de los otros planetas a la fuerza del sol. A continuación, puede aplicar la adaptación de pasos de tiempo y de conservación de la energía que los otros socorristas sugieren.

0voto

Shoeless Puntos 218

Un diferente enfoque de programación en un paso-por-paso de animación es para asignar la posición y el impulso de las variables para cada uno de los objetos. En términos de programación tenemos nombre de objeto, de masa, de la ubicación de x/y/z, y el impulso px/py/pz. Entre cada fotograma, para cada objeto, primero se calcula su distancia a cualquier otro objeto, y para calcular la fuerza gravitacional sobre el objeto basado en el de Newton inversa de la fuerza de la ley; en segundo lugar, añadir la fuerza del impulso; por último, agregar el impulso a la ubicación (px=px+forcex, x=x+px).

Usted puede conseguir muy buenas animaciones con este método, donde la precisión es sólo limitada por la exactitud de los cálculos, la frecuencia de los cálculos y a la posición de partida/el impulso de cada uno de los objetos. Un ejemplo de este método se puede encontrar en http://www.animatedphysics.com/planets/Moon_Orbit.htm

WRT su problema "El principal problema con este enfoque es que tan pronto como el planeta alcanza una distancia de cerca de cero desde el sol, se pone una tremenda aceleración y en la siguiente iteración es simplemente demasiado lejos del sol y mantiene en movimiento a lo largo de una línea recta, a la derecha de la pantalla". Este es un problema muy importante. Si usted permite que un objeto para obtener arbitrariamente cerca de un segundo objeto, la fuerza entre los objetos va a ser arbitrariamente grande (por lo tanto, el objeto de repente salta fuera del campo de visión como experiencia) no importa cuán pequeño sea el timesteps de utilizar.

Creo que sería muy esclarecedor si @Brionius podría expandir su opción 4.

0voto

Paco Jain Puntos 226

Basado en el modelo físico está adoptando (que sólo el "sol" que ejerce la fuerza gravitacional sobre el "planetas" y que ignoramos los efectos gravitacionales de los planetas en el sol o en la otra), que sin duda es un bastante decente punto de partida (por no mencionar lo suficientemente bueno para Kepler w.r.t de nuestro propio sistema solar), hay dos puntos principales a realizar:

1) No SON legítimos órbitas (o, más correctamente, vamos a llamarlos trayectorias) en el que el planeta no está enlazado al sol! Es decir, el planeta, en lugar de avanzar en un camino que queda cerca del sol y gira periódicamente alrededor de ella, puede, en plena coherencia con las leyes de Newton, se pone en un camino que lo lleva fuera del sistema solar, para nunca regresar (y esto puede ocurrir incluso después de que el planeta hace una inicial cerca de pasar cerca del sol, que podría llevar a pensar que iba a la órbita). Tampoco, dada inicial arbitraria de las velocidades de los planetas, deberíamos esperar que estas trayectorias a ser raros o inusuales, aunque ellos no pueden ser los que usted está interesado en. La solución de las leyes de Newton del movimiento, junto con su ley de la gravedad nos dice que el planeta de la trayectoria será uno de los tres tipos: elípticas, parabólicas o hiperbólicas. Sólo la primera de ellas, trayectorias elípticas, se han cerrado o delimitado. Ahora, es muy posible, incluso probable, que el "fugitivo" trayectorias de observar realmente son debido a que el número de artefactos de un insuficientemente precisa algoritmo de simulación, pero es probable que tocaría para confirmar que esto es cierto, como primer paso, mediante la comprobación de que la velocidad inicial que va a asignar los planetas son lo suficientemente pequeños que no poner el planeta en una parabólica o hiperbólica de la trayectoria. Si desea descartar completamente tales trayectorias, como parece que hacer, sería inteligente para escribir el código de tal manera que evita que el usuario de la elección de la velocidad inicial que daría lugar a ellos. La prueba es fácil, sólo demanda que $v^2 < \sqrt {G M / r}$ donde $v$ es el planeta inicial de la velocidad total y $r$ es el sol-planeta de distancia en el momento en el que la velocidad inicial es medido. Es posible que desee ir paso más allá y exigen que la excentricidad de todas las órbitas elípticas es lo suficientemente pequeño que el planeta no salir de la pantalla (como podría, por ejemplo, para una cometa Halley-como objeto que, a pesar de estar obligada a nuestro sol, varía su distancia al sol por un factor de más de 70 de sus 76 años de periodo orbital). Al exigir que los $a \equiv \frac{1}{\frac{2}{r}-\frac{v^2}{G M}}$, el llamado "eje semi-mayor" de la órbita, es menor que la distancia desde el sol hasta el borde de la pantalla, usted puede estar seguro de que cualquiera de los planetas que salir de la pantalla son no volver jamás, y representan ya sea parabólica/hiperbólico trayectorias, o si estas han sido excluidos, numérico artefactos.

2) tal vez la más importante, porque tiene el potencial de mejorar en gran medida la simplicidad, la precisión y la eficiencia de su código, es que las leyes de Newton, en virtud de su físico supuestos, son totalmente solucionable, lo que significa que no hay necesidad de simular la física (!). Es el llamado de dos cuerpos problema (a pesar de que hay múltiples planetas, estamos asumiendo que no interactúan el uno con el otro, de modo que cada planeta del camino está completamente determinado por sus interacciones con exactamente uno de otro objeto, el sol), y es esencialmente el cálculo que Kepler hizo para mostrar que los planetas se mueven en órbitas elípticas. Es algo complicado de escribir el $x$ $y$ posiciones como una función de tiempo debido a un arbitrario iniciales de posición y velocidad para el planeta, así que no voy a hacer aquí, pero el artículo de Wikipedia sobre "Kepler órbitas", y los enlaces en los mismos proporcionan todas las ecuaciones que uno necesitaría para masaje hasta obtener el resultado deseado (tenga en cuenta que no se supone que hemos de tomar la órbita del perihelio/el afelio, la dirección a estar alineado con uno de los ejes de coordenadas, y será necesario realizar un cambio de base para recuperar el más general de resultados). En realidad soy un empleado en Wolfram Alpha, y me sorprende que no tenemos la paramétricas resultados de $x$ $y$ como una función del tiempo para el problema de Kepler disponibles en nuestro sitio web. Pero voy a trabajar para rectificar en el futuro y actualizar mi respuesta aquí si/cuando hago! Baste decir, sin embargo, que si usted no se preocupan por inter-planetaria interacciones, a continuación, la simulación de las leyes de Newton no es definitivamente la manera correcta de acercarse a este problema, y cosas como la adaptación de tiempo de los pasos, mientras que funcionaría, sería enorme exageración.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X