guión - Unican.es

Anuncio
PRÁCTICAS DE CÁLCULO NUMÉRICO AVANZADO
PRÁCTICA 2: 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 − 1 , 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
p̃N
max |en |
1
1≤n≤N


log
=
log 2
max |en |


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):
Descargar