5 votos

Simular un impacto físico de objetos formados por elementos finitos y pequeños

Quiero simular un impacto entre dos cuerpos según la gravedad, y eventualmente considerar otras fuerzas para pegar la materia. Me gustaría utilizar python para ello, pero estoy abierto a alternativas. ¿Qué tipo de herramientas o bibliotecas puedo utilizar para realizar esta tarea?

3voto

Epcylon Puntos 164

Hace poco hice algo así, para simular un sistema de dos masas conectadas por un muelle. Dichas masas estaban colocadas horizontalmente en un plano sin fricción. Una de estas masas recibió un impulso inicial y a partir de ahí se dejó el sistema solo. Mientras que todo el sistema (el controide que se precia) se mueve con velocidad constante, las dos masas oscilan, mientras se mueven hacia adelante. Aquí hay un breve dibujo ASCII del sistema

 Initial Impulse     ______              ______ 
 ---->               | m1 |/\/\/\/\/\/\/\| m2 |
_____________________|____|______________|____|______________________

Después de escribir las ecuaciones diferenciales, escribí un pequeño programa en python para simular el problema. Este programa se basa en el método de los pequeños pasos (también llamado método Eueler). Aquí está el artículo correspondiente de la wikipedia:

http://en.wikipedia.org/wiki/Euler_method

He implementado este alogoritmo para el problema descrito anteriormente y he trazado los resultados utilizando gnuplot:

gnuplot.info (sólo se me permite añadir un hipervínculo, así que añada www)

Pero usted es libre de utilizar cualquier herramienta que desee para este fin. Aquí viene el código fuente de mi pequeño programa:

#!/usr/bin/python
import os

steps = 100000
time = 100.

# Initial conditions
D = 0.9
m1 = 1.2
m2 = 0.4
v1 = 1.3
v2 = 0.
x1 = 0.
x2 = 1.
l = 1.

#Since I also tried to implement other algorithmus i specify which one to use
Euler = 1

#Euler 

if Euler == 1:
    timesteps = time / steps
    # Open the files for writing the results to
    f = open('results_x1', 'w')
    f2 = open('results_x2', 'w')
    f3 = open('results_com', 'w')

    # The real calculation   
    for i in range(0,steps):
        x1 = x1 + (D * (x2 - x1 -l) / m1)* (timesteps**2) + v1 * timesteps
        x2 = x2 - (D * (x2 - x1 -l) / m2)* (timesteps**2) + v2 * timesteps
        v1 = v1 + (D * (x2 - x1 -l) / m1)* (timesteps)
        v2 = v2 - (D * (x2 - x1 -l) / m2)* (timesteps)  
        f.write(str(i*timesteps) + " " + str(x1) + "\n")
        f2.write(str(i*timesteps) + " " + str(x2) + "\n")
        f3.write(str(i*timesteps) + " " + str((x1*m1 + x2*m2)/(m1+m2)) + "\n")

    f.close()
    f2.close()
    f3.close()

Por supuesto que hay mejores alogoritmos que el de euler, pero este es definitivamente el más fácil de implementar (fracasé implementando algoritmos más avanzados ;-)).

Así que estos son los pasos que probablemente deberías seguir:

  • Escribe las ecuaciones diferenciales de tu problema
  • Comprender el método de Euler
  • Tome mi código como punto de referencia y modifíquelo para su problema

Sé que es un tema bastante extenso y que, por tanto, mi respuesta es sólo superficial. Sólo tienes que decir lo que quieres saber más, y voy a tratar de añadir los comentarios correspondientes ;-)

1voto

Jonathan Puntos 197

Consulte el sitio de Ron Fedkiw es un buen punto de partida con un amplio conjunto de palabras clave.

0voto

Mikeage Puntos 2106

Depende del tipo de simulación que se intente construir:

si su simulación tiene el propósito de construir un modelo de simulación, que, por ejemplo, evita el ruido experimental, tal vez con un algoritmo de dinámica compleja y así sucesivamente, creo que C o C ++ son las mejores opciones..

Si por el contrario quieres crear una simulación rápida con salida gráfica y herramientas de análisis incorporadas (quizás incluso con fines didácticos), python es tu opción! en este caso te sugiero que consultes el Distribución de Python Enthought .. para uso académico es freeware y tiene una versión incorporada de scipy.

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