
Procedimiento numérico
Integrales elípticas
Cálculo del campo magnético producido por un solenoide formado por N espiras iguales de radio a, separadas d, en un punto z, y.
El campo magnético producido por una espira de radio a, en un punto de coordenadas z, y. Siendo Z el eje de la espira es en términos de integrales elípticas.
Supongamos ahora que queremos calcular el campo magnético en el punto y, z producido por N espiras paralelas al plano XY y separadas una distancia d. De modo, que sus posiciones son z=j·d, j=0…N-1
public class Campo { public double Bz; public double By; public Campo(double Bz, double By) { this.Bz=Bz; this.By=By; } public double modulo(){ return Math.sqrt(Bz*Bz+By*By); } } public class MiCanvas extends Canvas { int nEspiras=4, nSeparacion=2; double radio=4.0; //.... Campo calculaCampo(double x, double y){ double Bz=0.0, By=0.0; double z, m; //, angulo, dist; double xIzq=x-(nEspiras-1)*nSeparacion/2; for(int i=0; i<nEspiras; i++){ z=xIzq+i*nSeparacion; m=4*radio*y/(radio*radio+z*z+y*y+2*radio*y); if(Math.abs(y)<0.01){ By+=0.0; Bz+=radio/Math.pow((z*z+radio*radio), 1.5); }else{ Bz+=(radio*m*Math.sqrt(2*m)*Eliptica.segunda(Math.PI/2, Math.sqrt(m)) |
Procedimiento de Simpson
El campo magnético producido por una espira de radio a, en un punto de coordenadas z, y. Siendo Z el eje de la espira es
Aplicamos el procedimiento de Simpson para obtener el valor de las integrales definidas
public class Campo { public double Bz; public double By; public Campo(double Bz, double By) { this.Bz=Bz; this.By=By; } public double modulo(){ return Math.sqrt(Bz*Bz+By*By); } } public abstract class Simpson { double z; double y; double radio; public Simpson(double radio){ this.radio=radio; } public void setPosicion(double z, double y){ this.z=z; this.y=y; } public double integral(double a, double b, int n){ if(n%2==1) n++; //n es par double h=(b-a)/n; double suma=f(a)+f(b); for(int i=1; i<n; i+=2){ suma+=4*f(a+i*h); } for(int i=2; i<n; i+=2){ suma+=2*f(a+i*h); } return (suma*h/3); } abstract public double f(double x); } public class Campo_Z extends Simpson{ public Campo_Z(double radio) { super(radio); } public double f(double angulo){ double dist=Math.sqrt(z*z+y*y+radio*radio-2*radio*y*Math.sin(angulo)); return((radio-y*Math.sin(angulo))/dist/dist/dist); } } public class Campo_Y extends Simpson{ public Campo_Y(double radio) { super(radio); } public double f(double angulo){ double dist=Math.sqrt(z*z+y*y+radio*radio-2*radio*y*Math.sin(angulo)); return(z*Math.sin(angulo)/dist/dist/dist); } } public class MiCanvas extends Canvas { int nEspiras=4, nSeparacion=2; final double radio=4.0; Campo_Z c_Z=new Campo_Z(radio); Campo_Y c_Y=new Campo_Y(radio); //.... Campo calculaCampo(double x, double y){ double Bz=0.0, By=0.0; double xp; double xIzq=x-(nEspiras-1)*nSeparacion/2; for(int i=0; i<nEspiras; i++){ xp=xIzq+i*nSeparacion; c_Z.setPosicion(xp, y); c_Y.setPosicion(xp, y); Bz+=c_Z.integral(-Math.PI/2, Math.PI/2, 50); By+=c_Y.integral(-Math.PI/2, Math.PI/2, 50); } return new Campo(Bz, By); } //... } |