Procedimiento numérico
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
Sea γ un número aleatorio uniformemente distribuido en el intervalo [0, 1)
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); } |