Procedimientos numéricos
Ecuaciones diferencial de segundo orden
Resolver la ecuación diferencial de segundo orden por el procedimiento de Runge-Kutta
La fuerza es
-
Para x>0
-
Para x≤0
public class Oscilador extends RungeKutta{
double area;
double volumen;
double lonTubo;
double densidad;
double longitud;
double presion;
final double pAtm=1.013e5;
double masa;
public Oscilador(double area, double volumen, double lonTubo, |
Raíces de una ecuación trascendente
Hallar las raíces de la ecuación por el procedimiento del punto medio
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){
if(x>0)
return(-tubos[nTubo][3]*1000*volumen*estado.v*estado.v/2+potencial(x, 1)+c1);
return(-tubos[nTubo][3]*1000*volumen*estado.v*estado.v/2+potencial(x, -1)+c2);
}
double potencial(double x, int signo){
double radicando=Math.sqrt((1000*9.8*x-presion)*(1000*9.8*x-presion)
+4*pAtm*longitud*1000*9.8);
double y;
y=1000*9.8*(area/2+100*volumen/tubos[nTubo][0])*x*x/2;
if(signo==-1){
y=-1000*9.8*(area/2)*x*x/2;
}
y+=(volumen*9.8*(tubos[nTubo][3]*1000-1000)+presion*area/2)*x-(area/(4*1000*9.8))*
(1000*9.8*x-presion)*radicando-area*pAtm*longitud*Math.log(1000*9.8*x-presion+radicando);
return y;
}
|
