PRÁCTICAS DE CÁLCULO NUMÉRICO III PRÁCTICA 4: El método de Euler explı́cito y el método trapezoidal. En esta práctica implementaremos el método de Euler y el trapezoidal para ecuaciones escalares de primer orden, estudiando su orden de convergencia. Asimismo, implementaremos el método de Euler para sistemas y lo aplicaremos a la resolución de una importante ecuación no-lineal de segundo orden: la que describe el movimiento del péndulo simple. 1 El método de Euler Vamos a crear, en primer lugar, la función euler.m que implementa el método de Euler explı́cito: b−a N Esta función tendrá la siguiente sintaxis: [t,y]=euler(a,b,yini,N), donde las entradas: a, b, yini y N tendrán los valores numéricos asociados con el problema de valores iniciales a resolver (intervalo [a, b]; valor inicial yini; número de puntos N ). Las salidas de la función euler.m serán los vectores tiempo t y el vector y conteniendo la solución aproximada en los sucesivos instantes temporales. Crearemos un fichero f.m donde estará implementada la función f que corresponda en cada caso. Se pide lo siguiente: yn+1 = yn + hf (tn , yn ) , n = 0, ..., N , h = 1. Utilizando el método de Euler, resolver el problema: y 0 = −y , 0 ≤ t ≤ 3 , y(0) = 1 . El fichero f.m deberá en este caso implementar la función f (t, y) = −y. Dibujar la solución para N=16. Crear un vector de N+1 componentes correspondiente a la solución exacta y(t) = e−t en t = {t0 , t2 , ..., tN } (donde t0 = a y tN = b). Dibujar la solución exacta en el mismo gráfico que la aproximación de Euler anterior. 2. Crear un vector de N+1 componentes que contenga el error absoluto del método en cada paso y representar en otra figura el error absoluto como función de t utilizando el comando semilogy. 3. Ejecutar el programa para N = 8, 16, 32, 64, 128 y dibujar en un mismo gráfico los errores absolutos cometidos en cada caso. Almacenar en un vector los correspondientes errores máximos para cada valor de N ; un comando útil para obtener los valores máximos es max. Conviene recordar que el modo que tiene MATLAB, por defecto, de presentación de números es con 4 decimales. Ası́, obviamente, no podrı́amos distinguir cantidades inferiores a 0.00005. Es conveniente entonces teclear previamente format short e antes de calcular el error para ası́ mostrar los valores en notación cientı́fica. Estimar el orden de convergencia p̃N del método calculando max |en | 1 1≤n≤N = log log 2 max |en | p̃N 1≤n≤2N para N = 8, 16, 32, 64 (max1≤n≤N |en | representa el máximo de los errores absolutos obtenidos con N pasos). ¿Es consistente con lo que cabrı́a esperar?. 2 El método trapezoidal Vamos ahora a comparar el funcionamiento del método de Euler explı́cito con un método implı́cito. El método trapezoidal responde al algoritmo: h (f (tn , yn ) + f (tn+1 , yn+1 )) 2 Es decir, en el paso n + 1-ésimo hemos de resolver la (generalmente no lineal) ecuación yn+1 = yn + g(yn+1 ) ≡ yn+1 − yn − h (f (tn , yn ) + f (tn+1 , yn+1 )) = 0 2 (2.1) para obtener la incógnita yn+1 . Llegados a este punto, hemos de optar por un método numérico de resolución de ecuaciones no lineales (bisección, secante, Newton, punto fijo). En la programación de nuestro algoritmo utilizaremos el método de Newton, que producirá convergencia rápida siempre que el valor inicial sea próxima a la solución de la ecuación (2.1); puesto que se supone que yn e yn+1 serán valores próximos, utilizaremos yn como estimación inicial para iniciar el Newton (otra opción puede ser, por ejemplo, utilizar la estimación que da el método de Euler). En su implementación será conveniente que introduzcamos dos parámetros: la tolerancia al error (toln) que fijaremos a una valor que nos resulte aceptable (10−8 , por ej.) y el número máximo de iteraciones (itmax) que permitimos en el Newton (50, por ej.). Por otra parte, podemos observar que, además del fichero f.m, necesitaremos crear también el fichero dfy.m, que implemente ∂f /∂y en cada caso. La rutina para este método tendrá la misma estructura de entradas y salidas que la anterior y la escribiremos en el fichero trap.m. Se pide: 4. Resolver el problema del apartado 1 utilizando el método implı́cito. Repetir los apartados 1, 2 y 3 anteriores. 3 Aplicación al péndulo simple Para resolver numéricamente el problema del péndulo simple, necesitaremos modificar la rutina Euler para que sea aplicable a un sistema de EDOs de primer orden. Se pide construir tal rutina (que llamaremos eulersis.m). Aplicaremos entonces la rutina anterior a la resolución de la EDO que describe el movimiento de un péndulo simple d2 θ + g sin θ = 0. dt2 Para ello, definiendo ω = θ0 , escribimos el sistema equivalente L θ0 = ω g sin θ ω0 = − L y aplicaremos la modificación del método de Euler (eulersis.m) para resolver el problema de condiciones iniciales θ(0) = θm , ω(0) = 0; este problema es el de un péndulo simple que en el instante t = 0 se libera, con velocidad cero, desde su ángulo máximo de desplazamiento θm (es decir, que θm es la amplitud de oscilación). Podemos comparar esta solución con la solución analı́tica del problema: θ(t) = 2 arcsin(λ sn(ω0 t + φ, λ)) p siendo ω0 = g/L, λ = sin(θm /2) y φ = K(λ). K es la integral elı́ptica completa de primera especie (se puede calcular en MATLAB mediante la función ellipke(λ2 )). Por último, sn(u, λ) es una función elı́ptica de Jacobi, que se puede evaluar mediante la función de MATLAB ellipj(u,λ2 ). Deberemos estudiar cómo es la comparación de la aproximación dada por el método de Euler con la solución analı́tica. Para ello, se sugiere animar el movimiento del péndulo utilizando la solución numérica y comparar esta animación con la de la solución analı́tica. Para animar el movimiento del péndulo utilizaremos la función penanim, que está disponible en la página web de la asignatura. También será conveniente representar gráficamente las dos soluciones. 4 Una modificación del método de Euler Escribiendo el método de Euler de forma explı́cita para el péndulo simple tenemos: ωn+1 = ωn − hω02 sin θn θn+1 = θn + hωn Se propone implementar la siguiente modificación, conocida como método de EulerCromer: ωn+1 = ωn − hω02 sin θn θn+1 = θn + hωn+1 y comparar los resultados obtenidos mediante este método, con los dos métodos anteriores (Euler y solución analı́tica):