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 } |
