[ Foro de C++ ]

Colisiones de esferas duras

08-Dec-2019 20:41
Invitado (Ainhoa)
0 Respuestas

Buenas noches a todos,

Soy bastante nueva en el mundo de C++. Necesito hacer un programa en el que un número N de esferas duras (partículas) choquen entre ellas y contra las paredes. Las colisiones deben ser elásticas por lo que no tiene que haber ningún tipo de pérdida de energía cinética en dichas colisiones.

El programa que he escrito para calcular las posiciones es el siguiente, donde N es el número de partículas de radio R que hay en una caja (2D) de lado L y Tmax es el tiempo máximo durante el cual observamos el movimiento de las partículas.

Las funciones coord() y phii() son dos funciones definidas en el código en las que obtengo un valor aleatorio que me permite dar coordenadas aleatorias a cada partícula y un ángulo para calcular la velocidad de cada una de ellas aleatorio también.

for (int i = 0; i < N; i++) {
x[i] = coord();
y[i] = coord();
double phii = phi();
Vx[i] = modulovelocidad*cos(phii);
Vy[i] = modulovelocidad*sin(phii);


/*Colisión con las paredes*/
for (int t = 1; t < Tmax; t++) {
x1[0] = x[i];
y1[0] = y[i];
x1[t] = x1[t-1] + Vx[i]*dt;
y1[t] = y1[t-1] + Vy[i]*dt;

if (x1[t] < R) {
Vx[i] = -Vx[i];
x1[t] = 2*R - x1[t];
pi = pi+1;
}
if (x1[t] > (L-R)) {
Vx[i] = -Vx[i];
x1[t] = 2*(L-R) - x1[t];
pi = pi+1;
}
if (y1[t] < R) {
Vy[i] = -Vy[i];
y1[t] = 2*R - y1[t];
pi = pi+1;
}
if (y1[t] > (L-R)) {
Vy[i] = -Vy[i];
y1[t] = 2*(L-R) - y1[t];
pi = pi+1;
}


//Collision entre partículas
for (int j = 1+t; j < N; j++) {
double rij = sqrt(pow(x1[t]-x1[j],2)+pow(y1[t]-y1[j],2)); //Distancia entre dos partículas
if (rij <= 2*R) { //Si la distance es inferior a dos radios, las partículas chocarán entre ellas.
Vx[t] = Vx[j];
Vy[t] = Vy[j];
Vx[j] = Vx[t];
Vy[j] = Vy[t];

}

}

Creo que uno de mis errores es que debería invertir los bucles for de i y de t pero no he conseguido hacerlo bien.

Agradecería muchísimo cualquier tipo de ayuda que me hiciese salir de este bucle de dudas infinito del que no puedo salir.

Muchísimas gracias,
Ainhoa




Si ya eres usuario del sistema, puedes contestar desde tu cuenta y así ganar prestigio.

Si sólo eres un visitante, puedes optar por...