Re: Software para choque de cuerpos y particulas
Si no quieres programar mucho puedes usar un programa 3d como blender o similares, vienen ya con un sistema de particulas y colisiones incorporado. Depende de lo quieras simular puede que te valga sólo tocando algunos parametros, aunque en blender en concreto puedes modificar parte del código (al ser open source) en lenguaje phyton si no recuerdo mal.
Salu2
Anuncio
Colapsar
No hay ningún anuncio todavía.
Software para choque de cuerpos y particulas
Colapsar
X
-
Respuesta de visistanteRe: Software para choque de cuerpos y particulas
Por lo general este tipo de simulaciones tiene un mejor rendimiento si lo haces desde el paradigma de la Programación Orientada a Objetos (POO), ya que puedes crear una clase de objeto "pelotas o bolas", al que le cambies algunas de sus propiedades, como posición, velocidad, masa, tamaño, etc... Y al mismo tiempo puedes creear un vector o una matriz de objetos similares, que controle su existencia e interacciones.
Te recomiendo ver como se programaban los juegos en C++ bajo este paradigma de POO, para que puedas ver como controlar una gran cantidad de objetos del mismo tipo y que se mueven individualmente.
Saludos.
- 2 gracias
Dejar un comentario:
-
Re: Software para choque de cuerpos y particulas
Hola alriga, quizá puedas ver todos los controles si tienes la posibilidad de ajustar el tamaño de la pantalla del pc a la máxima resolución... Por otro lado creo que puedo hacer cambios y que se pueda cambiar el tamaño del formulario modificando alguna de sus propiedades...cuando me siente en ese pc con VisualBasic, paso la versión 2.0
Paso las características principales del programa como para que lo puedan, hacer correr en otros lenguajes de programación
- Crear las matrices de datos para que siempre estén disponibles desde cualquier procedimiento o función.
- Poner los datos a 0 para vaciar ejecuciones anteriores.
- Elegir una escala en la que el resultado de las operaciones sean directamente pixeles.
- Yo elegí tener una velocidad con módulo constante y dirección y posición aleatoria, con el fin de demostrar la tendencia hacia la distribución de boltzman, pero puede usarse cualquiera que se prefiera.
- Si es el tamaño del recipiente y el tamaño de las bolas, ninguna de estas debería posicionarse en coordenadas o por debajo de o por encima de
- Una vez calculada la posición de una bola, chequeo que no se superponga con otra bola
- Para ello se debe evitar que , en caso de superponerse se calcula la posición nuevamente, los valores se guardan en la matriz.
- Escojer una velocidad tal que al multiplicarla por tiempo unitario de desplazamientos bien por debajo de los lados del recipiente.
- Inicializar un contador de tiempo
- Calcular la posición de cada bola con y
- Se dibuja un círculo de radio R color blanco en la posición anterior, y uno negro en la posición actual.
- Calcular si la bola ha tocado un pared, consiste en chequear que tanto la coordenada x o y estén dentro del rango
- Si las se exceden entonces se invierte su velocidad
- Si las se exceden entonces se invierte su velocidad
- Y llevamos la cuenta de las veces que esto sucede para todas las bolas.
- Luego chequeamos si hay choques entre bolas nuevamente con
- Para cada choque hay calcular la velocidad relativa del alcance, y su modulo y dirección (ángulo en radianes) ,también el ángulo entre las posiciones al momento del choque es importante que los ángulos queden calculados perfectamente en su cuadrante , ya que el uso de arcosenos, arcocosenos y arcotangentes, puede ubicarlos en diferentes cuadrantes al que se necesita.
- Lo que se hace es reducir el problema de dos bolas en movimiento a uno con tiro unidimensional, a una bola detenida , como, trabajando con velocidad y ángulos relativos,
- Donde
- El modulo de la velocidad que estaba quieta luego del choque pasa a ser y el de la que impacta
- es importante el signo del ángulo pues la orientación del angulo de salida depende de el
- Luego se hallan las componentes de estas velocidades en la dirección paralela y perpendicular a la velocidad relativa,
- Para cada bola uso una matriz de rotación de coordenadas con ángulo para calcular las componentes en dirección x e y
- Sumo a esta la velocidad de la bola que tome de referencia para calcular la velocidad relativa y ya tenemos las nuevas velocidades de las bolas luego del impacto.
- Cuento el número de impactos.
- Tomo la precaución de adelantar los pasos necesarios la posición de las bolas luego del choque, para que en un nuevo paso no se calcule nuevamente el mismo choque.
- Se inicia el ciclo nuevamente actualizando la posición.
- Cada cierto intervalo de tiempo , se gráfica la distribución de velocidades, se toma un rango de velocidad y se cuentan cuantas bolas tienen el módulo de la velocidad dentro del rango, se guardan la suma en una matriz, y luego se gráfica en orden rango vs cuenta, y aparece la famosa curva de maxwell- boltzman
cuando pueda escribo mas látex con fórmulas.
aver si va la version 2.0 Boltzmann v2.0.rar
Lo interesante sería extenderlo ,
- Aplicando la pérdida de calor por las paredes, poniendo un coeficiente de restitución variable en función de la temperatura absoluta(que hay que modelizar).
- Aplicar dos o más tamaños y masas variables.
- Aplicar química.... que si se produce un choque de una partícula A con una B a una velocidad relativa por encima de un limite V aparezca una bola C , D etc de mayores y menores masas, consumiendo o liberando energía cinética, o radiación al resto en función de la distancia de separación.
- Aplicación del modelo a 3d
Todo fácil de escribir , pero para modelizar, para otros fines de semana...Última edición por Richard R Richard; 09/09/2018, 18:06:16.
- 4 gracias
Dejar un comentario:
-
Re: Software para choque de cuerpos y particulas
Muy interesante Richard gracias, aunque a mí no me funciona, los controles "Limpiar", "Dibujar" me quedan fuera de la pantalla y no tengo acceso a ellos. Sí justo arriba a la derecha, veo y puedo acceder a "Nº de bolas", "Velocidad",... y cambiar los valores.
Estaría bien que además del código, pusieses las ecuaciones que utilizas, haría más útil el hilo.
Gracias de nuevo y saludos.
Dejar un comentario:
-
Re: Software para choque de cuerpos y particulas
Hola aqui expongo un código sencillo que permite visualizar choques bidimensionales en un simple formulario de visual basic
el programa usa un formulario con los siguientes controles
el gráfico aparece dibujado en el mismo formulario el cual debe ser extenso, con los controles sobre la esquina superior derecha
el código para el formulario es
Código:Private Sub cls_Click() Me.cls End Sub Public Sub Command1_Click() Dim g As Integer Dim h As Integer n = CInt(Text1(0).Text) v = CSng(Text1(1).Text) R = CInt(Text1(2).Text) s = CInt(Text1(7).Text) deltat = CInt(Text1(8).Text) h = 0 tpo = CSng(Text1(3).Text) pi = 3.14159265 'cargar datos a = 1 Do Until a = n + 1 x = Int(R + Rnd() * (10000 - 2 * R)) y = Int(R + Rnd() * (10000 - 2 * R)) ang = Rnd() * 2 * pi If a > 1 Then 1 c = 1 x = Int(R + Rnd() * (10000 - 2 * R)) y = Int(R + Rnd() * (10000 - 2 * R)) w = 0 Do While c < a If ((x - B(c, 1)) ^ 2 + (y - B(c, 2)) ^ 2) ^ 0.5 < R Then w = 1 End If c = c + 1 Loop If w = 1 Then w = 0 GoTo 1 End If End If B(a, 1) = x B(a, 2) = y B(a, 3) = v * Cos(ang) B(a, 4) = v * Sin(ang) a = a + 1 Loop t = 1 np = 0 nt = 0 dt = 1 'calcular paso Do Until t = tpo + 1 a = 1 Do Until a = n + 1 Circle (B(a, 5), B(a, 6)), R + 2, RGB(255, 255, 255) B(a, 1) = B(a, 1) + B(a, 3) * dt B(a, 2) = B(a, 2) + B(a, 4) * dt Circle (B(a, 1), B(a, 2)), R B(a, 5) = B(a, 1) B(a, 6) = B(a, 2) a = a + 1 Loop ' choque pared a = 1 Do Until a = n + 1 If B(a, 1) < R Then B(a, 3) = -B(a, 3) B(a, 1) = R np = np + 1 End If If B(a, 1) > 10000 - R Then B(a, 3) = -B(a, 3) B(a, 1) = 10000 - R np = np + 1 End If If B(a, 2) < R Then B(a, 4) = -B(a, 4) B(a, 2) = R np = np + 1 End If If B(a, 2) > 10000 - R Then B(a, 4) = -B(a, 4) B(a, 2) = 10000 - R np = np + 1 End If a = a + 1 Loop ' choque bolas a = 1 Do Until a = n c = a + 1 Do While c < n + 1 If a <> c Then If ((B(a, 1) - B(c, 1)) ^ 2 + (B(a, 2) - B(c, 2)) ^ 2) ^ 0.5 < 2 * R Then If B(a, 1) <= B(c, 1) And B(a, 2) <= B(c, 2) Then d = 3 If B(a, 1) > B(c, 1) And B(a, 2) <= B(c, 2) Then d = 4 If B(a, 1) > B(c, 1) And B(a, 2) > B(c, 2) Then d = 1 If B(a, 1) <= B(c, 1) And B(a, 2) > B(c, 2) Then d = 2 If B(a, 1) - B(c, 1) = 0 Then If B(a, 2) - B(c, 2) > 0 Then dalfa = pi / 2 d = 1 Else dalfa = pi / 2 d = 3 End If Else dalfa = Abs(Atn((B(a, 2) - B(c, 2)) / (B(a, 1) - B(c, 1)))) End If If d = 1 Then alfa = dalfa If d = 2 Then alfa = pi - dalfa If d = 3 Then alfa = pi + dalfa If d = 4 Then alfa = 2 * pi - dalfa vrelx = B(a, 3) - B(c, 3) vxv = B(c, 3) vrely = B(a, 4) - B(c, 4) vyv = B(c, 4) If vrelx >= 0 And vrely >= 0 Then d = 1 If vrelx < 0 And vrely >= 0 Then d = 2 If vrelx < 0 And vrely < 0 Then d = 3 If vrelx >= 0 And vrely < 0 Then d = 4 If vrelx = 0 Then If vrely > 0 Then dphi = pi / 2 d = 1 Else dphi = pi / 2 d = 1 End If Else dphi = Abs(Atn(vrely / vrelx)) End If If d = 1 Then phi = dphi If d = 2 Then phi = pi - dphi If d = 3 Then phi = pi + dphi If d = 4 Then phi = 2 * pi - dphi signo = (alfa - phi) / Abs(alfa - phi) theta = ((phi - alfa) ^ 2) ^ 0.5 mvrel = (vrelx ^ 2 + vrely ^ 2) ^ 0.5 v2h = mvrel * (Cos(theta)) ^ 2 v2v = mvrel * Sin(theta) * Cos(theta) * signo v1h = mvrel * (Sin(theta)) ^ 2 v1v = -mvrel * Sin(theta) * Cos(theta) * signo v2xr = v2h * Cos(phi) - v2v * Sin(phi) v2yr = v2h * Sin(phi) + v2v * Cos(phi) v1xr = v1h * Cos(phi) - v1v * Sin(phi) v1yr = v1h * Sin(phi) + v1v * Cos(phi) B(c, 3) = vxv + v2xr B(c, 4) = vyv + v2yr B(a, 3) = vxv + v1xr B(a, 4) = vyv + v1yr Do While ((B(a, 1) - B(c, 1)) ^ 2 + (B(a, 2) - B(c, 2)) ^ 2) ^ 0.5 < 2 * R B(a, 1) = B(a, 1) + B(a, 3) * dt B(a, 2) = B(a, 2) + B(a, 4) * dt B(c, 1) = B(c, 1) + B(c, 3) * dt B(c, 2) = B(c, 2) + B(c, 4) * dt Loop nt = nt + 1 End If End If c = c + 1 Loop a = a + 1 Loop a = 1 Do Until a = n + 1 If B(a, 1) < R Then B(a, 1) = R - 1 End If If B(a, 1) > 10000 - R Then B(a, 1) = 10001 - R End If If B(a, 2) < R Then B(a, 2) = R End If If B(a, 2) > 10000 - R Then B(a, 2) = 10001 - R End If If CInt(t / 1000) = t / 100 Then dibujo.Refresh a = a + 1 Loop Text1(5) = np / t Text1(5).Refresh Text1(6) = nt / t Text1(6).Refresh Text1(4) = t Text1(4).Refresh t = t + 1 If t / 100 = Int(t / 100) Then Me.Refresh End If If t / deltat = Int(t / deltat) Then Call grafica End If Loop End Sub Public Sub grafica() n = CInt(Text1(0).Text) v = CSng(Text1(1).Text) R = CInt(Text1(2).Text) s = CInt(Text1(7).Text) deltat = CInt(Text1(8).Text) a = 1 Maxv = 0 Do Until a = n + 1 w = (B(a, 3) ^ 2 + B(a, 4) ^ 2) ^ 0.5 If w > Maxv Then Maxv = w a = a + 1 Loop a = 1 q = v / s Do Until a = 10001 E(a, 1) = 0 a = a + 1 Loop a = 1 Do Until a = n + 1 w = (B(a, 3) ^ 2 + B(a, 4) ^ 2) ^ 0.5 f = Int(w / q) + 1 If f > 1000 Then MsgBox "mas de 50 v", vbExclamation, "Atencion" Else E(f, 1) = E(f, 1) + 1 End If a = a + 1 Loop a = 1 maxE = 0 Do Until a = 10001 If E(f, 1) > maxE Then maxE = E(f, 1) a = a + 1 Loop salto = 5000 / maxE a = 1 inix = 11000 iniy = 12000 Do Until a = Int(Maxv * s / 10) + 1 Line (inix + (a - 1) * 100000 / Maxv / s, iniy - salto * E(a, 1))-(inix + a * 100000 / Maxv / s, iniy - salto * E(a + 1, 1)), &H0& a = a + 1 Loop End Sub
Código:Public B(10001, 9) As Double Public E(10001, 3) As Double Public Maxv As Double
es una base para los millones de mejoras posibles...
Visualiza el movimiento de los círculos de 2 dimensiones, menor cantidad mejor calidad,
para una cantidad de datos estimada, visualiza la frecuencia de distribución de velocidades de los círculos,
Y para mi satisfacción se parece a una distribución de Boltzman....
Calcula la cantidad de choques por unidad de tiempo como, una medida de presión y la cantidad de choques entre círculos como una medida de la temperatura
Estaria bueno poderlo colgar en la web , bajo un formato .asp con muy pequeñas modificaciones al código.
hasta ahor nunca subi un archivo que no fuera una imagen espero que lo puedan abrir y jugar un poco.boltzman.rar
- 4 gracias
Dejar un comentario:
-
Re: Software para choque de cuerpos y particulas
Gracias Mossy y Julian.
Aún no sé como empezar y si debo hacer una simulación o empezar con cálculos mas teóricos.
Imaginar que tengo tres cuerpos esféricos y que estos se bombardean desde todas direcciones del espacio por unas supuestas partículas de masa m y velocidad v,
podemos suponer que estas supuestas partículas son todas iguales en masa y velocidad pero provenientes de multitud de direcciones.
Al chocar estas partículas con nuestras tres esferas se producen choques con una componente elástica y otra plástica. Debido al efecto de sombra o apantallamiento
que ejercen nuestras tres esferas entre si, deberían producirse una fuerzas interactivas entre las tres esferas, algo parecido a lo que "Lesage" consideraba en su modelo.
No se si se entiende lo que acabo de explicar, pero si consideramos una de las tres esferas, a esta le chocan partículas desde todas las direcciones excepto desde las otras
dos esferas ya que le hacen de pantalla y esto se traduce en una fuerza de atracción entre esta esfera y las otras dos.
Este tipo de situaciones e interacciones son las que pretendo analizar. He empezado con dos esferas con algunos cálculos previos pero se me complica demasiado al pasar a tres esferas y por eso estoy pensando en simularlo con un modelo.
Gracias por vuestra ayuda.
Dejar un comentario:
-
Re: Software para choque de cuerpos y particulas
Alguien me puede recomendar que software utilizar para realizar algunas simulaciones de choque de esferas y partículas.
Podría ser para simular teoría cinética de los gases, choque de muchas esferas en movimiento etc.
No soy un programador avanzado pero he realizado programas básicos en Fortran, Basic, C++ etc.
Deberás considerar la probabilidad de los choques de las esferas o partículas siguiendo una función de distribución, dependiente de la energía, momento y el espacio, cuyos valores medios estarán a su vez en función del tipo de material, el medio y energías, momentos iniciales.
PD: para este tipo de simulaciones, olvidate de C, C++, Basic, etc. Te recomiendo un lengaje de alto nivel como python o matlab (así te olvidas de si un dato debe ser de 1, 2, 4 bytes, etc.. y codificarse como caracter, entero, real). Pero si sabes o has visto fortran, como dices, hechale un vistaso a penelope o fluka.
- 1 gracias
Dejar un comentario:
-
Re: Software para choque de cuerpos y particulas
Hola,
¿Cuál es el propósito? Es decir, si lo que quieres es obtener las propiedades físicas macroscópicas (presión, temperatura, calor específico, etc) a partir de seguir la evolución de las partículas entonces tienes dos métodos modernos: dinámica molecular y montecarlo.
El primero se basa en seguir posiciones y velocidades de las partículas, que interaccionan usualmente bajo el potencial de Lennard-Jones (hasta un cierto radio de corte, por temas de tiempo). El segundo consiste sólo en seguir las posiciones y luego hacer una estadística; simplemente se mueven las partículas aleatoriamente y se acepta o se rechaza el estado según si un número aleatorio es mayor o menor que la exponencial de Boltzmann.
Puedes encontrar más información de ambos métodos por internet. Yo te recomendaría empezar por dinámica molecular, aunque creo recordar que el montecarlo me iba bastante rápido (2h y algo para 250 millones de pasos). Respecto al lenguaje de programación, yo lo hice en Fortran; va muy bien y muy rápido.
Saludos
- 1 gracias
Dejar un comentario:
-
Software para choque de cuerpos y particulas
Alguien me puede recomendar que software utilizar para realizar algunas simulaciones de choque de esferas y partículas.
Podría ser para simular teoría cinética de los gases, choque de muchas esferas en movimiento etc.
No soy un programador avanzado pero he realizado programas básicos en Fortran, Basic, C++ etc.
Busco simular por ejemplo que tipo de fuerzas se producen en dos esferas que se encuentran en un entorno donde existe un bombardeo de particulas desde todas direcciones, algo parecido a si estuvieran en un recipiente con un gas.Etiquetas: Ninguno/a
Contenido relacionado
Colapsar
Dejar un comentario: