Calculo Numérico II Curso 0-3, Segundo Cuatrimestre Práctica 3: Métodos Runge-Kutta Implícitos Guión de la práctica: En esta práctica implementaremos en MATLAB los métodos Runge-Kutta implícitos para resolver el problema de valor inicial (PVI): u 0 vector de tamaño m Runge-Kutta Implícitos (IRK) u = f(t, u), u(t 0 ) = u 0, Un método Runge-Kutta implícito IRK(A, b) viene dado mediante las fórmulas: U i =u n + h a ij f(t n + c j h, U j ), i =,, s, j= u n+ = u n + h b j f(t n + c j h, U j ), j= donde A es una matriz cuadrada de orden s y b es el vector pesos de tamaño s Los nodos temporales en los pasos parciales satisface la siguiente condición: c i = a ij 3 Resolución numérica de las ecuaciones implícitas de los IRK j= Como ya sabemos, en los métodos IRK cada vez que damos un paso (t n, u n ) h un sistema implícito de dimensión ms para calcular las s etapas del método: (t n+, u n+ ) hay que resolver U = e u n + h(a I)F (U), (SI) donde U = U U s, F (U) = f(t n + c h, U ) f(t n + c s h, U s ) Aquí e = (,,, ) T y denota el producto de Kronecker Este producto se define de la siguiente manera para A matriz M(m,n), B matriz M(s,l), entonces A es una matriz M(ml,sn) tal que: Notas de prácticas de Jezabel Curbelo
a a a n b b b l a a a n b b b l a m a m a mn b s b s b sl a b a b a b l a n b a n b a n b l a b a b a b l a n b a n b a n b l a b s a b s a b sl a n b s a n b s a n b sl = a m b a m b a m b l a mn b a mn b a mn b l a m b a m b a m b l a mn b a mn b a mn b l a m b s a m b s a m b sl a mn b s a mn b s a mn b sl Vamos a ver diferentes métodos numéricos que resuelven el sistema implícito (SI) 3 Iteración funcional (IF) La iteración funcional se calcula como: U k+ = e u n + h(a I)F (U k ), k = 0,, Partiendo de una iteración U 0 que normalmente se suele tomar U 0 = e u n 3 Método de Newton (MN) La idea es aplicar el método de Newton clásico, es decir, buscar un cero de la función f(x) mediante la iteración x n+ = x n f(x n) f (x n ) Así, aplicamos el método de Newton clásico (vectorial) a la ecuación: Para ello, calculamos su derivada con y G(U) := U e u n h(a I)F (U) = 0 G (U) = I h(a I)J(U), J(U) := F U (U) = blkdiag(j,, J s ) = J (U) 0 0 J s (U) J i (U) = f u (t n + c i h, U i ) Notar que blkdiag es el comando en Matlab que nos hace la matriz indicada Ahora, partiendo de un valor inicial U 0, resulta el esquema (MN): [I h(a I)J k k = G(U k ),, U k+ = U k + k, k = 0,,, ()
donde J k = F U (U k ) = blkdiag(j k,, J k s ), J k i = f u (t n + c i h, U k i ), i s 33 Método de Newton modificado o Quasi-Newton (QN) El método anterior es demasiado costoso pues hay que calcular en cada iteración n una evaluación del jacobiano de dimension ms en s puntos distintos y resolver un sistema lineal Por eso se prefieren algunas variaciones que son más baratas computacionalmente El método más usado en la práctica, es el método de Newton modificado o Quasi-Newton Es una modificación del (MN) que reduce su coste sustituyendo en () la matriz jacobiana J k de cada iteración k por la matriz: J k J 0 0 J donde J f u (t n, u n ) Así la matriz jacobiana sólo se evalúa una vez por paso y los sistemas lineales tienen la misma matriz de coeficientes para todas las iteraciones del mismo paso (lo que implica una sola descomposición LU por paso), resulta el esquema QN : arrancando de una aproximación inicial U 0 4 Programa Matlab La función a construir es la siguiente: [I h(a J) k = G(U k ) U k+ = U k + k, k = 0,,, function [u,t,it=rkimplicito(f,df,tf,t0,h,u0,a,b,met,tol,itmax) Esta función resuelve el problema de valor inicial u =f(t,u) u(t0)=u0 utilizandodo un método Runge-Kutta implicito [u,t,it=rkimplicito(f,df,tf,t0,h,u0,a,b,c,met,tol,itmax) Variables de Entrada: f: vector columna función que rige el sistema de EDO, tiene dos argumentos f(t,u) donde t es escalar (ó vector) y u vector columna df: el jacobiano de f con respecto de u h : tamaño del paso t0: tiempo inicial
tf: tiempo final u0: vector columna Dato inicial b,a: coeficientes del tablero de BUTCHER Met: Variable que indica el método utilizado para resolver el sistema implícito Met= IF (iteración funcional), MN (Newton), QN (Newton Modificado) tol: tolerancia para las iteraciones itmax: Número máximo de iteraciones Variables de Salida: u: matriz de length(u0) x length(t) que contiene la solución t: vector de tiempos it: Vector que contiene el numero de iteraciones utilizadas, para cada tiempo, en los métodos de tipo Newton o en la iteración funcional Tableros de Butcher que usaremos: Método de Gauss: Regla Implícita del punto medio (orden ) Radau IIA: Euler Implícito Lobatto IIIA Regla Trapezoidal 0 0 0 / / / / Método de Gauss 0 + 0 36 36 + 4 36 + 30 8 9 9 9 + 4 9 36 30 36 4 36 8 Comentarios: Para realizar esta práctica se puede implementar todas las funciones o ficheros m auxiliares que se necesiten aparte de los citados aquí Ejercicios: Utilizar la función Runge-Kutta implícito para resolver los problemas de valor inicial: a) Para t [0, 0, [ u = [ u(0) = 3 [ u + sin(t) (cos(t) sin(t))
b) Para t [0, 0, [ u = 998 [ 999 u(0) = 3 [ u + sin(t) 999(cos(t) sin(t)) c) Modelo para la dinámica de poblaciones Lotka-Volterra dx = x(α βy) dt dy = y(γ δx) dt Con este modelo se pretende describir la evolución de la población y (presas) que es cazada por otra especie x (depredadores) La constante γ nos indica el crecimiento natural de la población de presas, α la tasa de mortalidad de la población de depredadores, δ y β la variación de la población de presas y depredadores debido a la interacción de ambas especies Tomaremos para este ejercicio α =, β =, γ =, y δ =, y con dato inicial x(0) =, x(0) = 3 Representar gráficamente la solución aproximada utilizando los diferentes tableros de BUTCHER 3 Representar gráficamente en escala doblemente logarítmica las poligonales formadas por los valores (h, error), (h, max(it)) para una cantidad significativa de valores de h 6 Observaciones para Matlab indica el producto de Kronecker En matlab este producto se hace con la función kron I indica la matriz identidad, en MATLAB se pueden crear de diferentes tamaños utilizando el comando eye Para generar vectores o matrices de unos, se utiliza el comando one Para resolver el sistema Ax = b, se suele utilizar x = A b Para seleccionar el método deseado podemos copiar este código que utiliza el comando switch case: switch Met case IT [U,it(n+)= Iteracion_Funcional(f,t(n),u(:,n),h,A,c,tol,itmax); case MN [U,it(n+)= Metodo_Newton(f,df,t(n),u(:,n),h,A,c,tol,itmax); case QN [U,it(n+)= Quasi_Newton(f,df,t(n),u(:,n),h,A,c,tol,itmax); otherwise disp( No es un metodo valido ) end Para consultar cada comando, se puedo usar help