Procedimientos numéricos
Raíces de una ecuación
Resolver la ecuación trascendente
|gsinθ-ω2Rsinθcosθ|=μ(gcosθ+ω2Rsin2θ)
aplicando el procedimiento del punto medio para raíces múltiples .
public class Applet1 extends Applet {
double w=2.0;
double mu=0.4;
//raíces de la ecuación
static final double CERO=1e-10;
static final double ERROR=0.001;
final int MAXITER=200;
final int MAXRAICES=3;
int iRaiz;
double[] raices=new double[MAXRAICES];
void explorar(double xIni, double xFin, double dx){
double y1, y2;
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<MAXRAICES){
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<MAXRAICES){
raices[iRaiz]=puntoMedio(x, x+dx);
iRaiz++;
}
y1=y2;
}
}
public 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;
}
double f(double x){
double y=Math.abs(g(x))-mu;
return y;
}
void calcular()
explorar(0, 150*Math.PI/180, Math.PI/180);
for(int i=0; i<MAXRAICES; i++){
System.out.println(raices[i]*180/Math.PI);
}
}
}
|
Ecuación diferencial
Resolver la ecuación diferencial de segundo orden por el procedimiento de Runge-Kutta
con las siguientes condiciones iniciales, en el instante t=0, θ=θ0, dθ/dt=0.
public class Sistema extends RungeKutta{
double w; //velocidad angular
final double radio=1.0;
double mu; //coef. rozamiento
public Sistema(double w, double mu, double h){
super(h);
this.w=w;
this.mu=mu;
}
void cambiaSigno(){
this.mu=-mu;
}
public double f(double x, double v, double t){
double y=w*w*Math.sin(x)*Math.cos(x)-9.8*Math.sin(x) |
