
Raíces múltiples
Cuerda homogénea con una cuenta
Calcula las raíces kL de las dos ecuaciones
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
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; } } } } //.... |
