
Procedimiento numérico
Procedimiento del punto medio
La posición del extremo de la cuerda es x0 se obtiene la ecuacón trascendente en θ0.
Configuración cóncava
Configuración convexa
- Cuando α=1
public abstract class Raiz { private final double CERO=1e-10; private final double ERROR=0.001; private final int MAXITER=200; public Raiz(double alfa, double x0, double lon) { this.alfa=alfa; this.x0=x0; this.lon=lon; } protected double puntoMedio(double a, double b) { 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); return m; } protected abstract double f(double x); } public abstract class Sistema extends Raiz { //parámetros comunes a todas las clases derivadas protected double alfa; protected double x0; protected double lon=2.0; protected double fi0; public double yMin; public double lonY; protected double con; public Sistema(double alfa, double x0, double lon) { this.alfa=alfa; this.x0=x0; this.lon=lon; } public abstract void inicio(); public abstract double fX(double x); //funciones comunes a las clases //calcula la ordenada de la curva protected double fY(double x){ double y=1.0/(Math.cos(x)-alfa)-1.0/(Math.cos(fi0)-alfa); return (con*y); } //transforma la ordenada en ángulo fi public double fAngulo(double y){ double z=alfa+1.0/(y/con+1.0/(Math.cos(fi0)-alfa)); return Math.acos(z); } } public class Concava extends Sistema{ private double A, B; public Concava(double alfa, double x0, double lon) { super(alfa, x0, lon); lonY=0.0; } //raíces de la ecuación trascendente calcula fi0 protected double f(double x){ coeficientes(x); double y=A*(lon*alfa-x0)+B*(lon-x0*alfa); return y; } public void inicio(){ double fiMax=2*Math.atan(Math.sqrt((1-alfa)/(1+alfa))); fi0=puntoMedio(0.0, fiMax); //System.out.println((fi0*180/Math.PI)+" "+(fiMax*180/Math.PI)); con=fConstante(fi0); yMin=fY(0.0); } //calcula la constante C private double fConstante(double x){ coeficientes(x); double y=x0/(A*alfa+B); return y; } //calcula la abscisa de la curva public double fX(double x){ coeficientes(x); double y=con*(A*alfa+B); return y; } //función auxiliar común a varios miembros private void coeficientes(double x){ A=Math.sin(x)/((Math.cos(x)-alfa)*(1-alfa*alfa)); B=Math.log(Math.abs(((1+alfa)*Math.tan(x/2)+Math.sqrt(1-alfa*alfa))/ ((1+alfa)*Math.tan(x/2)-Math.sqrt(1-alfa*alfa)))) /(Math.sqrt(1-alfa*alfa)*(1-alfa*alfa)); } } public class Convexa_1 extends Sistema { private double A, B, C, D; public Convexa_1(double alfa, double x0, double lon) { super(alfa, x0, lon); } //raíces de la ecuación trascendente calcula fi0 protected double f(double x){ coeficientes(x); double y=A*(-x0+lon*alfa)+(lon-x0*alfa)*(B+C-D); return y; } public void inicio(){ double fiMax=2*Math.atan(Math.sqrt((1-alfa)/(1+alfa))); fi0=puntoMedio(Math.PI/2, fiMax); lonY=fMin_Y(fi0); yMin=fY(Math.PI/2); //System.out.println((fi0*180/Math.PI)+" "+yMin); } //calcula la longitud de la parte inferior de la cuerda que está pegada private double fMin_Y(double x){ coeficientes(x); double y=-x0/(alfa*(alfa*A+B+C-D)); return y; } //calcula la abscisa de la curva public double fX(double x){ coeficientes(x); double y=-alfa*lonY*(alfa*A+B+C-D); return y; } //función auxiliar común a varios miembros private void coeficientes(double x){ A=Math.sin(x)/((Math.cos(x)-alfa)*(1-alfa*alfa)); B=Math.log(Math.abs(((1+alfa)*Math.tan(x/2)+Math.sqrt(1-alfa*alfa)) /((1+alfa)*Math.tan(x/2)-Math.sqrt(1-alfa*alfa)))) public class Convexa_2 extends Sistema { private double A, B, C, D; public Convexa_2(double alfa, double x0, double lon) { super(alfa, x0, lon); } //raíces de la ecuación trascendente calcula fi0 protected double f(double x){ coeficientes(x); double y=A*(-x0+lon*alfa)+(x0*alfa-lon)*(-B+C+D); return y; } public void inicio(){ fi0=puntoMedio(Math.PI/2, 0.0); lonY=fMin_Y(fi0); yMin=fY(Math.PI/2); //System.out.println((fi0*180/Math.PI)+" "+yMin); } //calcula la longitud de la parte inferior de la cuerda que está pegada private double fMin_Y(double x){ coeficientes(x); double y=x0/(-A*alfa-B+C+D); return y; } //calcula la abscisa de la curva public double fX(double x){ coeficientes(x); double y=lonY*(-alfa*A-B+C+D); return y; } //función auxiliar común a varios miembros private void coeficientes(double x){ A=alfa*Math.sin(x)/((alfa-Math.cos(x))*(alfa*alfa-1)); B=2*alfa*Math.atan((alfa+1)*Math.tan(x/2)/Math.sqrt(alfa*alfa-1)) /(Math.sqrt(alfa*alfa-1)*(alfa*alfa-1)); C=alfa/(alfa*alfa-1); D=2*alfa*Math.atan((alfa+1)/Math.sqrt(alfa*alfa-1) public class Convexa_3 extends Sistema { public Convexa_3(double x0, double lon) { super(1.0, x0, lon); } //raíces de la ecuación trascendente calcula fi0 protected double f(double x){ double A=Math.tan(x/2); double y=(lon-x0)/(6*A*A*A)-(lon+x0)/(2*A)+(lon-x0)/3; return y; } public void inicio(){ fi0=puntoMedio(Math.PI/2, 0.0); lonY=fMin_Y(fi0); yMin=fY(Math.PI/2); //System.out.println((fi0*180/Math.PI)+" "+yMin); } //calcula la longitud de la parte inferior de la cuerda que está pegada private double fMin_Y(double x){ double A=Math.tan(x/2); double y=1.0/3+1.0/(6*A*A*A)-1.0/(2*A); return (x0/y); } //calcula la abscisa de la curva public double fX(double x){ double A=Math.tan(x/2); double y=1.0/3+1.0/(6*A*A*A)-1.0/(2*A); return (lonY*y); } } public class Principal { Sistema obj; final double lon=2.0; //mitad de la longitud de la cuerda //función que crea los objetos de las distintas clases dependiendo del valor de //parámetro alfa y del cociente x0/L. void nuevo(double alfa, double cociente){ if(alfa==1.0){ obj=new Convexa_3(cociente*lon, lon); }else if(alfa<1.0 && alfa<cociente){ obj=new Concava(alfa, cociente*lon, lon); }else if(alfa<1.0){ obj=new Convexa_1(alfa, cociente*lon, lon); }else{ obj=new Convexa_2(alfa, cociente*lon, lon); } obj.inicio(); } //representación gráfica } |
