Anda di halaman 1dari 7

PRÁCTICA

SOLUCIÓN DE ECUACIONES Y SISTEMAS DE ECUACIONES DIFERENCIALES


Objetivos
El alumno conocerá y aplicará diversos métodos para la resolución de sistemas y
ecuaciones diferenciales, implementando programas orientados a objetos.

Al final de esta práctica el alumno podrá:

Resolver ecuaciones diferenciales por diferentes métodos.


Usar un lenguaje orientado a objetos para implementar dichos métodos

Antecedentes

1. Haber elaborado programas orientados a objetos en lenguaje Java.


2. Haber manejado ecuaciones diferenciales.

Introducción

MÉTODO DE EULER

Es un método sencillo que se utiliza para la integración de ecuaciones diferenciales de


primer orden.
dy
Sea = f ( x, y ) con la condición de entorno: y ( x0 ) = y0
dx
Supongamos que y(x) es la solución exacta del problema. Si tomamos un valor de x y lo
suficientemente próximo a x0 , podemos tomar la siguiente aproximación:
dy
y ( x) ≅ y ( x0 ) + ( x − x0 )
dx X0

dy
y ( x) ≅ y ( x0 ) + ( x − x0 ) = y 0 + f ( x − x0 )
dx X0

Así, si por ejemplo, tomamos un valor x1 = x0 + h , podemos calcular el valor


correspondiente y1 = y ( x1 ) del siguiente modo:

x1 = x0 + h
y1 ≅ y o + f ( xo , y o )h

Si ahora quisiéramos calcular la solución en un punto superior, partiríamos de:


dy
= f ( x, y ) , con la nueva condición (aproximada) de entorno: y ( x1 ) ≅ y1
dx

Si se denotan por y1,...,yN los valores aproximados correspondientes a los valores exactos
y(x1),..., y(xN), entonces quedaría como sigue:

Elaborada por: Programación Avanzada y Métodos Numéricos


Ing. Laura Sandoval Montaño
Viridiana del Carmen De Luna Bonilla
Virgilio Green Pérez
PRÁCTICA
SOLUCIÓN DE ECUACIONES Y SISTEMAS DE ECUACIONES DIFERENCIALES
dado y0 se calcula y1 mediante: y1 = y 0 + hf ( x0 , y 0 ) , y2 mediante y 2 = y1 + hf ( x1 , y1 ) , y así
sucesivamente… y N = y N −1 + hf ( x N −1 , y N −1 ) . De manera general se obtiene la siguiente
expresión: y k +1 = y k + hf ( x k , y k ) k = 0,1,..., N − 1

Ejemplo: Utilizar el método de Euler para aproximar el valor de la solución de la siguiente


ecuación diferencial en el punto x = 1, usando h = 0.2 y h = 0.1.

dy
f ( x, y ) = = 2 x + y; y (0) = 1
dx
h=0.2:
x1 = x0 + h = 0 + 0.2 = 0.2
y1 ≅ y 0 + f ( x0 , y 0 )h = 1 + (1 × 0.2 ) = 1.2
x 2 = x1 + h = 0.2 + 0.2 = 0.4
y 2 ≅ y1 + f ( x1 , y1 )h = 1.2 + (1.6 × 0.2 ) = 1.52
x3 = x 2 + h = 0.4 + 0.2 = 0.6
y 3 ≅ y 2 + f ( x 2 , y 2 )h = 1.52 + (2.32 × 0.2 ) = 1.984
x 4 = x3 + h = 0.6 + 0.2 = 0.8
y 4 ≅ y 3 + f ( x3 , y 3 )h = 1.984 + (3.184 × 0.2) = 2.6208
x5 = x 4 + h = 0.8 + 0.2 = 1.0
y 5 ≅ y 4 + f ( x 4 , y 4 )h = 2.6208 + (4.2208 × 0.2 ) = 3.46496
h=0.1:
x10 = x10 + h = 0.9 + 0.1 = 1.0
y10 ≅ y10 + f ( x10 , y10 )h = 3.273843 + (5.073843 × 0.1) = 3.7812273

Vemos que obtenemos valores distintos de los que habíamos calculado para h = 0.2. Cuanto
menor sea h, mejor será la aproximación (aunque también más laboriosa). Para una h
constante el error será tanto mayor cuanto más nos alejemos del punto inicial, como puede
apreciarse en la gráfica siguiente en la que comparamos las dos soluciones aproximadas
con la solución exacta.

Elaborada por: Programación Avanzada y Métodos Numéricos


Ing. Laura Sandoval Montaño
Viridiana del Carmen De Luna Bonilla
Virgilio Green Pérez
PRÁCTICA
SOLUCIÓN DE ECUACIONES Y SISTEMAS DE ECUACIONES DIFERENCIALES

4.5

3.5

2.5 h=0.2
h=0.1
2
exacta
1.5

0.5

0
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1

y ( x) = −2( x + 1) + 3e x

Codificando el método anterior para resolver la misma ecuación diferencial, se tiene:

public class Euler{


double h;
int dec;
double xo;
double yo;
double xi;
double yi;
double xii;
double yii;
double xf;

public static void main (String[] args){


try{
Redondear r = new Redondear();
Euler euler = new Euler();
euler.h = Double.parseDouble( args[0] );
euler.dec = Integer.parseInt(args[1]);
euler.xo = Double.parseDouble( args[2] );
euler.yo = Double.parseDouble( args[3] );
euler.xf = Double.parseDouble(args[4] );
euler.xi = euler.xo;
euler.yi = euler.yo;

//Se inician las iteraciones


for(int i = 0;euler.xi<euler.xf;i++){
euler.xii = r.redondeo(euler.xi + euler.h,euler.dec);
euler.yii = euler.yi + euler.funcion(euler.xi,euler.yi) *
euler.h;
euler.xi = euler.xii;
euler.yi = euler.yii;
}
//Se imprime la solución
System.out.println("La aproximacion de la ecuacion diferencial
Elaborada por: Programación Avanzada y Métodos Numéricos
Ing. Laura Sandoval Montaño
Viridiana del Carmen De Luna Bonilla
Virgilio Green Pérez
PRÁCTICA
SOLUCIÓN DE ECUACIONES Y SISTEMAS DE ECUACIONES DIFERENCIALES
en "+euler.xii+" es : "+euler.yii);
}
catch(ArrayIndexOutOfBoundsException aioobe){
System.out.println("Faltaron parametros");
System.out.println("Sintaxis: java Euler h decimales x0 y0 xf");
}
}

public double funcion(double x, double y){


double temp;
temp = 2*x+y;
return temp;
}
}

Como se puede observar, únicamente se utiliza un método que evalúe la función a lo largo
de las iteraciones. Del mismo modo, debido a la imprecisión de Java, se vuelve a utilizar la
clase Redondear vista en la práctica anterior.
Esta clase recibe como parámetros el valor de h, el número de decimales para el redondeo
(es recomendable que en este número, si se tiene 0.0035, el número de decimales para el
redondeo sea de 4, o si se tiene 0.001, sea de 3), la condición inicial en x, y, y el valor final.

MÉTODO DE RUNGE – KUTTA

El método de Runge-Kutta no sigue exactamente la misma línea de los métodos de Euler.


De hecho está basado en una aplicación de los polinomios de Taylor.
El método de Runge-Kutta sí contiene como casos especiales los de Euler.
Las fórmulas
1
y n +1 = y n + [k1 + 2k 2 + 2k 3 + k 4 ]
6
donde
k1 = h ⋅ f ( xn , y n )
1 1
k 2 = h ⋅ f x n + h, y n + k1
2 2
1 1
k 3 = h ⋅ f x n + h, y n + k 2
2 2
k 4 = h ⋅ f ( x n + h, y n + k 3 )

Se conocen como las reglas o fórmulas de Runge-Kutta de orden cuatro para la ecuación
diferencial:
y ' = f ( x, y )
y ( x0 ) = y 0

Elaborada por: Programación Avanzada y Métodos Numéricos


Ing. Laura Sandoval Montaño
Viridiana del Carmen De Luna Bonilla
Virgilio Green Pérez
PRÁCTICA
SOLUCIÓN DE ECUACIONES Y SISTEMAS DE ECUACIONES DIFERENCIALES

Ejemplo
Usar el método de Runge-Kutta para aproximar y (0.5) dada la siguiente ecuación
diferencial:
y ' = 2 xy
y (0) = 1
Solución
Primero observamos que esta ecuación sí puede resolverse por métodos tradicionales de
ecuaciones diferenciales. Por ejemplo, podemos aplicar el método de separación de
variables.
Solución Analítica.

dy
= 2 xy
dx
dy
= 2 xdx
y
dy
= 2 xdx
y
ln y = x 2 + c
Sustituyendo la condición inicial:

x = 0 → y =1
ln 1 = 0 2 + c

0=c

Por lo tanto, tenemos que la curva solución real está dada:


ln y = x 2
2
e ln y = e x
2
y = ex

Y por lo tanto, el valor real que se pide es:


2
y (0.5) = e (0.5) = 1.28403

Observamos que la distancia entre x0 = 0 y x1 = 0.5 no es lo suficientemente pequeña. Si


dividimos esta distancia entre cinco obtenemos un valor de h = 0.1 y por lo tanto,
obtendremos la aproximación deseada en cinco pasos.

Si contamos con los datos:

Elaborada por: Programación Avanzada y Métodos Numéricos


Ing. Laura Sandoval Montaño
Viridiana del Carmen De Luna Bonilla
Virgilio Green Pérez
PRÁCTICA
SOLUCIÓN DE ECUACIONES Y SISTEMAS DE ECUACIONES DIFERENCIALES

x0 = 0
y0 = 1
h = 0.1
f ( x, y ) = 2 xy
Para poder calcular el valor de y1 , debemos calcular primeros los valores de k1 , k 2 , k 3 y k 4 .
Tenemos entonces que:

k1 = h ⋅ f ( x0 , y0 ) = 0
1 1
k 2 = h ⋅ f x0 + h, y0 + k1 = 0.1 ⋅ (2(0.05)(0.1)) = 0.01
2 2
1 1
k 3 = h ⋅ f x0 + h, y0 + k 2 = 0.1 ⋅ (2(0.05)(1.005)) = 0.01005
2 2
k 2 = h ⋅ f (x0 + h, y0 + k 3 ) = 0.1 ⋅ (2(0.1)(1.01005)) = 0.020201

1
∴ y1 = y0 + (0 + 2(0.01) + 2(0.01005) + 0.020201) = 1.01005
6
Con el fin de un mayor entendimiento de las fórmulas, veamos la siguiente iteración:
x2 = x1 + h = 0.2
k1 = h ⋅ f ( x1 , y1 ) = 0.1 ⋅ (2(0.1)(1.01005)) = 0.020201
1 1
k 2 = h ⋅ f x1 + h, y1 + k1 = 0.1 ⋅ (2(0.15)(1.02010 )) = 0.03060
2 2
1 1
k 3 = h ⋅ f x1 + h, y1 + k 2 = 0.1 ⋅ (2(0.15)(1.02535)) = 0.03076
2 2
k 4 = h ⋅ f ( x1 + h, y1 + k 3 ) = 0.1 ⋅ (2(0.2)(1.04081)) = 0.04163

1
∴ y 2 = y1 + [k1 + 2k 2 + 2k3 + k 4 ] = 1.04081
6
El proceso debe repetirse hasta obtener y5 .Resumimos los resultados en la siguiente tabla:

n
0 0 1
1 0.1 1.01005
2 0.2 1.04081
3 0.3 1.09417
4 0.4 1.17351
5 0.5 1.28403

Concluimos que el valor obtenido con el método de Runge-Kutta es: .


Elaborada por: Programación Avanzada y Métodos Numéricos
Ing. Laura Sandoval Montaño
Viridiana del Carmen De Luna Bonilla
Virgilio Green Pérez
PRÁCTICA
SOLUCIÓN DE ECUACIONES Y SISTEMAS DE ECUACIONES DIFERENCIALES
EJERCICIOS PROPUESTOS

1. Ejecutar el ejercicio 1 de la práctica en el programa anterior, utilizando h=0.1,0.2 y


0.4.
2. Resolver en el programa del ejercicio 1, la siguiente ecuación diferencial
y' = 2 x + y − 3
y(2)=1
aproximar y(2.3) tomando h=0.1 en cada paso del proceso iterativo.
3. Implementar una clase que resuelva el método de Runge-Kutta.
4. Resolver la ecuación diferencial del ejercicio 2 de la práctica.
5. Resolver la siguiente ecuación diferencial por el método de Euler:
y ' = x + 2 xy
con h=0.1, en un intervalo de 0.5 ≤ x ≤ 1 y con y (0.5) = 1

Elaborada por: Programación Avanzada y Métodos Numéricos


Ing. Laura Sandoval Montaño
Viridiana del Carmen De Luna Bonilla
Virgilio Green Pérez