 
	Procedimiento numérico
	En esta página, se utilizan los siguienets procedimientos numéricos: el método de Montecarlo, y la integral definida por el método de Simpson.
	Supondremos que sobre la pantalla hay detectores de anchura Δx. La probabilidad de que un fotón impacte en un detector (en color rojo) situado en la posición x es proporcional al área bajo la curva de la intensidad I, debida a la difracción de la luz por la rendija de anchura b, el área sombreada de color azul claro.
	
	
	La constante c se determina de modo que la suma de todas las probabilidades p(x) debe ser la unidad
	
	
      
        | public class Difraccion {
	 double[] prob;       //array de probabilidades en cada detector
	 double d;		//distancia de la rendija a la pantalla
	 double r;		//apertura :relación anchura de la rendija/longitud de onda
      int N;   		     //número de detectores
      double area;	     //área bajo la curva de la intensidad
      static final int INFINITO=24;
//generador de números aleatorios
     Random rnd=new Random();
  public Difraccion(int _N, double d, double r) {
//N es un número par
//el número de detectores es impar de 0 a N ambos inclusive
//N/2 es el detector central
	this.N=_N;
	if (_N%2==1) 	this.N=_N+1;
	this.d=d;
	this.r=r;
	prob=new double[N+1];
	area=0.0;
//cálculo de los elementos de los arrays
	if(N/2<INFINITO){
		double probAux[]= new double[INFINITO];
		probAux[0]=integral(0.0, 0.5, 10);
		for(int i=1; i<INFINITO; i++){
			probAux[i]=integral(i-1+0.5, i+0.5, 20);
          }
		for(int i=0; i<INFINITO; i++){
			area+=2*probAux[i];
          }
		prob[N/2]=2*probAux[0]/area;
		for(int i=0; i<N/2; i++){
			prob[i]=prob[N-i]=probAux[N/2-i]/area;
          }
//probabilidad acumulada
		for(int i=1; i<=N; i++){
			prob[i]+=prob[i-1];
          }
	}
  }
double f(double x) {
	double u=Math.PI*r*x/Math.sqrt(x*x+d*d);
//límite de sen(x)/x cuando x tiende a cero
	if(u==0){
		return 1;
     }
	double y=(Math.sin(u)*Math.sin(u))/(u*u);
	return y;
}
//método de Simpson
double integral(double a, double b, int n){
	//n debe de ser par
	double h=(b-a)/n;
	double s=f(a)+f(b)+4*f(b-h);
	for(int i=1; i<n-2; i+=2){
		s=s+4*f(a+i*h)+2*f(a+(i+1)*h);
     }
	return s*h/3;
}
int sorteo(){
	//número aleatorio comprendido entre 0 y 1
     double azar=rnd.nextDouble();
	for(int i=0; i<=N; i++){
		if(azar<prob[i]){
			return i;    //dentro de la pantalla
          }
     }
	return (N+1);	//fuera de la pantalla
 }
}
 | 
    
	
	