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