Professional Documents
Culture Documents
Práctica 5. Ecuaciones Diferenciales Ordinarias
Práctica 5. Ecuaciones Diferenciales Ordinarias
Curso 2022/23
1. Objetivos
El objetivo de esta práctica es el de implementar y aplicar métodos para resolver dos
tipos de problemas diferentes para ecuaciones diferenciales ordinarias:
Problemas de valores iniciales.
Problemas de contorno.
1
Algoritmo 1: rungekutta4
Entrada: f : función que define el sistema y ′ = f (x, y) de n ecuaciones diferenciales.
a: valor inicial de x, en el cual conocemos la solución.
b: valor final de x.
alfa: vector, de n elementos, con la solución en el extremo inicial (a).
m: número de subintervalos en los que dividimos el intervalo entre a y b.
Resultado: x: vector de abscisas, de longitud m + 1, donde se obtiene la solución.
y: matriz de resultados, de (m + 1) filas y n columnas.
b−a
1 h=
m
2 x1 = a
3 y1 = alfa
4 para i ∈ rango(m) hacer
5 xi+1 = a + ih
6 k1 = f (xi , yi )
7 k2 = f (xi + h2 , yi + h2 k1)
8 k3 = f (xi + h2 , yi + h2 k2)
9 k4 = f (xi + h, yi + h k3)
10 yi+1 = yi + h6 (k1 + 2 k2 + 2 k3 + k4)
11 fin para
Podemos usar 4 variables distintas para k1, k2, k3 y k4 (en vez de un único array).
Cada una de estas variables será un array.
El algoritmo usa la notación y1 , y2 , y3 ,... para referirse a cada una de las filas de la
matriz y. En Python, nos referimos a cada fila del array y como y[0], y[1], y[2]... (o
bien y[0,:], y[1,:], y[2,:]...)
2
Ejercicio 1.
Implementa en Python la función rungekutta4, correspondiente al Algoritmo 1, para
resolver sistemas de ecuaciones diferenciales de primer orden mediante el método de
Runga-Kutta de orden 4.
Ejercicio 2.
Resuelve el siguiente problema mediante la función rungekutta4, usando 10 interva-
los:
y ′ − y + x2 − 1 = 0, x ∈ [1, 3]
y(1) = 2.64086
Solución:
3
x y(x)
1 2.64086
1.2 3.17994
1.4 3.7324
... ...
2.6 6.22814
2.8 6.2177
3 5.95727
Podemos juntar los valores de x e y en una sola matriz, de forma que se visualice
como la tabla anterior. Para ello, ejecutamos:
>>> np.hstack((x[:,np.newaxis],y))
En general, la variable y será una matriz de n columnas, donde cada columna será una
variable dependiente distinta. En ese caso, la gráfica tendrá una línea por cada columna, y
deberemos etiquetar cada línea con el nombre de la variable correspondiente. Supongamos,
por ejemplo, que y tiene 3 columnas, correspondientes a las variables u1 , u2 y u3 . Para obtener
la gráfica, haríamos:
>>> plt.plot(x,y,label=['u1','u2','u3'])
>>> plt.legend()
Ejercicio 3.
Representa gráficamente la solución obtenida en el ejercicio anterior. Deberías obtener
una gráfica como la de la figura 1.
Ejercicio 4.
Resuelve, mediante la función rungekutta4, el siguiente sistema de ecuaciones dife-
renciales de orden 1, usando 10 intervalos:
4
Figura 1: Gráfica correspondiente al ejercicio 3.
5
Figura 2: Gráfica de la solución del ejercicio 4
En la línea 2, puedes usar x[:4] e y[:4] para indicar los primeros 4 elementos de x y
las primeras 4 filas de y, respectivamente. Al llamar a rungekutta4, los valores de los
6
argumentos b y m deben corresponder a los 3 primeros subintervalos.
Ejercicio 5.
Implementa en Python la función adamsbas4, correspondiente al Algoritmo 2, para
resolver sistemas de ecuaciones diferenciales de primer orden mediante el método de
Adams-Bashforth de orden 4.
Ejercicio 6.
Vuelve a resolver el problema del ejercicio 2, usando en este caso la función adamsbas4
(de nuevo con 10 intervalos).
Solución: Fíjate sobre todo en los últimos valores (los primeros se calculan con el
método de Runge-Kutta).
x y(x)
1 2.64086
1.2 3.17994
1.4 3.7324
... ...
2.6 6.23086
2.8 6.22168
3 5.96295
En el siguiente ejercicio se pide resolver una ecuación diferencial de orden mayor que 1.
Para ello, habrá que transformar la ecuación en un sistema de ecuaciones diferenciales de
orden 1.
Ejercicio 7.
Resolver, mediante el método de Adams-Bashforth de orden 4, la siguiente ecuación
diferencial:
y ′′ − 2y ′ + 2y = e2x sen x, 0≤x≤1
con las condiciones iniciales )
y(1) = −0.3
y ′ (1) = 2.6
Solución:
Observa que en este caso vamos de a = 1 hasta b = 0.
7
x y(x) y ′ (x)
1 -0.3 2.6
0.9 -0.505462 1.56163
0.8 -0.621632 0.802945
... ... ...
0.2 -0.497611 -0.604008
0.1 -0.437162 -0.596985
0 -0.378676 -0.567239
Si los resultados no coinciden, comprueba que el sistema de orden 1 obtenido es:
u′1 = u2
)
,
u′2 = 2u2 − 2u1 + e2x sen x
Ejercicio 8.
Representa gráficamente la solución del ejercicio anterior.
Deberías obtener una gráfica como la de la figura 3.
8
La figura 3 muestra las variables u1 y u2 , que corresponden a y e y ′ , respectivamen-
te. A menudo nos interesará únicamente el valor de y. En ese caso, para hacer la gráfica,
ejecutaremos:
>>> plt.plot(x,y[:,0]) # Usar solo la columna 0 de la matriz y
Más en general, puede que nos interese hacer una gráfica solo de algunas de las variables
(columnas) de la matriz y. Por ejemplo, si solo nos interesan las columnas 0 y 3, haremos:
>>> plt.plot(x,y[:,(0,3)],label=['u1','u4'])
>>> plt.legend()
Ejercicio 9.
Resuelve, mediante el método del disparo, la siguiente ecuación diferencial:
y ′′ = −(y ′ )2 − y + ln(x), 1 ≤ x ≤ 2,
9
Algoritmo 3: disparo
Entrada: f : función que define la ecuación diferencial y ′′ = f (x, y, y ′ )
a, b: valor inicial y valor final de x, respectivamente
alfa: solución (escalar) en el extremo inicial (a).
beta: solución (escalar) en el extremo final (b).
m: número de subintervalos en los que dividimos el intervalo entre a y b.
t0: valor inicial de y ′ (a).
tol: tolerancia máxima para |y(b) − beta|.
maxiter: número máximo de iteraciones.
Resultado: x: vector de abscisas, de longitud m + 1, donde se obtiene la solución.
y: matriz de resultados, de (m + 1) filas y 2 columnas.
1 Definir la función g(x, u) del sistema de orden 1 equivalente:
u′1 = u2
)
10
Solución:
x y(x) y ′ (x)
1 0 1
1.1 0.09531 0.909092
1.2 0.182321 0.833334
... ... ...
1.8 0.587787 0.555556
1.9 0.641854 0.526316
2 0.693147 0.5
La gráfica correspondiente de y(x) puede verse en la Figura 4.
Si la solución no coincide, comprueba que la función f (x, y, y ′ ) que has utilizado es
correcta. Por ejemplo:
f (0.3, 0.6, 0.8) = −2.44397.
11