Beruflich Dokumente
Kultur Dokumente
Los métodos más sencillos como el de Euler o las mejoras de este procedimiento, tienen
dos defectos esenciales: la exactitud es pequeña y los errores crecen sistemáticamente.
Se elige una anchura de paso h, y se calculan cuatro números k1, k2, k3, k4 de acuerdo con el
procedimiento esquematizado en la tabla adjunta. Según el procedimiento ordinario de
Runge-Kutta, a partir del valor de x en el instante t se determina el valor de x en el instante
t+h mediante la fórmula que figura en la última fila de dicha tabla.
La jerarquía de clases
Definimos una clase base abstracta denomina RungeKutta, cuya función miembro resolver
nos calcule la solución aproximada de la ecuación diferencial x en el instante final tf,
cuando le pasamos el estado inicial, es decir, el valor de x0 en el instante inicial t0. La
función devuelve el estado del sistema que puede ser la posición del móvil, la intensidad de
la corriente eléctrica en un circuito, etc., es decir, el valor de x, en el instante t.
Comparamos el valor exacto y el valor aproximado, tomando como paso h el valor 0.5, el
número inicial de núcleos, 5000, y el instante t, 20. Se obtiene para el resultado aproximado
676 y para el resultado exacto 676, lo que nos confirma la exactitud del procedimiento de
Runge-Kutta.
// valor exacto
x=(int)(x0*Math.exp(-0.1*t));
System.out.println("valor exacto de x "+(int)x);
Sistema de ecuaciones diferenciales de primer orden
El procedimiento de Runge-Kutta es igualmente efectivo en la resolución de ecuaciones
diferenciales de primer orden. Sea el sistema
se esquematiza en la tabla adjunta. Como vemos además de los cuatro números k1, k2, k3, k4
para la primera ecuación diferencial precisamos otros cuatro números l1, l2, l3, l4 para la
segunda ecuación diferencial. A partir del valor de x en el instante t, se determina el valor
de x en el instante t+h, y a partir del valor de y en el instante t se determina el valor de y en
el instante t+h mediante las fórmulas de la última fila de la tabla.
La jerarquía de clases
De modo similar, definimos la clase base abstracta denominada RungeKutta cuya función
miembro resolver nos calcule la solución aproximada del sistema de ecuaciones
diferenciales de primer orden (x, y) en el instante final tf, cuando le pasamos el estado
inicial, es decir, el valor x0 e y0 en el instante inicial t0
public abstract class RungeKutta {
public void resolver(double tf, Estado e, double h){
//variables auxiliares
double k1, k2, k3, k4;
double l1, l2, l3, l4;
//estado inicial
double x=e.x;
double y=e.y;
double t0=e.t;
Una función solamente, puede devolver un valor, sin embargo, el estado del sistema en
cualquier instante t viene dado por dos números x e y. Para ello, definimos la clase
denominada Estado con tres miembros públicos x e y y el tiempo t.
La función resolver recibe en su segundo parámetro el estado inicial del sistema. Ya que los
objetos que se pasan a una función se pueden modificar en el curso de su llamada. La
función resolver modifica dicho objeto, devolviendo el estado final cuando se le pasa el
estado inicial.
Para obtener el estado e (objeto de la clase Estado) accedemos a sus miembros dato
públicos t, x, y
System.out.println("t " +e.t);
System.out.println("x " +e.x);
System.out.println("y " +e.y);
double t=0;
double x=1000;
double y=0;
Estado e=new Estado(t, x, y);
Ejemplo
La solución analítica que aparece a la derecha, se ha obtenido con las condiciones iniciales
t=0, x=x0 e y=0. La segunda solución se obtiene siempre que a sea distinto de b. En el caso
de que a sea igual a b, la solución analítica para y es
Para codificar este ejemplo, primero se han de definir las funciones f, g en la clase derivada
Funcion de la clase abstracta RungeKutta.
public class Funcion extends RungeKutta{
public double f(double x, double y, double t){
return (-0.1*x);
}
public double g(double x, double y, double t){
return (0.1*x-0.2*y);
}
}
double x0=5000;
Estado es=new Estado(0, x0, 0);
La definición de la clase cuyos miembros dato nos sirven para guardar el estado del sistema
es similar a la clase definida en el apartado sistema de dos ecuaciones diferenciales de
primer orden con el mismo propósito, cambiando el miembro y por la derivada de x, que
hemos llamado v.
• Oscilaciones libres
//oscilaciones libres
System.out.println("Oscilaciones libres");
Oscilador os=new Oscilador(w0);
os.resolver(t, es, h);
System.out.println("posición aprox. "+es.x);
System.out.println("velocidad aprox. "+es.v);
// valor exacto
double fi=Math.atan(w0*x0/v0);
double A=x0/Math.sin(fi);
double x=A*Math.sin(w0*t+fi);
double v=A*w0*Math.cos(w0*t+fi);
System.out.println("posición exacta "+x);
System.out.println("velocidad exacta "+v);
Oscilaciones amortiguadas
En vez de crear una nueva clase Amortiguado que sustituya a la clase Oscilador, podemos
pensar que un oscilador amortiguado, es una clase especial de oscilador, y por tanto la clase
que lo describe, derivará de Oscilador, le añadirá el miembro dato g (por γ), que da cuenta
de la intensidad de las fuerzas de rozamiento, y además, redefine la función f.
La jerarquía de clases
k2=h*(vx+l1/2);
l2=h*f(x+k1/2, y+q1/2, vx+l1/2, vy+m1/2, t+h/2);
q2=h*(vy+m1/2);
m2=h*g(x+k1/2, y+q1/2, vx+l1/2, vy+m1/2, t+h/2);
k3=h*(vx+l2/2);
l3=h*f(x+k2/2, y+q2/2, vx+l2/2, vy+m2/2, t+h/2);
q3=h*(vy+m2/2);
m3=h*g(x+k2/2, y+q2/2, vx+l2/2, vy+m2/2, t+h/2);
k4=h*(vx+l3);
l4=h*f(x+k3, y+q3, vx+l3, vy+m3, t+h);
q4=h*(vy+m3);
m4=h*g(x+k3, y+q3, vx+l3, vy+m3, t+h);
x+=(k1+2*k2+2*k3+k4)/6;
vx+=(l1+2*l2+2*l3+l4)/6;
y+=(q1+2*q2+2*q3+q4)/6;
vy+=(m1+2*m2+2*m3+m4)/6;
}
//estado final
e.x=x;
e.y=y;
e.vx=vx;
e.vy=vy;
e.t=tf;
}
abstract public double f(double x, double y, double vx, double vy,
double t);
abstract public double g(double x, double y, double vx, double vy,
double t);
}
El estado del sistema vendrá dado por cuatro números x, y, vx, vy y t, miembros dato de la
clase que hemos denominado Estado.
Teniendo en cuenta que la fuerza que ejerce el sol sobre un planeta viene descrita por la ley
de la Gravitación Universal
donde M es la masa del Sol, m la masa del planeta y r la distancia entre el centro del Sol y
del planeta. Las componentes de la aceleración del planeta serán
Uno de los problemas del tratamiento numérico con ordenador, es la de reducir el problema
a números simples e inteligibles por el usuario de un vistazo. Las masa de los planetas y del
Sol son números muy grandes: la masa de la Tierra es 5.98 1024 kg., y 1.98 1030 kg. la del
Sol. La distancia media entre la Tierra y el Sol es también muy grande 1.49 1011 m. y la
constante G es muy pequeña 6.67 10-11 en el Sistema Internacional de Unidades. Podemos
simplificar el problema numérico, refiriéndonos a un hipotético Sol cuya masa sea tal que
el producto GM=1 o bien, que se ha cambiado la escala de los tiempos de modo que se
cumpla esta condición. Teniendo en cuenta que la aceleración es la derivada segunda de la
posición, el sistema de dos ecuaciones diferenciales de segundo orden quedará
//Situación inicial
double x0=1.0;
double vy0=1.2;
Estado es=new Estado(0.0, x0, 0.0, 0.0, vy0);