Irekigune laukizuzenak eta zirkularrak sortutako difrakzioa,  Fraunhofer-en baldintzetan

prev.gif (1231 bytes)home.gif (1232 bytes)next.gif (1211 bytes)

Uhinak

Interferentzia 
eta difrakzioa
Quincke-ren hodia
Uhinen interferentzia
bi iturrirekin (I)
Uhinen interferentzia
bi iturrirekin (II)
Uhinen interferentzia
zenbait iturrirekin
Zirrikitu lineal batek
sortutako difrakzioa
Interferentzia 
gehi difrakzioa
marca.gif (847 bytes)Difrakzioa, irekigune
laukizuzenarekin
eta zirkularrarekin
Fresnelen difrakzioa
Irekigune laukizuzenak sortutako difrakzioa

Irekigune zirkularrak sortutako difrakzioa

Erreferentziak

Programazio-kodea

 

Aurreko orri batean aztertzen da zirrikitu lineal batek sortutako difrakzioa (estua eta luzea), Fraunhofer-en baldintzetan.

Fraunhofer-ek garatutako teorian, uhinek zirrikitua erasotzen dute zirrikituaren planoarekiko perpendikularki, eta behatzailea oso urruti kokatzen da oztopoaren neurriekin konparatuta.

Honako orri honetan, berriz, Fraunhofer-en baldintzatan jarraituko dugu, baina irekigunearen forma laukizuzena edota zirkularra izango da.

Intentsitate erresultantearen formulak lortzeko garapen matematikoa kurtso honen mailatik gora dago, eta erreferentzietan aipatzen den liburuan datoz zehazki azalduta.

Aurreko kapituluetako programetan bezalaxe, pixel bakoitzari dagokion intentsitate erresultantea gris-eskalan kodetu dugu, honelako irizpidearekin:

  • Kolore zuria intentsitate maximoa bada.

  • Kolore beltza intentsitate nulua bada.

  • Intentsitate ertainak gris-eskalako kolore batez adierazi dira, zuria eta beltzaren artean.

Kapitulu honetako bi programetan oztopoaren argazki bat simulatzen da, betiere esposizio-denbora luzeaz, horrela xehetasun ahulenak ere indartu eta bereizi ahal izateko.

Intentsitaterako unitate gisa, I(0) hartzen da, jatorrian lortzen den intentsitate erresultantea, alegia, intentsitate maximoa, eta gainontzeko pixelei gris-eskala honela aplikatzen zaie:

  • Kolore zuria, intentsitatea 0.01 baino handiagoa bada.

  • Kolore beltza, intentsitate nulua bada.

  • Gris-eskalako kolore bat, zuria eta beltzaren artean, intentsitatea 0 eta 0.01 artekoa bada.

 

Irekigune laukizuzenak sortutako difrakzioa

Irudiak irekigunea erakusten du, a eta b aldeetako laukizuzena, eta oztopo horretatik R distantziara, pantaila batean, P puntuaren posizioak x eta y koordenatuak ditu. Uhinak ezkerretik erasotzen du.

Hona hemen pantailara iritsiko den I(x, y) intentsitate erresultantearen adierazpena, P puntuaren posizioaren menpe eta uhinaren λ uhin-luzeraren menpe:

I(0), pantailako jatorrira iristen den intentsitatea da, alegia, x=0, y=0 posizioan.

Saiakuntza

Aukeran idatz daiteke:

  • b aldearen luzera, dagokion kontrolean idatziz.

  • a aldearen luzera, berriz, finkotzat hartu da, a=1.0

Irudia botoia klikatu.

 

Irekigune zirkularrak sortutako difrakzioa

Irudiak irekigunea erakusten du, a erradiodun zirkulua, eta oztopo horretatik R distantziara, pantaila batean, P puntuaren posizioak x eta y koordenatuak ditu. Uhinak ezkerretik erasotzen du. Zirkuluaren zentroa eta P puntua lotzen dituen zuzenak Z ardatzarekin θ angelua osatzen du.

Hona hemen pantailara iritsiko den I(θ) intentsitate erresultantearen adierazpena, P puntuaren θ posizio angeluarraren menpe eta uhinaren λ uhin-luzeraren menpe:

I(0), pantailako jatorrira iristen den intentsitatea da, alegia, θ=0 posizioan.

Jn(α) Bessel-en funtzioa da, n ordenakoa.

Maximo eta minimoak

  • Intentsitate maximoak lortzen dira honako baldintzarekin:

Bessel-en funtzioek errekurrentzia-erlazio bat betetzen dute:

Erlazio hori aplikatzen badiogu lehen ordenako Bessel-en funtzioari, J1(α)

Ikusten denez, intentsitatearen maximo sekundarioak lortzen dira J2(α) Bessel-en bigarren ordenako funtzioaren "zeroetan".

J2(α)=0

  • Bestalde, intentsitatearen minimoak lortzen dira J1(α) Bessel-en funtzioaren "zeroetan".

J1(α)=0

Izatez, J1(α) funtzioak zero bat dauka α=0 posizioan, baina salbuespena da, zeren puntu hori maximo bat da, limitean honakoa lortzen delako:

Ondoko taulak Bessel-en J1(x) eta J2(x) funtzioen lehen zeroak ematen ditu

J1(x)

 J2(x)

3.8317

5.1356

7.0156

8.4172

10.1735

11.6198

13.3237

14.7960

16.4706

17.9598

196159

21.1170

22.7601

24.2701

25.9037

27.4206

29.0468

30.5692

32.1897

33.7165

Jatorria: Puig Adam P., Curso teórico-práctico de ecuaciones diferenciales aplicado a la Física y Técnica. Biblioteca Matemática (1950) 156 or.

 

Saiakuntza

Irudia botoia klikatu.

 

 

Erreferentziak

Hecht E., Zajac A. Óptica. Addison-Wesley Iberoamericana (1977), pp. 369-379

Press W. H., Teukolsky S. A., Vetterling W. T., Flannery B. P. Numerical Recipes in C, Second edition,  Special functions. Bessel functions of integer order  Chapter 6º. pp. 230. Cambridge University Press. Autoreak programazio-kodea C lengoaiatik Java lengoaiara egokitu du

 

Programazio-kodea

public abstract class Raiz {
	private final double CERO=1e-10;
	private final double ERROR=0.0001;
	private final int MAXITER=100;
	protected final int MAXRAICES=20;
	protected double raices[]=new double[MAXRAICES];
	protected int iRaiz=0;

protected double puntoMedio(double a, double b)throws RaizExcepcion{
	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){
		throw new RaizExcepcion("No se ha encontrado una raíz");
	}
	return m;
}

private void explorar(double xIni, double xFin, double dx){
	double y1, y2;
	iRaiz=0;
	y1=f(xIni);
	for(double x=xIni; x<xFin; x+=dx){
		y2=f(x+dx);
//Uno de los extremos del intervalo es raíz
		if(Math.abs(y1)<CERO && iRaiz<MAXRAICES){
			raices[iRaiz++]=x;
			y1=y2;
			continue;
		}
//no hay raíz en este intervalo
		if(y1*y2>=0.0){
			y1=y2;
			continue;
		}
//hay una raíz en este intervalo
		if(iRaiz<MAXRAICES){
			try{
				raices[iRaiz]=puntoMedio(x, x+dx);
				iRaiz++;
			}catch(RaizExcepcion ex){
				System.out.println(ex.getMessage());
			}
		}
		y1=y2;
	}
}

public double[] hallarRaices(double ini, double fin, double paso){
	explorar(ini, fin, paso);
	double solucion[]=new double[iRaiz];
	for(int i=0; i<iRaiz; i++){
		solucion[i]=(double)Math.round(raices[i]*1000)/1000;
	}
	return solucion;
}

abstract protected double f(double x);
}

class RaizExcepcion extends Exception {
	public RaizExcepcion(String s) {
	super(s);
}
}
public class Maximos extends Raiz {

protected double f(double x){
	return bessj1(x);
}

private double bessj1(double x){
//Returns the Bessel function J1(x) for any real x.
	double ax,z;
	double xx,y,ans,ans1,ans2; //Accumulate polynomials in double precision.
	if ((ax=Math.abs(x)) < 8.0) { //Direct rational approximation.
		y=x*x;
		ans1=x*(72362614232.0+y*(-7895059235.0+y*(242396853.1+y*(-2972611.439+
			y*(15704.48260+y*(-30.16036606))))));
		ans2=144725228442.0+y*(2300535178.0+y*(18583304.74+y*(99447.43394+y*(376.9991397+y*1.0))));
		ans=ans1/ans2;
	} else { //Fitting function (6.5.9).
		z=8.0/ax;
		y=z*z;
		xx=ax-2.356194491;
		ans1=1.0+y*(0.183105e-2+y*(-0.3516396496e-4+y*(0.2457520174e-5+y*(-0.240337019e-6))));
		ans2=0.04687499995+y*(-0.2002690873e-3+y*(0.8449199096e-5+
		y*(-0.88228987e-6+y*0.105787412e-6)));
		ans=Math.sqrt(0.636619772/ax)*(Math.cos(xx)*ans1-z*Math.sin(xx)*ans2);
		if (x < 0.0) ans = -ans;
	}
	return ans;
}
}
public class Minimos extends Raiz {

protected double f(double x){
	return bessj0(x);
}

private double bessj0(double x){
//Returns the Bessel function J0(x) for any real x.
	double ax,z;
	double xx,y,ans,ans1,ans2; //Accumulate polynomials in double precision.
	if ((ax=Math.abs(x)) < 8.0) { //Direct rational function t.
		y=x*x;
		ans1=57568490574.0+y*(-13362590354.0+y*(651619640.7+y*(-11214424.18+y*(77392.33017+
		y*(-184.9052456)))));
		ans2=57568490411.0+y*(1029532985.0+y*(9494680.718+y*(59272.64853+y*(267.8532712+y*1.0))));
		ans=ans1/ans2;
	} else { //Fitting function (6.5.9).
		z=8.0/ax;
		y=z*z;
		xx=ax-0.785398164;
		ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.2093887211e-6)));
		ans2 = -0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+
		y*(0.7621095161e-6-y*0.934935152e-7)));
		ans=Math.sqrt(0.636619772/ax)*(Math.cos(xx)*ans1-z*Math.sin(xx)*ans2);
	}
	return ans;
}
}
public class Difraccion {

public static void main(String[] args) {
	double[] raices=new Maximos().hallarRaices(0.0, 30.0, 1.0);
	System.out.print("Máximos");
	for(int i=0; i<raices.length; i++){
		System.out.print(" "+raices[i]);
	}
	System.out.println("");
	raices=new Minimos().hallarRaices(0.0, 30.0, 1.0);
	System.out.print("Mínimos");
	for(int i=0; i<raices.length; i++){
		System.out.print(" "+raices[i]);
	}
}
}