Procedimiento numérico
Resolver el sistema de ecuaciones diferenciales
por procedimientos numéricos, con las siguientes condiciones iniciales, en el instante t=0.
public class Estado {
double t;
double x;
double y;
double z;
double v;
public Estado(double t, double x, double v, double y, double z) {
this.t=t;
this.x=x;
this.y=y;
this.z=z;
this.v=v;
}
}
public class Gas {
public double presion;
public double volumen;
public double nMoles;
public double cV;
public double temperatura;
double gamma;
public Gas(double presion, double volumen, double nMoles, boolean bMono) {
this.presion=presion;
this.volumen=volumen;
this.nMoles=nMoles;
temperatura=presion*volumen*100/(nMoles*8.3143);
this.cV=(bMono)?(3*8.3143/2):(5*8.3143/2);
this.gamma=(bMono)?(5.0/3):(7.0/5);
}
}
public abstract class RungeKutta {
double h;
RungeKutta(double h){
this.h=h;
}
public void resolver(Estado e){
//variables auxiliares
double k1, k2, k3, k4;
double l1, l2, l3, l4;
double m1, m2, m3, m4;
double q1, q2, q3, q4;
//condiciones iniciales
double x=e.x;
double v=e.v;
double t=e.t;
double y=e.y;
double z=e.z;
//for(double t=t0; t<tf; t+=h){
k1=h*v;
l1=h*f(x, v, t, y, z);
m1=h*g(x, v, t, y, z);
q1=h*c(x, v, t, y, z);
k2=h*(v+l1/2);
l2=h*f(x+k1/2, v+l1/2, t+h/2, y+m1/2, z+q1/2);
m2=h*g(x+k1/2, v+l1/2, t+h/2, y+m1/2, z+q1/2);
q2=h*c(x+k1/2, v+l1/2, t+h/2, y+m1/2, z+q1/2);
k3=h*(v+l2/2);
l3=h*f(x+k2/2, v+l2/2, t+h/2, y+m2/2, z+q2/2);
m3=h*g(x+k2/2, v+l2/2, t+h/2, y+m2/2, z+q2/2);
q3=h*c(x+k2/2, v+l2/2, t+h/2, y+m2/2, z+q2/2);
k4=h*(v+l3);
l4=h*f(x+k3, v+l3, t+h, y+m3, z+q3);
m4=h*g(x+k3, v+l3, t+h, y+m3, z+q3);
q4=h*c(x+k3, v+l3, t+h, y+m3, z+q3);
//nuevo estado del sistema
x+=(k1+2*k2+2*k3+k4)/6;
v+=(l1+2*l2+2*l3+l4)/6;
y+=(m1+2*m2+2*m3+m4)/6;
z+=(q1+2*q2+2*q3+q4)/6;
// }
//cambia el estado
e.x=x;
e.v=v;
e.y=y;
e.z=z;
e.t=t+h;
}
abstract public double f(double x, double v, double t, double y, double z);
abstract public double g(double x, double v, double t, double y, double z);
abstract public double c(double x, double v, double t, double y, double z);
}
public class Sistema extends RungeKutta{
Gas[] gas;
double roza;
double masa;
double kA, kB;
final double fraccion=0.5;
public Sistema(Gas[] gas, double roza, double masa, double h){
super(h);
this.gas=gas;
this.roza=roza;
this.masa=masa;
kA=8.3143*fraccion*roza/(4*gas[0].cV);
kB=8.3143*(1.0-fraccion)*roza/(4*gas[1].cV);
}
//volumen en litros, presión en 1.0e5 Pa
public double f(double x, double v, double t, double y, double z){
double temp=4*(y/Math.pow(x, gas[0].gamma)-z/ |
