Anterior

Procedimiento numérico

Método de Montecarlo

Gas ideal unidimensional

En esta página, se comentan los pasos esenciales para crear la simulación que describe los choques de las moléculas de un gas unidimensional con un cuerpo .

La distribución de los módulos de las velocidades de las moléculas es

dn N =2 m 2πkT exp( m v 2 2kT )dv

Sea γ un número aleatorio uniformemente distribuido en el intervalo [0, 1)

γ=2 m 2πkT 0 v exp( m v 2 2kT )dv γ= 2 π 0 t exp( t 2 )dt t= v 2kT m γ=erf(t)

Dado γ, se calcula t aplicando el procedimiento numérico del punto medio y posteriormente, el módulo v de la velocidad de la molécula.

erf(x) se denomina integral de los errores

Su sentido se determina del siguiente modo:

La partícula tiene la misma probabilidad de dirigirse hacia la izquierda v (negativa) que hacia la derecha v (positiva)

    for(int i=0; i<x.length; i++){
        gamma=Math.random();
        v[i]=Math.sqrt(2)*puntoMedio(0.0, 5.0);
        if(Math.random()<0.5){
            v[i]=-v[i];
        }
public class MiCanvas extends Canvas {
      double t;
      final double dt=0.01;
      double gamma;
      double[] x0=new double[150];
      double[] t0=new double[150];
      double[] x=new double[150];
      double[] v=new double[150];
      boolean[] bChoque=new boolean[150];
      int[] y=new int[150];
      double xP;
      double vP;
      double xIni;
      double tChoque;
      final double M=100.0;
//raíz punto medio
	final double CERO=1e-10;
	final double ERROR=0.001;
	final int MAXITER=200;
 
  void setNuevo(double vP){    
     this.vP=vP;
     for(int i=0; i<x.length; i++){
        gamma=Math.random();
        v[i]=Math.sqrt(2)*puntoMedio(0.0, 5.0);
        if(Math.random()<0.5){
            v[i]=-v[i];
        }
        t0[i]=0.0;
        x[i]=x0[i]=-10.0+20.0*Math.random();
        y[i]=orgY-2*i;
        bChoque[i]=false;
     }
     t=0.0;
     tChoque=0.0;
     xP=xIni=0.0;
  }

  void mover(){
      t+=dt;
      xP=xIni+vP*(t-tChoque);
      for(int i=0; i<x.length; i++){
          x[i]=x0[i]+v[i]*(t-t0[i]);
          if(((x0[i]<xP & x[i]>xP)||(x0[i]>xP &x[i]<xP))& !bChoque[i]){ //choque
                double u1=v[i];
                double u2=vP;
                bChoque[i]=true;
                v[i]=((1-M)*u1+2*M*u2)/(1+M);
                vP=(2*u1+(M-1)*u2)/(1+M);
                t0[i]=t;
                x0[i]=xP;
                xIni=xP;
                tChoque=t;
          }
      }
      if(xP>5.0) parent.hilo.putMsg(Hilo.PAUSE);
      repaint();
  }

double erfcc(double x)  {
    double t,z,ans;
    z=Math.abs(x);
    t=1.0/(1.0+0.5*z);
    ans=t*Math.exp(-z*z-1.26551223+t*(1.00002368+t*(0.37409196+t*(0.09678418+
        t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+
        t*(-0.82215223+t*0.17087277)))))))));
        return x >= 0.0 ? ans : 2.0-ans;
}

double puntoMedio(double a, double b) {
	double m, ym;
	int iter=0;
	do{
		m=(a+b)/2;
		ym=f(m);
		if(Math.abs(ym)<CERO) break;
		if(Math.abs((a-b)/m)<ERROR) break;

		if((f(a)*ym)<0) b=m;
		else a=m;
		iter++;
	}while(iter<MAXITER);
	if(iter==MAXITER){
		System.out.println("No se ha encontrado la raíz");
	}
	return m;
}

double f(double x){
	return (1.0-erfcc(x)-gamma);
} 

 

Anterior