Sie sind auf Seite 1von 30

UNIVERSIDAD PERUANA UNION

FACULTAD DE INGENIERIA Y ARQUITECTURA


EAP Ingeniera de sistemas

PROYECTO DE INVESTIGACION
El Metodo de Runge Kutta

Trabajo presentado en cumplimiento de la asignatura


Mtodos Numricos

Autor:
Alumno: Jos Manuel Limachi Chvez

Docente:
Braulio Gutierrez Pari

Juliaca 2011

RUNGE-KUTTA
El mtodo de Runge Kutta es un mtodo numrico de resolucin de ecuaciones diferenciales que
surge como una mejora del mtodo de Euler. El mtodo de Euler se puede considerar como un
mtodo de Runge Kutta de primer orden, el de Heun, es un mtodo de Runge Kutta de orden dos.
Los mtodos de Runge-Kutta logran la exactitud del procedimiento de una serie de Taylor sin
requerir el clculo de derivadas superiores. Existen muchas variaciones, pero todas se pueden
denotar en la forma generalizada de la ecuacin
yi + 1 = yi + F(xi,yi,h)h
Donde F(xi,yi,h) se conoce como la funcin incremento la cual puede interpretarse como una
pendiente representativa en el intervalo. La funcin incremento se escribe en forma general como:
F = a1k1 + a2k2 +.+ ankn
Donde las a son constantes y las k son:
k1 = f(xi,yi)
k2 = f(xi + p1h,yi + q11k1h)
k3 = f(xi + p2h,yi + q21k1h + q22k2h)
kn = f(xi + pnh,yi + q2n-1k1h + qn-1,2k2h + . + qn-1,n-1kn-1h)
Donde las p y q son constantes.
Como cada k es una evaluacin funcional, esta recurrencia hace que los mtodos Runge-Kutta sean
eficientes para la programacin. Existen varios tipos de mtodos Runge-Kutta al emplear diferentes
nmeros de trminos en la funcin incremento como la especificada por n.
n = 1, es el mtodo de Euler. Una vez se elige n, se evalan las a, p y q al igualar la funcin
incremento a los trminos en la serie de expansin de Taylor. La versin de segundo orden para la
ecuacin en su forma generalizada es:

Donde:

Los valores de a1, a2, p1 y q11 son evaluados al igualar el trmino de segundo orden de la ecuacin
dada con la expansin de la serie de Taylor.
Desarrollando tres ecuaciones para evaluar las cuatro incgnitas:

Como se tienen tres ecuaciones con cuatro incgnitas se tiene que suponer el valor de una de ellas.
Suponiendo que se especific un valor para a2, se puede resolver de manera simultnea el sistema
de ecuaciones obtenido:

Como se puede elegir un nmero infinito de valores para a2, hay un nmero infinito de mtodos
Runge-Kutta de segundo orden.
a2 = 1/2: Mtodo de Heun con un solo corrector, donde:

a2 = 1 : Mtodo del punto medio.

a2 = 2/3: Mtodo de Ralston.

Siguiendo el mismo razonamiento para n = 3, o sea, Runge-Kutta de tercer orden, el resultado son
seis ecuaciones con ocho incgnitas, por lo tanto se deben suponer dos valores con antelacin para
poder

desarrollar

el

sistema

de

ecuaciones.

Una

versin

ampliamente

usada

es:

ste

es

el

ms

popular

de

los

mtodos

Runge-Kutta

Ejemplo
Runge Kutta para segundo orden, mtodo punto medio.
Resuelva el siguiente problema de valor inicial en el intervalo de x=0 a x=1.

dy
! yx 2  1.2 y
dx
Donde:
y(0)=1
h = 0.25
Solucin

y i 1 ! y i 

! ( i yi )

= (

1
1
 h yi 
2
2

h)

Primera iteracin

k !

! !

 .2

k1 ! 1.2

! f x  h , y 

k h

de

cuarto

orden:

k 2 ! f (0 

1
1
(0.25) , 1  ( 1.2)(0.25))
2
2

k 2 ! f (0.125 ,0.85 )

k 2 ! 0.85(0.125) 2  1.2(0.85)
k 2 ! 1.006718
y1 ! 1  ( 1.006718 ) 0.25
y1 ! 0.748320
Segunda iteracin

x1 ! x 0  h
x1 ! 0  0.25
x1 ! 0.25
k 1 ! (x 1 , y 1 ) ! ! (0.25 , 0.748320)

k1 ! (0.748320 )(0.25) 2  1.2(0.748320 )


k 1 ! 0.851432

k 2 ! f ( 0.25 

1
1
(0.25) , 0.748320  ( 0.851432 )(0.25))
2
2

k 2 ! f (0.375,0.641891)

k 2 ! 0.641891(0.375) 2  1.2(0.641891)
k 2 ! 0.680003
y 2 ! 0.748320  ( 0.680003 )0.25
y 2 ! 0.578319

Tercera iteracin

x 2 ! x1  h
x 2 ! 0.25  0.25
x 2 ! 0.5
k 1 ! f(x 2 , y 2 ) ! f ! (0.5,0.578 319)

k1 ! (0.578319 )(0.5) 2  1.2( 0.578319 )


k 1 ! 0.549403

k 2 ! f ( x2 

1
1
h , y 2  k1 h)
2
2

k 2 ! f (0.5 

1
1
(0.25) , 0.578319  ( 0.549403)(0.25))
2
2

k 2 ! f (0.625 ,0.509643 )

k 2 ! 0.509643 (0.625 ) 2  1.2( 0.509643 )


k 2 ! 0.4125

y 3 ! 0.578319  ( 0.4125)0.25
y 3 ! 0.4752
Cuarta iteracin

x3 ! x 2  h
x3 ! 0.5  0.25
x3 ! 0.75

k 1 ! f(x 3 , y 3 ) ! f ! (0.75,0.47 52)


k1 ! (0.4752)(0.75) 2  1.2(0.4752)
k 1 !  0.3029

k 2 ! f ( x3 

1
1
h , y 3  k1 h )
2
2

k 2 ! f ( 0.75 

1
1
(0.25) , 0.4752  ( 0.3029)(0.25))
2
2

k 2 ! f (0.875,0.4373)

k 2 ! 0.4373(0.875) 2  1.2(0.4373)
k 2 ! 0.1900
y 4 ! 0.4752  ( 0.1900 )0.25
y 4 ! 0.4277

x4 ! x3  h
x 4 ! 0.75  0.25
x4 ! 1
Vectores solucin

X 0
y

0.25

0.5

0.75

1 0.7483 0.5783 0.4752 0.4277

Algoritmo MATLAB- Segundo orden


%Mtodo Runge kutta de segundo orden
x=0;
y=1;
t=0;
Tmax=1;
h=0.25;
Iter=round ((tmax-t)/h);
Vectory=y;
Vectort=t;
For i=1:iter
%Clculo de las constantes de Runge-kutta
K1=(y*(t^2))-(1.2*y);
K2=(y+(K1/2)*h)*(t+(h/2))^2-(1.2*(y+(K1/2)*h));
y=y+(K2*h);
t=t+h;
vectory=[vectory y];
vectort=[vectort t];
end
vectory
vectort
subplot (1,1,1);

plot(vectort,vectory,'b-p');
title('Mtodo runge kutta segundo orden. y vs t');
xlabel ('valores t');
ylabel ('valores y');

Runge Kutta para tercer orden.


Se resuelve el mismo problema anterior pero esta vez mediante el uso del mtodo Runge kutta de
tercer grado, de valor inicial, en el intervalo de x=0 a x=1.

dy
! yx 2  1.2 y
dx

Donde:
y(0)=1
h = 0.25
Solucin.
En el mtodo de Runge kutta de tercer orden se utilizan las siguientes formulas:

y i 1 ! y i 

1
(k 1  4 k 2  k 3 )h
6

k 1 ! f(xi, y i )

k 2 = f(x i 

1
1
h , y i  k 1 h)
2
2

k 3 ! f(x i  h , y i  k 1 h  2 k 2 h)

Primera iteracin

k 1 ! f(x 0 , y 0 ) ! f ! (0 , 1)
k1 ! (1)(0) 2  1.2(1)
k 1 !  1 .2

k 2 ! f ( x0 

k 2 ! f (0 

1
1
h , y 0  k1 h )
2
2

1
1
(0.25) , 1  ( 1.2)(0.25))
2
2

k 2 ! f (0.125 ,0.85 )

k 2 ! 0.85(0.125) 2  1.2(0.85)
k 2 ! 1.0067

k 3 ! f(x o  h , y o  k 1 h  2 k 2 h)
k 3 ! f (0  (0.25), (1)  ( 1.2)(0.25)  2(1.0067 )(0.25))
k 3 ! f (0.25,0 .7966 )
k 3 ! 0.7966 (0.25) 2  1.2(0.7966 )
k 3 ! 0.9062
y1 ! y 0 

1
(k 1  4 k 2  k 3 )h
6

y1 ! 0.7445

Segunda iteracin

x1 ! x 0  h
x1 ! 0  0.25
x1 ! 0.25
k 1 ! f(x 1 , y 1 ) ! f ! (0.25 , 0.7445)

k1 ! (0.7445)(0.25) 2  1.2(0.7445)
k 1 !  0.8468

k 2 ! f ( x1 

1
1
h , y1  k1 h )
2
2

k 2 ! f ( 0.25 

1
1
(0.25) , 0.7445  (0.8469)(0.25))
2
2

k 2 ! f (0.375,0.6386 )

k 2 ! 0.6386(0.375) 2  1.2(0.6386)
k 2 ! 0.6765

k 3 ! (x 1  h , y 1  k 1 h  2 k 2 h)
k 3 ! f (0.25  ( 0.25), (0.7445)  ( 0.8469 )(0.25)  2( 0.6765)(0.25))
k 3 ! f (0.5,0.6178 )
k 3 ! 0.6178 (0.5) 2  1.2( 0.6178)
k 3 ! 0.5870
y 2 ! y1 

1
(k 1  4k 2  k 3 )h
6

y 2 ! 0 .5720
Tercera iteracin

x 2 ! x1  h
x 2 ! 0.25  0.25
x 2 ! 0.5
k 1 ! f(x 2 , y 2 ) ! f ! (0.5,0.572 0)

k1 ! (0.5720 )(0.5) 2  1.2(0.5720 )


k 1 ! 0.5434

k 2 ! f ( x2 

1
1
h , y 2  k1 h)
2
2

k 2 ! f ( 0.5 

1
1
(0.25) , 0.5720  ( 0.5434)(0.25))
2
2

k 2 ! f (0.625,0.5041)

k 2 ! 0.5041(0.625) 2  1.2(0.5041)
k 2 ! 0.4080

k 3 ! (x 2  h , y 2  k 1 h  2 k 2 h)
k 3 ! f ( 0.5  (0.25), ( 0.5720 )  ( 0.5434 )(0.25)  2(0.4080 )(0.25))
k 3 ! f (0.75,0.5038)
k 3 ! 0.5038 (0.75) 2  1.2( 0.5038)
k 3 ! 0.3212
y3 ! y2 

1
(k 1  4 k 2  k 3 )h
6

y 3 ! 0.4679

Cuarta iteracin

x3 ! x 2  h
x3 ! 0.5  0.25
x3 ! 0.75
k 1 ! f(x 3 , y 3 ) ! f ! (0.75,0.46 79)
k1 ! (0.4679)(0.75) 2  1.2(0.4679)
k 1 ! 0.2986

k 2 ! f ( x3 

1
1
h , y 3  k1 h )
2
2

k 2 ! f ( 0.75 

1
1
(0.25) , 0.4679  ( 0.2983)(0.25))
2
2

k 2 ! f (0.875,0.4306 )

k 2 ! 0.4306(0.875) 2  1.2(0.4306)
k 2 ! 0.1871

k 3 ! f(x 3  h , y 3  k 1 h  2 k 2 h)
k 3 ! f (0.75  (0.25), (0.4679 )  ( 0.2983)(0.25)  2( 0.1871)(0.25))
k 3 ! f (1,0.4489 )
k 3 ! 0.4489(1) 2  1.2(0.4489)
k 3 ! 0.0898
y4 ! y3 

1
(k 1  4 k 2  k 3 )h
6

y 4 ! 0 .4206

x4 ! x3  h
x 4 ! 0.75  0.25
x4 ! 1

Vectores solucin

X 0 0.25
y

0.5

0.75

1 0.7445 0.5720 0.4679 0.4206

Algoritmo MATLAB- Tercer orden


%Mtodo Runge-Kutta de 3er orden
x=0;
y=1;
t=0;
tmax=1;
h=0.25;
iter=(tmax-t)/h;
vectory=y;
vectort=t;
for i=1:iter
%Clculo de las constantes de Runge-kutta
K1=(y*(t^2))-(1.2*y);
K2=(y+(K1/2)*h)*(t+(h/2))^2-(1.2*(y+(K1/2)*h));
K3=(y-(K1*h)+(2*K2*h))*((t+h)^2)-(1.2*((y-(K1*h)+(2*K2*h))));
y=y+((K1+(4*K2)+K3)/6)*h;
t=t+h;

vectory=[vectory,y];
vectort=[vectort,t];
end

vectory
vectort

subplot (1,1,1);
plot(vectort,vectory,'r-*');
title('Mtodo runge kutta Tercer orden. y vs t');
xlabel ('valores t');
ylabel ('valores y');

Runge Kutta para cuarto orden.

Los llamados mtodos de Runge-Kutta son una serie de algoritmos para calcular
aproximaciones numricas del valor de la solucin de:

En puntos de la forma siguiente:

x1 ! x0  h ; x2 ! x1  h ; etc

Con muy buena precisin, sin que, para ello, sea necesario que los h sean muy pequeos. El
procedimiento consta de los siguientes pasos:

Para calcular un valor aproximado de la solucin y1 en el punto

El algoritmo es el siguiente:

Implementacion en MATLab, Java y C++


EN C++
#include<iostream.h>
#include<conio.h>
#include<iomanip.h>
#include<math.h>

float func(float x, float y){


return 0.5*(1+x)*pow(y,2);

}
void reportar(float x, float y, int i)
{cout<<setiosflags(ios::showpoint | ios::fixed);
cout<<setiosflags(ios::right);
cout.precision(4);
cout<<setw(10)<<i<<setw(15)<<x<<setw(15)<<y<<endl;
}
int menu()
{int opc;
do
{clrscr();
cout<<setw(50)<<"SELECCIONE OPCION\n";
cout<<setw(50)<<"-----------------\n"<<endl;
cout<<"1.Metodo de Euler"<<endl;
cout<<"2.Salir"<<endl;
cout<<"\nSeleccione Opcion: ";cin>>opc;
}while(opc<1 || opc>2);
return opc;
}
void Kutta(){
float x0,y0,xf,yf,h,k1,k2,k3,k4;
int n,i;
clrscr();
cout<<setw(50)<<"Metodo de Runge - Kutta"<<endl;

cout<<setw(50)<<"-----------------------"<<endl<<endl;
cout<<"Ingrese el valor de x0: ";
cin>>x0;
cout<<"Ingrese el valor de y0: ";
cin>>y0;
cout<<"ingrese el valor de xf: ";
cin>>xf;
do{
cout<<"Ingrese el numero de subintervalos a emplear: ";
cin>>n;
}while(n<=0);
h=(xf-x0)/n;
cout<<endl;
cout<<setw(10)<<"I"<<setw(15)<<"Xi"<<setw(15)<<"Yi"<<endl;
cout<<setw(10)<<"-"<<setw(15)<<"--"<<setw(15)<<"--"<<endl;
for(i=1;i<=n;i++)
{ k1=func(x0,y0);
k2=func(x0+h/2,y0+h*k1/2);
k3=func(x0+h/2,y0+h*k2/2);
k4=func(x0+h,y0+h*k3);
y0=y0+(k1+2*k2+2*k3+k4)*h/6;
x0=x0+h;
reportar(x0,y0,i);
}

cout<<"El valor de Yf: "<<y0<<endl;


getch();
}
void terminar()
{cout<<"\t\t\t\tSalir del Programa\n";
cout<<"\t\t\t\t------------------\n\n";
cout<<"Gracias por usar el programa"<<endl<<endl;
}
void main (void)
{int opc;
do
{clrscr();
opc=menu();
clrscr();
switch(opc)
{case 1: clrscr();Kutta(); break;
case 2: clrscr();terminar();break;
}
getch();
}
while(opc!=2);
getch();
}

EN JAVA

import java.io.BufferedReader;
import java.io.InputStreamReader;

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/**
*
* @author JOSE MANUEL
*/

public class RK {
public static double func(double x, double y)
{
return //-2*x^3+12*x^2-20*x+8.5;
-2*Math.pow(x, 3)+12*Math.pow(x, 2)-20*x+8.5;
}
public static void reportar(double x, double y, int i)
{
System.out.println("\t\t" +i +"\t\t" +x +"\t\t" +y );

}
public static int menu()
{
int opc=0;
do
{
BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
try
{
System.out.println("SELECCIONE OPCION");
System.out.println("=================");
System.out.println("1.Metodo de Runge Kutta");
System.out.println("2.Salir");
System.out.print("Opcion:");opc=Integer.parseInt(br.readLine());

}catch(Exception e){e.getMessage();}
}while(opc<1||opc>2);
return opc;
}
public static void Kutta(){
double x0,y0,xf,yf,h,k1,k2,k3,k4;
int n,i;
System.out.println("Metodo de Runge Kutta");
System.out.println("---------------------");

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));


try
{
System.out.print("Ingrese el valor de x0: ");x0=Double.parseDouble(br.readLine());
System.out.print("Ingrese el valor de y0: ");y0=Double.parseDouble(br.readLine());
System.out.print("Ingrese el valor de xf: ");xf=Double.parseDouble(br.readLine());
do{
System.out.print("Ingrese
el
");n=Integer.parseInt(br.readLine());

numero

de

}while(n<=0);
h=(xf-x0)/n;
System.out.println("");
System.out.println("\t\t" +"I" +"\t\t" +"Xi" +"\t\t" +"Yi" );
System.out.println("\t\t" +"-" +"\t\t" +"-" +"\t\t" +"-" );

for(i=1;i<=n;i++)
{
k1=func(x0,y0);
k2=func(x0+h/2,y0+h*k1/2);
k3=func(x0+h/2,y0+h*k2/2);
k4=func(x0+h,y0+h*k3);
y0=y0+(k1+2*k2+2*k3+k4)*h/6;
x0=x0+h;
reportar(x0,y0,i);

subintervalos

emplear:

}
System.out.println("El valor de Yf: " +y0);
}catch(Exception e){e.printStackTrace();}
}
public static void terminar()
{System.out.println("Gracias por usar el programa");
}
public static void main (String[]args)
{int opc;
do
{
opc=menu();
switch(opc)
{case 1: Kutta(); break;
case 2: terminar();break;
}
}
while(opc!=2);
}
}

EN MATLAB
function f
fprintf('\n \tRESOLUCION DE ECUACIONES DIFERENCIALES POR MEDIO RUNGEKUTTA DE ORDEN 4\n')

f=input('\n Ingrese la ecuacion diferencial\n','s');


x0=input('\n Ingrese el primer punto x0:\n');
x1=input('\n Ingrese el segundo punto x1:\n');
y0=input('\n Ingrese la condicion inicial y(x0):\n');
n=input('\n Ingrese el numero de pasos n:\n');
h=(x1-x0)/n;
xs=x0:h:x1;
fprintf('\n''it x0 y(x1)');
for i=1:n
it=i;
x0=xs(i);
x=x0;
y=y0;
k1=h*eval(f);
x=x0+h/2;
y=y0+k1/2;
k2=h*eval(f);
x=x0+h/2;
y=y0+k2/2;
k3=h*eval(f);
x=x0+h;
y=y0+k3;
k4=h*eval(f);
y0=y0+(k1+2*k2+2*k3+k4)/6;

fprintf('\n%2.0f%10.6f%10.6f\n',it,x0,y0);
end
fprintf('\n El punto aproximado y(x1) es = %8.6f\n',y0);

Aplicacin
Los mtodos numricos son tcnicas, donde es posible resolver los problemas por medio de
operaciones aritmticas, estos mtodos implementan un buen numero de clculos que son por
dems demasiado lentos si se hacen manualmente, gastando mucha energa en la tcnica misma de
solucin en vez de aplicarla sobre la definicin del problema y su interpretacin.
El trabajo montono que se haca anteriormente al uso de la computadora, hace de importancia, el
dominio de los mtodos numricos, los cuales se deben llevar a cabo en combinacin con las
capacidades y potencialidades de la programacin de computadoras para de esa forma resolver los
problemas de ingeniera mucho ms fcilmente y eficientemente.
En general, estos mtodos se aplican cuando se necesita un valor numrico como solucin a un
problema matemtico, y los procedimientos "exactos" o "analticos" (manipulaciones algebraicas,

teora de ecuaciones diferenciales, mtodos de integracin, etc.) son incapaces de dar una respuesta.
Debido a ello, son procedimientos de uso frecuente por fsicos e ingenieros, y cuyo desarrollo se ha
visto favorecido por la necesidad de stos de obtener soluciones, aunque la precisin no sea
completa. Debe recordarse que la fsica experimental, por ejemplo, nunca arroja valores exactos
sino intervalos que engloban la gran mayora de resultados experimentales obtenidos, ya que no es
habitual que dos medidas del mismo fenmeno arrojen valores exactamente iguales.

Conclusiones
El estudio de los mtodos numricos, es muy til y por ende importante para quien utilice esta
herramientas para resolucin de operaciones, las cuales se saben que pueden resultar complicadas,
tediosas y largas, y por ms que se dominen los mtodos tradicionales, estos muchas veces pueden
no ser suficientes, sin embargo esto no quiere decir que la operacin sea imposible de solucionar, y
es ah donde los mtodos numricos se aplican, y facilitan es trabajo de cierta manera.
Dentro del estudio de los mtodos numricos, se encuentran una gran variedad de aplicaciones
como lo fue el descrito en el presente trabajo referido al mtodo de runge kutta, que tiene como
objetivo principal el anlisis y solucin de los problemas de valor inicial de ecuaciones diferenciales
ordinarias, siendo estos una extensin del mtodo de Euler para resolverlas, pero con un orden de
exactitud ms alto que este, logrando as la exactitud del procedimiento sin requerir el clculo de
derivadas superiores Por tal razn se toma como un mtodo de gran facilidad y rapidez lo que lo
hace de gran importancia, ya que debido a estas caractersticas su implantacin resulta ms cmoda
y fcil de manejar, tomando en cuenta a la misma vez la utilizacin de su algoritmo resultando una
gran ventaja a nivel de su desenvolvimiento en la programacin en MATLab. El mecanismo est
basado en la aplicacin de ecuaciones matemticas de gran facilidad de empleo, siendo esta otra
caracterstica positiva. Este mtodo es de gran aplicabilidad en diversas reas de la industria lo que
lo hace muy usado en distintos niveles.

El mtodo de runge kutta es empleado para la resolucin de ecuaciones diferenciales. Los


mtodos Runge-Kutta o mtodos Runge-Kutta-Fehlberg. Consiste en ir aproximando la
solucin de la ecuacin mediante dos algoritmos Runge-Kutta de rdenes diferentes, para
as mantener el error acotado y hacer una buena eleccin de paso.

El mtodo de Runge Kutta de cuarto orden es una serie de algoritmos para calcular
aproximaciones numricas.

Bibliografa

Chapra, S y Canale, R (2003). Mtodos numricos para ingenieros. Editorial Macgraw Hill. Cuarta
edicin. Mxico.

Calvo, M (1998). El mtodo de Runge-kutta en la resolucin numrica de ecuaciones diferenciales.


Disponible en: http://www.unizar.es/acz/02AcademicosNumerarios/Discursos/Calvo.pdf

C. Conde, E. Schiavi y A.I. Muoz. (2006). Mtodos numricos para La resolucin de problemas de
valor inicial. Disponible en: http://www.escet.urjc.es/~matemati/mm_iq/tema5.pdf

Das könnte Ihnen auch gefallen