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;
}
}
}
}
//....
|
