Anterior

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.

m= 4ay a 2 + z 2 + y 2 +2ay B y = μ 0 i 2π a (2ay) 3/2 z( 2m K(m)+ 2m 22m 2m E(m)   ) B z = μ 0 i 2π a (2ay) 3/2 ( a m 22m 2m E(m)+y 2m K(m)y 2m 22m 2m E(m) )

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

m j = 4ay a 2 + (zj·d) 2 + y 2 +2ay B y = j=0 N1 μ 0 i 2π a (2ay) 3/2 (zj·d)( 2 m j K( m j )+ 2 m j 22 m j 2 m j E( m j )   ) B z = j=0 N1 μ 0 i 2π a (2ay) 3/2 ( a m j 22 m j 2m j E( m j )+y 2 m j K( m j )y 2 m j 22 m j 2 m j E( m j ) )

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))
/(2-2*m)+y*Math.sqrt(2*m)*Eliptica.primera(Math.PI/2, Math.sqrt(m))
-y*(2-m)*Math.sqrt(2*m)*Eliptica.segunda(Math.PI/2, Math.sqrt(m))/(2-2*m))
/(Math.PI*2*y*radio*Math.sqrt(2*radio*y)); By+=z*(-Math.sqrt(2*m)*Eliptica.primera(Math.PI/2, Math.sqrt(m))+
(2-m)*Math.sqrt(2*m)*Eliptica.segunda(Math.PI/2, Math.sqrt(m))/(2-2*m))
/(Math.PI*2*radio*y*Math.sqrt(2*radio*y)); } } return new Campo(Bz, By); } //....

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

B y = μ 0 2π i·a·z π/2 π/2 sinφ ( a 2 + z 2 + y 2 2aysinφ ) 3/2 dφ B z = μ 0 2π i·a π/2 π/2 ay·sinφ ( a 2 + z 2 + y 2 2aysinφ ) 3/2 dφ

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);
 }
 //...
 }

 

Anterior