Anterior

Raíces múltiples

Procedimiento del punto medio

Cuerda homogénea con una cuenta

Calcula las raíces kL de las dos ecuaciones

F 1 (kL)=sin(kL)=0 F 2 (kL)=p·sin(kL)2cos(kL)=0p= M m kL

public class MiCanvas extends Canvas {
//parámatros
     double  masa=1.0;     
     int iModo=1;
     double[] raices=new double[6];
     double k;  //número de onda
     int signo=1;
     final double v=1.0; //velocidad de propagación
// raíces de una ecuación trascendente.punto medio
	final double CERO=1e-10;
	final double ERROR=0.001;
	final int MAXITER=200;

  void setNuevo(double masa){
     this.masa=masa;
     explorar(0.0, 100, 1.0);
     t=0.0;
     iModo=1;
     k=raices[0];
     signo=-1;
  }
  void  setModo (int iModo){
      this.iModo=iModo;
      if(iModo%2==0){
          k=iModo*Math.PI/2;
          signo=1;
      }else{
        k=raices[iModo/2];
        signo=-1;
      }
  }

void explorar(double xIni, double xFin, double dx){
        double y1, y2;
	    int iRaiz=0;
        y1=f(xIni);
        for(double x=xIni; x<xFin; x+=dx){
            y2=f(x+dx);
//uno de los extremos del intervalo es raíz
            if(Math.abs(y1)<CERO && iRaiz<raices.length){
                raices[iRaiz++]=x;
                y1=y2;
                continue;
            }
//no hay raíz en este intervalo
            if(y1*y2>=0.0){
                y1=y2;
                continue;
            }
//hay una raíz en este intervalo
            if(iRaiz<raices.length){
                    raices[iRaiz]=puntoMedio(x, x+dx);
                    iRaiz++;
            }else
              return;
            y1=y2;
        }
    }

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);
	if(iter==MAXITER){
		System.out.println("No se ha encontrado la raiz");
	}
	return m;
}
double f(double x){
	double y=masa*x*Math.sin(x)-2*Math.cos(x);
	return y;
}

Cuerda homogénea con dos cuentas

Calcula las raíces kL de las tres ecuaciones y las ordena de menor a mayor

F 1 (kL)=sin(kL)=0 F 2 (kL)=p·sin(kL)2cos(kL)1=0 F 3 (kL)=p·sin(kL)2cos(kL)+1=0

public class MiCanvas extends Canvas {
//parámatros
     double  masa=1.0;      
     int iModo=1;
     double[] raices=new double[3];
     double[] k=new double[9];  //número de onda
     int[] tipo=new int[9];
     final double v=1.0; //velocidad de propagación
     int termino=-1;
// raíces de una ecuación trascendente.punto medio
	final double CERO=1e-10;
	final double ERROR=0.001;
	final int MAXITER=200;

  void setNuevo(double masa){
     this.masa=masa;
     termino=-1;
     explorar(0.0, 100, 1.0);
    for (int i=0; i<raices.length; i++){
        k[i]=raices[i];
        tipo[i]=2;
    }
     termino=1;
     explorar(0.0, 100, 1.0);
     for (int i=0; i<raices.length; i++){
        k[i+raices.length]=raices[i];
        tipo[i+raices.length]=3;
     }
     for(int i=0; i<raices.length; i++){
        k[2*raices.length+i]=(i+1)*Math.PI;
        tipo[2*raices.length+i]=1;
     }
     ordenar();
     iModo=1;
  }
 
  void  setModo (int iModo){
      this.iModo=iModo;
  }

void explorar(double xIni, double xFin, double dx){
        double y1, y2;
	    int iRaiz=0;
        y1=f(xIni);
        for(double x=xIni; x<xFin; x+=dx){
            y2=f(x+dx);
//uno de los extremos del intervalo es raíz
            if(Math.abs(y1)<CERO && iRaiz<raices.length){
                raices[iRaiz++]=x;
                y1=y2;
                continue;
            }
//no hay raíz en este intervalo
            if(y1*y2>=0.0){
                y1=y2;
                continue;
            }
//hay una raíz en este intervalo
            if(iRaiz<raices.length){
                    raices[iRaiz]=puntoMedio(x, x+dx);
                    iRaiz++;
            }else
              return;
            y1=y2;
        }
    }

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);
	if(iter==MAXITER){
		System.out.println("No se ha encontrado la raiz");
	}
	return m;
}
double f(double x){
	double y=masa*x*Math.sin(x)-2*Math.cos(x)+termino;
	return y;
}

void ordenar(){
        double aux;
        int temp;
        for(int i=0; i<k.length-1; i++){
            for(int j=i+1; j<k.length; j++){
                if(k[i]>k[j]){
                    aux=k[j]; temp=tipo[j];
                    k[j]=k[i]; tipo[j]=tipo[i];
                    k[i]=aux;  tipo[i]=temp;
                }
            }
        }
    }
//....
Anterior