¿Cómo y por qué funciona el método Runge-Kutta para resolver ecuaciones diferenciales ordinarias? ¿Cómo implemento versiones de orden superior del método Runge-Kutta?

La intuición central es convertir el problema de resolver un sistema de ecuaciones diferenciales en resolver sistemas de ecuaciones lineales de forma iterativa.

En el caso más simple, considere el método de Euler; comenzamos en algún valor inicial [math] (x_0, t_0) [/ math] y estamos tratando de desarrollar una solución aproximada [math] x (t) [/ math] a [math] \ dot {x} = f (x , t) [/ matemáticas]. Seguimos la línea que comienza en [math] (x_0, t_0) [/ math] con pendiente dada por [math] f (x_0, t_0) [/ math] para un tamaño de paso de [math] \ delta t [/ math] . Luego recalculamos la pendiente de la función en este nuevo punto, [math] (x_0 + \ delta t * f (x_0, t_0), t_0 + \ delta t), [/ math] y repetimos el procedimiento. Continuando hasta el infinito, desarrollamos una solución aproximada a la ecuación diferencial. Pero como estamos siguiendo aproximaciones lineales, la solución aproximada tiende a “alejarse” de la solución correcta y, por lo tanto, el error se acumula.

Métodos más complicados como Runge-Kutta nivel 2, etc. hacen conjeturas más refinadas en cada paso de la iteración con el objetivo de minimizar el error de esta aproximación y asegurar que sea “estable”; es decir, a la larga, la solución aproximada se comporta como se esperaba.

Entonces el objetivo es resolver lo siguiente:

[matemáticas] \ frac {d \ textbf {u}} {dt} = f (\ textbf {u}, t) [/ matemáticas]

dado que [matemáticas] u (t = 0) = u_ {0} [/ matemáticas]

Dado que el lado izquierdo tiene una derivada, puede aproximar esa derivada con una diferencia finita simple, como:

[matemáticas] \ frac {d \ textbf {u}} {dt} = \ frac {\ textbf {u} (t + \ Delta t) – \ textbf {u} (t)} {\ Delta t} [/ matemáticas]

Si asume que solo estamos usando [math] \ textbf {u} (t) [/ math] en el lado derecho del diffeq original, puede simplificar la ecuación de la siguiente manera:

[matemáticas] \ textbf {u} (t + \ Delta t) = \ textbf {u} (t) + \ Delta tf (\ textbf {u} (t), t) [/ math]

Esta se convierte en la fórmula para encontrar el siguiente valor para u, que también es el método explícito de Euler, suponiendo que discretice el dominio del tiempo mediante una constante [math] \ Delta t [/ math].

Obviamente, esto es bastante simple de entender. Runge-Kutta es un poco diferente. La idea geométrica principal es que realice algunos pasos de varios tamaños, no solo [matemática] \ Delta t [/ matemática], utilizando diferentes aproximaciones a la pendiente y utilice los diferentes resultados para crear un valor más preciso de [matemática] \ textbf {u} (t + \ Delta t) [/ math]. Recomendaría buscar una derivación si su curso no lo muestra.

Lo que gira alrededor, si recuerdo bien, es asumir algunas formas para las fórmulas de actualización de Runge-Kutta, hacer la serie Taylor para las fórmulas de actualización y usar la expresión de error global para encontrar coeficientes para las fórmulas de actualización de Runge-Kutta que minimizar el error No es súper simple, aunque es algo que podrías entender si vieras la derivación en alguna parte.