Anterior

Procedimiento numérico

Movimiento browniano en una dimensión. Simulación de la difusión

import java.util.*;
public class Sistema {
	final int nParticulas=500;
//posición
	double[] x;
//velocidad
	double[] v;
//tiempo
	int t;
//números aleatorios
	Random rnd=new Random();

public Sistema() {
	x=new double[nParticulas];
	v=new double[nParticulas];
	for(int i=0; i<nParticulas; i++){
		x[i]=0.0;
		v[i]=0.0;
	}
	t=0;
}
public void evolucion(){
	for(int i=0; i<nParticulas; i++){
		x[i]+=v[i];
		if((int)(10*rnd.nextDouble())!=9){
			v[i]*=0.9;
			if(rnd.nextDouble()>0.5){
				v[i]-=0.25;
			}else{
				v[i]+=0.25;
			}
		}
	}
	t++;
}
}

Movimiento browniano en dos dimensiones

import java.util.*;
public class Sistema {
//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;
//Posición de las partícula browniana
	public double X, Y;
//Velocidad de la partícula browniana
	double Vx, Vy;
//números aleatorios
	Random rnd=new Random();

public Sistema(double Vt, double Mb) {
	this.Vt=Vt;
	this.Mb=Mb;
//estado inicial
	X=0;
	Y=0;
	Vx=0;
	Vy=0;
}
public void evolucion(){
	double Ux, Uy, angulo, Wx, Wy;
	angulo=2*Math.PI*rnd.nextDouble();
	Ux=Vt*Math.cos(angulo);
	Uy=Vt*Math.sin(angulo);
	Wx=Vx-Ux; Wy=Vy-Uy;
	angulo=2*Math.PI*rnd.nextDouble();
	Vy+=(Mt/(Mt+Mb))*(Wy*(Math.cos(angulo)-1)+Wx*Math.sin(angulo));
	Vx+=(Mt/(Mt+Mb))*(Wx*(Math.cos(angulo)-1)-Wy*Math.sin(angulo));
	X+=Vx;
	Y+=Vy;
}
}
Anterior