Você está na página 1de 6

METODOS DE RUNGE-KUTTA (RK) Tomado de NAKAMURA “METODOS

NUMERICOS APLICADOS CON SOFTWARE” Prentice Hall Editorial USA,


1988.
En los métodos de Runge-Kutta (RK) el orden de precisión aumenta al utilizar
puntos intermedios en cada intervalo. Una mayor precisión implica que los
errores decrecen más rápido al reducir h, en comparación con los métodos de
precisión baja como los de Taylor y Euler.
Considere el PVI
𝑦 ′ = 𝑓(𝑦, 𝑡), 𝑦(0) = 𝑦0 (1)
Para calcular 𝑦𝑛+1 en 𝑡𝑛+1 = 𝑡𝑛 + ℎ dado un valor de 𝑦𝑛 integramos la ecuación
(1) en el intervalo [𝑡𝑛 , 𝑡𝑛−1 ]
𝑡
𝑦𝑛+1 = 𝑦𝑛 + ∫𝑡 𝑛−1 𝑓(𝑦, 𝑡)𝑑𝑡 (2)
𝑛
Los métodos de Runge-Kutta se obtienen al aplicar un método de integración
numérica a la integral del lado derecho de la ecuación (2)

METODO DE RK-2
Aplicando la regla del trapecio al lado derecho de la ecuación (2)
𝑡𝑛−1 1
∫𝑡 𝑓(𝑦, 𝑡)𝑑𝑡 ≈ 2 ℎ[𝑓(𝑦𝑛 , 𝑡𝑛 ) + 𝑓(𝑦𝑛+1 , 𝑡𝑛+1 )] (3)
𝑛
En esta ecuación 𝑦𝑛+1 es una incógnita, por lo que aproximamos el segundo
término mediante 𝑓( ̅̅̅̅̅̅,
𝑦𝑛+1 𝑡𝑛+1 ), donde ̅̅̅̅̅̅
𝑦𝑛+1 es la primera estimación de 𝑦𝑛+1
obtenida mediante el método de Euler haci adelante. El método se resume
como:

̅̅̅̅̅̅
𝑦 𝑛+1 = 𝑦𝑛 + ℎ𝑓(𝑦𝑛 , 𝑡𝑛 )
1
𝑦𝑛+1 = 𝑦𝑛 + ℎ[𝑓(𝑦𝑛 , 𝑡𝑛 ) + 𝑓(𝑦 ̅̅̅̅̅̅,
𝑛+1 𝑡𝑛+1 )]
2
Una forma canónica de estas últimas expresiones es:
𝑘1 = ℎ𝑓(𝑦𝑛 , 𝑡𝑛 )
𝑘2 = ℎ𝑓(𝑦𝑛 + 𝑘1 , 𝑡𝑛+1 ) (4)
1
𝑦𝑛+1 = 𝑦𝑛 + [𝑘1 + 𝑘2 ]
2

Ejemplo 1: El circuito de la figura tiene una auto inductancia de 𝐿 = 50𝐻, una


resistencia de 20 𝑂ℎ𝑚 y una fuente de voltaje de 𝑉 = 10 𝑣𝑜𝑙𝑡. Si el interruptor
se cierra en el instante 𝑡 = 0, la corriente 𝐼(𝑡) satisface la ecuación
𝑑
𝐿 𝑑𝑡 𝐼(𝑡) + 𝑅𝐼(𝑡) = 𝐸, 𝐼(0) = 0 (5)

Figura 1:

Determinar la corriente para 0 ≤ 𝑡 ≤ 10 segundos, mediante el método de RK-


2, con ℎ = 0.1
SOLUCION
En primer lugar debemos reescribir la ecuación (5)
𝑑 𝑅 𝐸
𝐼 = − 𝐼 + ≡ 𝑓(𝐼, 𝑡)
𝑑𝑡 𝐿 𝐿
Ahora desarrollando para RK-2 se tiene:
𝑅 𝐸
𝑘1 = ℎ𝑓(𝑦𝑛 , 𝑡𝑛 ) = ℎ [− 𝐼𝑛 + ]
𝐿 𝐿
Página 1 de 6
𝑅 𝐸
𝑘2 = ℎ𝑓(𝑦𝑛 + 𝑘1 , 𝑡𝑛+1 ) = ℎ [− (𝐼𝑛 + 𝑘1 ) + ]
𝐿 𝐿
1
𝐼𝑛+1 = 𝐼𝑛 + (𝑘1 + 𝑘2 )
2
Los cálculos para los dos primeros pasos son:
𝑛 = 0, (𝑡 = 0.1)
20 10
𝑘1 = 0.1 [(− 50) (0) + (50)] = 0.1[(−0.4)(0) + (0.2)] = 0.02
𝑘2 = 0.1[(−0.4)(0 + 0.02) + 0.2] = 0.0192
1
𝐼1 = 𝐼0 + (0.02 + 0.0192) = 0.0196
2

𝑛 = 1, (𝑡 = 0.2)
𝑘1 = 0.1[(−0.4)(0.0196) + (0.2)] = 0.019216
𝑘2 = 0.1[(−0.4)(0.0196 + 0.019216) + 0.2] = 0.018447
1 1
𝐼2 = 𝐼1 + (𝑘1 + 𝑘2 ) = 0.0196 + (0.019216 + 0.018447) = 0.038431
2 2

El programa en MATLAB para RK-2 es

function [x,y] = RK2(f,a,b,n,y0)


% Runge Kutta 2
% E. Raffo Lecca
% Datos
% f =el nombre de la funcion como string
% a =limite inferior
% b =limite superior
% h =longitud del segmento
% y0 =f(a);
% x =es el vector x
% n =numero de segmentos
% Resultados
% y =es el vector f(x)%usando el poligono mejorado
h = (b-a)/n;
n = n + 1;
y = zeros(n,1);
x= zeros(n,1);
x(1) = a;
y(1) = y0;
fprintf(' x y \n');
fprintf('====================\n');
fprintf('%10.6f%10.6f\n',x(1),y(1));
for i = 1:n-1
k1 = feval(f,x(i),y(i));
k2 = feval(f,x(i)+h/2,y(i)+h*k1/2);
x(i+1) = a+h*i;
y(i+1) = y(i)+h*k2;
fprintf('%10.6f%10.6f\n',x(i+1),y(i+1));
end

% grafico
plot(x,y,x,y)
grid on
title('Plot de dy/dx')
xlabel('Eje x')
ylabel('Eje y')

Página 2 de 6
En la ventana de comandos escribimos

>> f = inline('(-(20/50)*I + 10/50)', 'R', 'I')

f =
Inline function:
f(R,I) = (-(20/50)*I + 10/50)

>> [x, y] = RK2(f, 0, 10, 100, 0)

METODO RK-4 Tomado de: NIEVES A. & DOMINGUEZ F. “Métodos Numéricos


Aplicados a la Ingeniería” 4ta. Edición, Grupo Editorial Patria. México 2012
La fórmula general para RK-4 es:

𝑦𝑖+1 = 𝑦𝑖 + [𝑘1 + 2𝑘2 + 2𝑘3 + 𝑘4 ]
6
Donde
𝑘1 = 𝑓(𝑥𝑖 , 𝑦𝑖 )

𝑘2 = 𝑓(𝑥𝑖 + , 𝑦𝑖 + ℎ𝑘1 /2)
2

𝑘3 = 𝑓(𝑥𝑖 + , 𝑦𝑖 + ℎ𝑘2 /2)
2
𝑘4 = 𝑓(𝑥𝑖 + ℎ, 𝑦𝑖 + ℎ𝑘3 )
Ejemplo: Resolver el PVI
𝑑𝑦
= (𝑥 − 𝑦), 𝑦(0) = 2, Aproximar 𝑦(1) con el método de RK-4
𝑑𝑥

SOLUCION
1−0
El intervalo es [0,1] al dividirlo en cinco sub intervalos se tiene ℎ = 5 = 0.2
entonces:
𝑥0 = 0.0, 𝑥1 = 𝑥0 + ℎ = 0.00 + 0.2 = 0.2
𝑥2 = 𝑥1 + ℎ = 0.2 + 0.2 = 0.4
𝑥3 = 𝑥2 + ℎ = 0.4 + 0.2 = 0.6

Página 3 de 6
𝑥4 = 𝑥3 + ℎ = 0.6 + 0.2 = 0.8
𝑥5 = 𝑥4 + ℎ = 0.8 + 0.2 = 1.0
Ahora calculamos las constantes 𝑘1 , 𝑘2 , 𝑘3 , 𝑘4
𝑘1 = 𝑓(𝑥1 , 𝑦1 ) = (0.2 − 16562) = −1.4562
ℎ ℎ𝑘1 1.4562
𝑘2 = 𝑓 (𝑥1 + , 𝑦1 + ) = [(0.2 + 0.2/2) − (1.6562 + 0.2(− )]
2 2 2
= −1.21058
ℎ ℎ𝑘2 0.2 1.21058
𝑘3 = 𝑓 (𝑥1 + , 𝑦1 + ) = [(0.2 + ) − (1.6562 + 0.2(− ))]
2 2 2 2
= −1.235142
𝑘4 = 𝑓(𝑥1 + ℎ, 𝑦1 + ℎ𝑘3 ) = [(0.2 + 0.2) − (1.6562 + 0.2(−1.235142))]
= −1.0091716
Calculo de 𝑦2

𝑦(0.4) = 𝑦2 = 𝑦1 + [𝑘1 + 2𝑘2 + 2𝑘3 + 𝑘4 ]
6
0.2
= 1.6562 + ( ) (−1.4562 + 2(−1.21058) + 2(−1.235142) − 1.0091716)
6
= 1.410972813
Continuando el procedimiento, en las siguientes iteraciones se tiene
𝑦(0.6) = 𝑦3 = 1.246450474
𝑦(0.8) = 𝑦4 = 1.148003885
𝑦(1.0) = 𝑦5 = 1.103655714
El cual tiene un error absoluto de 0.00001 y un error porcentual de 0.0009

MATLAB tiene la función ode45 que realiza RK-4:

Paso 1: Definimos la función en un archivo M

function f = Ejemplo(x,y)
f(1) = x - y;

Paso 2: En la ventana de comandos escribimos

>> xx = 0:0.2:1;
>> y0 = [2];
>> [T, Y] = ode45('Ejemplo', xx, y0)

T =
0
0.200000000000000
0.400000000000000
0.600000000000000
0.800000000000000
1.000000000000000

Y =
2.000000000000000
1.656192260848395
1.410960140750517
1.246434911528673
1.147986895895780
1.103638327141421

Página 4 de 6
>>

El siguiente Archivo M implementa el algoritmo RK-4

function [x,y] = RK4(f,a,b,n,y0)


% Datos
% Eduardo Raffo Lecca
% f = el nombre de la funcion como string
% a = limite inferior
% b = limite superior
% h = longitud del segmento
% y0 = f(a);
% x = es el vector x
% n = numero de segmentos
% Resultados
% y = es el vector f(x)
h = (b - a)/n;
n = n + 1;
y = zeros(n,1);
x = zeros(n,1);
x(1)=a;
y(1)=y0;
fprintf(' x y \n');
fprintf('====================\n');
fprintf('%10.6f%10.6f\n',x(1),y(1));
for i=1:n-1
k1 = feval(f,x(i),y(i));
k2 = feval(f,x(i)+h/2,y(i)+h*k1/2);
k3 = feval(f,x(i)+h/2,y(i)+h*k2/2);
k4 = feval(f,x(i)+h,y(i)+h*k3);
x(i+1) = a + h*i;
y(i+1) = y(i)+h*(k1+2*k2+2*k3+k4)/6;
fprintf('%10.6f%10.6f\n',x(i+1),y(i+1));
end
% grafico
plot(x,y,x,y)
grid on
title('Plot de dy/dx')
xlabel('Eje x')
ylabel('Eje y')

Ahora en la ventana de comandos de MATLAB, escribimos

>> [x, y] = RK4('Ejemplo', 0, 1, 5, 2)


x y
====================
0.000000 2.000000
0.200000 1.656200
0.400000 1.410973
0.600000 1.246450
0.800000 1.148004
1.000000 1.103656

x =
0

Página 5 de 6
0.200000000000000
0.400000000000000
0.600000000000000
0.800000000000000
1.000000000000000

y =
2.000000000000000
1.656200000000000
1.410972813333333
1.246450474703111
1.148003885321927
1.103655714375906

2015-1

Página 6 de 6

Você também pode gostar