Anterior

Procedimiento numérico

Simulación de la sedimentación

import java.util.*;
public class Sistema {
	final int nParticulas=500;
//dimensiones de la región donde se mueven las partículas
	int ancho;
	int alto;
//masa de las partículas térmicas
	final double Mt=1.0;
//masa de las partículas brownianas
	double Mb;
//velocidad de las partículas térmicas
	double Vt;
//intervalo de tiempo
	final double dt=1.0;
//Fuerza externa
	double Fa;
//Posición de las partículas
	public double[] X, Y;
//Velocidades de las partículas
	double[] VX, VY;
//números al azar
	Random rnd=new Random();

public Sistema(double Vt, double Mb, double Fa, int eleccion, 
int ancho, int alto) { this.ancho=ancho; this.alto=alto; this.Vt=Vt; this.Mb=Mb; this.Fa=Fa; //estado inicial X=new double[nParticulas]; Y=new double[nParticulas]; VX=new double[nParticulas]; VY=new double[nParticulas]; for(int i=0; i<nParticulas; i++){ VY[i]=VY[i]=0; } //estado inicial switch(eleccion){ case 0: //arriba for(int i=0; i<nParticulas; i++){ Y[i]=0; } break; case 1: //abajo for(int i=0; i<nParticulas; i++){ Y[i]=alto; } break; case 2: //en medio for(int i=0; i<nParticulas; i++){ Y[i]=alto/2; } break; case 3: //al azar for(int i=0; i<nParticulas; i++){ Y[i]=(int)(alto*rnd.nextDouble()); } break; default: break; } //distribución al azar en el eje horizontal for(int i=0; i<nParticulas; i++){ X[i]=(int)(ancho*rnd.nextDouble()); } } public void evolucion(){ double Ux, Uy, angulo; for(int i=0; i<nParticulas; i++){ angulo=2*Math.PI*rnd.nextDouble(); Ux=VX[i]-Vt*Math.sin(angulo); Uy=VY[i]-Vt*Math.cos(angulo); angulo=2*Math.PI*rnd.nextDouble(); VY[i]+=(Mt/(Mt+Mb))*(Uy*(Math.cos(angulo)-1)-Ux*Math.sin(angulo))+Fa*dt; VX[i]+=(Mt/(Mt+Mb))*(Ux*(Math.cos(angulo)-1)+Uy*Math.sin(angulo)); X[i]+=VX[i]*dt; Y[i]+=VY[i]*dt; //condiciones de contorno if(X[i]<0){ X[i]=-X[i]; VX[i]=-VX[i]; } if(X[i]>ancho){ X[i]=2*ancho-X[i]; VX[i]=-VX[i]; } if(Y[i]<0){ Y[i]=-Y[i]; VY[i]=-VY[i]; } if(Y[i]>alto){ Y[i]=2*alto-Y[i]; VY[i]=-VY[i]; } } } }

Anterior