P. 1
Metodo de Runge Kutta

Metodo de Runge Kutta

|Views: 7.606|Likes:
Investigacion de Metodo de Runge Kutta y su implementación en JAVA, C++ y MATLAB
Investigacion de Metodo de Runge Kutta y su implementación en JAVA, C++ y MATLAB

More info:

Categories:Types, Research
Published by: José Manuel Limachi Chávez on Jul 14, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOCX, PDF, TXT or read online from Scribd
See more
See less

07/19/2013

pdf

text

original

UNIVERSIDAD PERUANA UNION FACULTAD DE INGENIERIA Y ARQUITECTURA EAP Ingeniería de sistemas

PROYECTO DE INVESTIGACION El Metodo de Runge Kutta

Trabajo presentado en cumplimiento de la asignatura Métodos Numéricos

Autor: Alumno: José Manuel Limachi Chávez

Docente: Braulio Gutierrez Pari

Juliaca ± 2011

RUNGE-KUTTA El método de Runge Kutta es un método numérico de resolución de ecuaciones diferenciales que surge como una mejora del método de Euler. El método de Euler se puede considerar como un método de Runge Kutta de primer orden, el de Heun, es un método de Runge Kutta de orden dos. Los métodos de Runge-Kutta logran la exactitud del procedimiento de una serie de Taylor sin requerir el cálculo de derivadas superiores. Existen muchas variaciones, pero todas se pueden denotar en la forma generalizada de la ecuación yi + 1 = yi + F(xi,yi,h)h Donde F(xi,yi,h) se conoce como la función incremento la cual puede interpretarse como una pendiente representativa en el intervalo. La función 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 evaluación funcional, esta recurrencia hace que los métodos Runge-Kutta sean eficientes para la programación. Existen varios tipos de métodos Runge-Kutta al emplear diferentes números de términos en la función incremento como la especificada por n. n = 1, es el método de Euler. Una vez se elige n, se evalúan las a, p y q al igualar la función incremento a los términos en la serie de expansión de Taylor. La versión de segundo orden para la ecuación en su forma generalizada es:

Donde:

Los valores de a1, a2, p1 y q11 son evaluados al igualar el término de segundo orden de la ecuación dada con la expansión de la serie de Taylor. Desarrollando tres ecuaciones para evaluar las cuatro incógnitas:

Como se tienen tres ecuaciones con cuatro incógnitas se tiene que suponer el valor de una de ellas. Suponiendo que se especificó un valor para a2, se puede resolver de manera simultánea el sistema de ecuaciones obtenido:

Como se puede elegir un número infinito de valores para a2, hay un número infinito de métodos Runge-Kutta de segundo orden. a2 = 1/2: Método de Heun con un solo corrector, donde:

a2 = 1 : Método del punto medio.

a2 = 2/3: Método de Ralston.

Siguiendo el mismo razonamiento para n = 3, o sea, Runge-Kutta de tercer orden, el resultado son seis ecuaciones con ocho incógnitas, por lo tanto se deben suponer dos valores con antelación para poder desarrollar el sistema de ecuaciones. Una versión ampliamente usada es:

Éste

es

el

más

popular

de

los

métodos

Runge-Kutta

de

cuarto

orden:

Ejemplo Runge ±Kutta para segundo orden, método 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 Solución

y i 1 ! y i 
1

2

h

! ( i yi )

2

= (

i

1 1  h yi  2 2

1

h)

Primera iteración

k !
k1 ! 1.2
¢ ¡

2

¥

! f x  h , y 
¦ £

 

 

!

! !

¡ ¤ 

.2

kh

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 iteración

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 iteración

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 1 1 (0.25) , 0.578319  ( 0.549403)(0.25)) 2 2

k 2 ! f (0.5 

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 iteración

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 1 1 (0.25) , 0.4752  ( 0.3029)(0.25)) 2 2

k 2 ! f ( 0.75 

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 solución

X 0 y

0.25

0.5

0.75

1

1 0.7483 0.5783 0.4752 0.4277

Algoritmo MATLAB- Segundo orden %Método 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 %Cálculo 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('Método 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 método 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 Solución. En el método 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 iteración

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 

1 1 h , y 0  k1 h ) 2 2

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.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 iteración

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 1 1 (0.25) , 0.7445  (0.8469)(0.25)) 2 2

k 2 ! f ( 0.25 

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 iteración

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 iteración

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 1 1 (0.25) , 0.4679  ( 0.2983)(0.25)) 2 2

k 2 ! f ( 0.75 

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 solución

X 0 0.25 y

0.5

0.75

1

1 0.7445 0.5720 0.4679 0.4206

Algoritmo MATLAB- Tercer orden %Método 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 %Cálculo 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('Método runge kutta Tercer orden. y vs t'); xlabel ('valores t'); ylabel ('valores y');

Runge ±Kutta para cuarto orden.

Los llamados métodos de Runge-Kutta son una serie de algoritmos para calcular aproximaciones numéricas del valor de la solución de: 

En puntos de la forma siguiente:

x1 ! x0  h ; x2 ! x1  h ; etc

Con muy buena precisión, sin que, para ello, sea necesario que los h sean muy pequeños. El procedimiento consta de los siguientes pasos:

Para calcular un valor aproximado de la solución 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 subintervalos a emplear:

}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);

} 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);

Aplicación Los métodos numéricos son técnicas, donde es posible resolver los problemas por medio de operaciones aritméticas, estos métodos implementan un buen numero de cálculos que son por demás demasiado lentos si se hacen manualmente, gastando mucha energía en la técnica misma de solución en vez de aplicarla sobre la definición del problema y su interpretación. El trabajo monótono que se hacía anteriormente al uso de la computadora, hace de importancia, el dominio de los métodos numéricos, los cuales se deben llevar a cabo en combinación con las capacidades y potencialidades de la programación de computadoras para de esa forma resolver los problemas de ingeniería mucho más fácilmente y eficientemente. En general, estos métodos se aplican cuando se necesita un valor numérico como solución a un problema matemático, y los procedimientos "exactos" o "analíticos" (manipulaciones algebraicas,

teoría de ecuaciones diferenciales, métodos de integración, etc.) son incapaces de dar una respuesta. Debido a ello, son procedimientos de uso frecuente por físicos e ingenieros, y cuyo desarrollo se ha visto favorecido por la necesidad de éstos de obtener soluciones, aunque la precisión no sea completa. Debe recordarse que la física experimental, por ejemplo, nunca arroja valores exactos sino intervalos que engloban la gran mayoría de resultados experimentales obtenidos, ya que no es habitual que dos medidas del mismo fenómeno arrojen valores exactamente iguales.

Conclusiones El estudio de los métodos numéricos, es muy útil y por ende importante para quien utilice esta herramientas para resolución de operaciones, las cuales se saben que pueden resultar complicadas, tediosas y largas, y por más que se dominen los métodos tradicionales, estos muchas veces pueden no ser suficientes, sin embargo esto no quiere decir que la operación sea imposible de solucionar, y es ahí donde los métodos numéricos se aplican, y facilitan es trabajo de cierta manera. Dentro del estudio de los métodos numéricos, se encuentran una gran variedad de aplicaciones como lo fue el descrito en el presente trabajo referido al método de runge kutta, que tiene como objetivo principal el análisis y solución de los problemas de valor inicial de ecuaciones diferenciales ordinarias, siendo estos una extensión del método de Euler para resolverlas, pero con un orden de exactitud más alto que este, logrando así la exactitud del procedimiento sin requerir el cálculo de derivadas superiores Por tal razón se toma como un método de gran facilidad y rapidez lo que lo hace de gran importancia, ya que debido a estas características su implantación resulta más cómoda y fácil de manejar, tomando en cuenta a la misma vez la utilización de su algoritmo resultando una gran ventaja a nivel de su desenvolvimiento en la programación en MATLab. El mecanismo está basado en la aplicación de ecuaciones matemáticas de gran facilidad de empleo, siendo esta otra característica positiva. Este método es de gran aplicabilidad en diversas áreas de la industria lo que lo hace muy usado en distintos niveles.

El método de runge kutta es empleado para la resolución de ecuaciones diferenciales. Los métodos Runge-Kutta o métodos Runge-Kutta-Fehlberg. Consiste en ir aproximando la solución de la ecuación mediante dos algoritmos Runge-Kutta de órdenes diferentes, para así mantener el error acotado y hacer una buena elección de paso.

El método de Runge Kutta de cuarto orden es una serie de algoritmos para calcular aproximaciones numéricas.

Bibliografía

Chapra, S y Canale, R (2003). Métodos numéricos para ingenieros. Editorial Macgraw Hill. Cuarta edición. México.

Calvo, M (1998). El método de Runge-kutta en la resolución numérica de ecuaciones diferenciales. Disponible en: http://www.unizar.es/acz/02AcademicosNumerarios/Discursos/Calvo.pdf

C. Conde, E. Schiavi y A.I. Muñoz. (2006). Métodos numéricos para La resolución de problemas de valor inicial. Disponible en: http://www.escet.urjc.es/~matemati/mm_iq/tema5.pdf

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->