
Funciones de Bessel
Raíces de una ecuación
Procedimiento del punto medio
Máximos y mínimos de difracción de auna abertura circular
- Los máximos secundarios de intensidad son los ceros de la función de Bessel J2(α).
- Los mínimos de intensidad son los ceros de la función de Bessel J1(α)
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 Bessel.bessj(2, x); } } public class Minimos extends Raiz { protected double f(double x){ return Bessel.bessj1(x); } 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]); } } } public class Bessel { public static 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*( |
Referencias
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. Código en C adaptado por el autor al lenguaje Java
