Anterior

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

x 0 C = 1 1 α 2 { 1 α 2 1 ln | 1 α 2 + ( 1 + α ) tan ( θ 0 / 2 ) 1 α 2 ( 1 + α ) tan ( θ 0 / 2 ) | + α sin θ 0 cos θ 0 α }

Configuración convexa

x 0 α d = 1 α 2 1 { 2 α 2 1 arctan ( α + 1 α 2 1 tan ( θ 0 2 ) ) + α sin θ 0 α cos θ 0 2 α 2 1 arctan ( α + 1 α 2 1 ) 1 }

x 0 d = 1 6 tan 3 ( θ 0 / 2 ) 1 2 tan ( θ 0 / 2 ) + 1 3

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))))
/(Math.sqrt(1-alfa*alfa)*(1-alfa*alfa)); C=1.0/(1-alfa*alfa); D=Math.log(Math.abs(((1+alfa)+Math.sqrt(1-alfa*alfa)
)/((1+alfa)-Math.sqrt(1-alfa*alfa)))) /(Math.sqrt(1-alfa*alfa)*(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)
)/(Math.sqrt(alfa*alfa-1)*(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
}
Anterior