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