Ecuaciones Diferenciales O di Ordinarias i Métodos Numéricos y Si Simulación. l ió Segundo de Grado en Física. Física ¿Qué es una ecuación diferencial ordinaria? di i ? • Una ecuación diferencial ordinaria (ODE) es una ecuación en la que la incógnita es una función y(x) y que involucra derivadas de la función incógnita. dy d2y dny B( x, y ) = A1 ( x, y ) + A2 ( x, y ) 2 + ... + An ( x, y ) n dx dx dx • Si n es el orden más alto de derivación que aparece en la ecuación, se dice que la ecuación diferencial es de orden n. • Para resolver la ecuación anterior necesitamos cierta información adicional sobre la función y(x). Dependiendo de la información adicional adicional, se distinguen dos tipos de problemas problemas. Tipos pos de problemas. p ob e as dyy d2y dny B( x, y ) = A1 ( x, y ) + A2 ( x, y ) 2 + ... + An ( x, y ) n dx dx dx • Problemas de condiciones iniciales. iniciales Cuando para un determinado xo, nos dan como dato: yo = y ( xo ) ⎛ dk y ⎞ ⎜⎜ k ⎟⎟ ∀k = 1,..., n − 1 ⎝ dx ⎠ x = xo Y tenemos que encontrar y(x) para todo x>xo. E t problemas Estos bl son los l que estudiaremos t di en esta t lección. l ió • Problemas de condiciones de contorno: Nos dan información de la función y y sus derivadas en dos puntos xo y x1 y tenemos que encontrar y(x) para xo≤x≤x1. Estos problemas los estudiaremos en el siguiente tema. Ejemplo. j p • Si tenemos N núcleos de una especie radioactiva, el número ∆N d núcleos de ú l que experimenta i t desintegración d i t ió radiactiva di ti en un tiempo ti ∆t pequeño (de modo que ∆N/N << 1) es proporcional a N. ∆N = −kN∆t • Esto E t significa i ifi que en cualquier l i instante i t t tt, ell número ú d de núcleos ú l N ha de cumplir la ecuación diferencial ordinaria: dN d = − kN dt • Sabemos que la solución de esta ecuación es: N (t ) = N o e − kt Por poner un ejemplo, suponemos que N está dado en moles, t está dado en horas y k en 1/horas. Clasificando el ejemplo j p Comparando: dN = − kN dt dy d2y dny B( x, y ) = A1 ( x, y ) + A2 ( x, y ) 2 + ... + An ( x, y ) n d dx d dx d dx Podemos hacer las identificaciones: x→t B( x, y ) → −kN y→N A1 ( x, y ) → 1 (que, en este caso particular, no depende de x) n →1 Luego la ecuación que estamos estudiando es una ecuación diferencial de primer orden de coeficientes constantes (porque A1(x,y) (x y) =1 =1, que es una constante) El método de Euler • Supongamos que no supiéramos encontrar la solución analítica de la ecuación diferencial ordinaria que estamos estudiando. • Cuando presentamos el problema dijimos que en un tiempo ∆t pequeño: ∆N = −kN∆t • Si llamamos Nj al número de átomos que hay en el instante tj y que hay y en el instante tj+1, tenemos que, q , Nj+1 al número de átomos q aproximadamente: N j +1 − N j = −kN j (t j +1 − t j ) • Y si escogemos todos los intervalos de tiempo tjj+1-tj iguales a un terminado valor h: N j+1 j 1 = N j − kN j h El método de Euler Escrito para un problema general, como: dy = f ( x, y; k ) dx Cada paso queda: 1) Dado xj, yj, calcular la derivada en ese punto: f1 = f (x j , y j ; k ) 2) Calcular yj+1 como: y j +1 = y j + f1h 3) Calcular xj+1 como: x j +1 = x j + h El método de Euler 1) Dado xj, yj, calcular la derivada en ese punto: y0 dy f1 = f (x j , y j ; k ) = dx f1 = f ( x0 , y0 ; k ) = − kyy0 x0 El método de Euler 2) Calcular yj+1 como: 3) Calcular C l l xj+1 como: y j +1 = y j + f1h x j +1 = x j + h y0 h y1 = y0 + f1h x0 x1 = x0 + h Método de Euler. Euler. Implementación. p Cuando escribimos la rutina para el método de Euler queremos que nos sirva para cualquier problema del tipo: dy f ( x , y; k ) = dx Para ello hacemos que uno de los argumentos de la rutina sea una función anónima. Declaración de una función anónima. anónima Para declarar la función anónima nombre a partir de otra función función se escribe: nombre = @(variable1, @(variable1 variable2 variable2,…) ) función(variable1 función(variable1, variable2, …, parámetro1, parámetro2,….) nombre: la función anónima que queremos crear a partir de la función función. variable1,variable2,…: las variables de las que depende la función anónima. parámetro1,parámetro2,…: variables de las que depende la función función pero que queremos que tengan valores fijos en la función anónima. En Matlab, at ab, el e símbolo s bo o para pa a una u a función u c ó anónima a ó a es: es Uso de una función anónima Las funciones anónimas se usan para poder usar una función como una variable de entrada al llamar a una rutina. rutina Ejemplo: k = 1; g = @(t,y) ( ,y) –k*y; y; Define una función anónima g p de x e y que q vale -1*y. y depende Al escribir feuler(g,t0,tf,y0,yf) le indicamos a la rutina feuler que g ha de ser sustituida p por -1*y y la función fun dentro de su código Aquí q defino una función anónima Aquí uso la función anónima como una variable Resultado para nuestro problema Vemos que la solución que hemos obtenido no coincide con la exacta. Representación gráfica del método de Euler E l P Para ell primer i paso: y0 f1 = f ( x0 , y0 ; k ) = − kyy0 dy = − kyy d dx h y1 = y0 + f1h x0 x1 = x0 + h Efecto del tamaño del paso. Una forma de mejorar la precisión es disminuir el tamaño del paso h. Contribuciones al error • El error de redondeo del ordenador. Se debe a que el ordenador no almacena los números con precisión infinita. • Error de truncamiento del método numérico. Se debe a que el método numérico no resuelve la EDO de forma exacta. Si yexact(xp) es el valor exacto de la solución de nuestro problema punto P,, se define el error local de truncamiento en P como: en el p e(x p ) = yexact (x p ) − ynumérico (x p ) De lo que hemos dicho, el error de truncamiento debe disminuir cuando disminuimos el paso h. Error de redondeo El ordenador almacena los números como mantisa x exponente. Por ejemplo: 138.516 0.138516 x 103 mantisa exponente El error relativo con el que se almacenan un número en el ordenador viene determinado por la cantidad de dígitos que se almacenan de la mantisa. mantisa Se muestra en Matlab con el comando eps. Esto significa que en capa paso de un método numérico, no tiene sentido pedir más precisión relativa que eps. En un cálculo bien hecho, el error de redondeo es despreciable frente al error de truncamiento. Error del método de Euler Euler.. El máximo error de truncamiento del método de Euler es proporcional al tamaño del paso h. Si reducimos d i ell paso a lla mitad, it d reducimos d i ell error a lla mitad Orden de un método numérico Se dice que un método de integración es de orden n si el error de truncamiento E depende del paso h como: E ∝ hn Esto significa que el método de Euler es un método de primer orden. Valor del error en el primer paso del método é de Euler: Valor exacto de la función y en x1. Valor dado por el método de Euler para la función y en x1. e( x1 ) = y ( x1 ) − [ y0 + f ( x0 , yo )h] ¿Por qué el método de Euler es de primer orden? Desarrollando en serie de Taylor y ( x1 ) = y0 + y ' ( xo )h + C1h 2 = y0 + f ( xo , yo )h + C1h 2 Donde C1 es una constante que depende de la segunda derivada de la función f en el intervalo (x0,x1). Y el error cometido en la primera iteración es: e( x1 ) = y ( x1 ) − [ y0 + f ( x0 , yo )h] e( x1 ) = C1 h 2 ¿Por qué el método de Euler es de primer orden? L errores se van acumulando Los l d en cada d iteración. i ió Si resolvemos el problema en el intervalo (x0,xf ) con paso h, daremos N pasos, pasos con N= x f − xo h Y el máximo error de truncamiento será del orden de: Max[e] ≈ Cte × Nh 2 ≈ Cte × (x f − xo )h Cuanto mayor y sea el orden de un método, mayor y puede p ser el paso para obtener el mismo error de truncamiento. Para obtener métodos de orden superior superior, tenemos que hacer más evaluaciones de la derivada en cada intervalo. El método del salto de rana ((Leapfrog Leapfrog) p g) g) 1) Dado xj, yj, calcular la derivada en ese punto. punto f1 = f (x j , y j ; k ) y0 f1 = f ( x0 , y0 ; k ) = − ky0 x0 El método del salto de rana ((Leapfrog Leapfrog) p g) g) 2) Calcular un punto xm, ym a la mitad del paso. h ym = y j + f1 2 y0 h ym = y0 + f1 2 ym h/2 xm x0 h xm = x j + 2 El método del salto de rana ((Leapfrog Leapfrog) p g) g) 3) Calcular la derivada en el punto t intermedio. i t di h h⎞ ⎛ f 2 = f ( xm , ym ; k ) = f ⎜ xo + , yo + f1 ⎟ 2 2⎠ ⎝ y0 f 2 = f ( xm , y m ; k ) ym h/2 xm x0 El método del salto de rana ((Leapfrog Leapfrog) p g) g) y j +1 = y j + f 2 h x j +1 = x j + h 4) Calcular xj+1 e yj+1 usando la derivada en el punto intermedio y0 y1 = y0 + f 2 h Valor dado por el método Leapfrog Valor dado por el método de Euler h x0 x1 Ecuaciones del método Leapfrog Leapfrog.. Escrito para un problema general, como: Cada paso queda: 1) Dado xj, yj, calcular la derivada en ese punto. 2) Calcular un punto xm, ym a la mitad del paso. 3) Calcular la derivada en el punto intermedio. intermedio 4) Calcular xj+1 e yj+1 usando la derivada en el punto intermedio dy = f ( x, y; k ) dx f1 = f (x j , y j ; k ) h ym = y j + f1 2 h xm = x j + 2 h h⎞ ⎛ f 2 = f ( xm , ym ; k ) = f ⎜ xo + , yo + f1 ⎟ 2 2⎠ ⎝ y j +1 = y j + f 2 h x j +1 = x j + h Método Leapfrog: Leapfrog: implementación en Matlab.. Matlab Comparativa Euler Euler--Leapfrog ¾Hemos conseguido mucha más precisión con el mismo paso. ¾El p precio q que hemos p pagado g es q que hacemos dos evaluaciones de f(x,y) en cada paso. Comparativa Euler Euler--Leapfrog (errores) ¾En ell método é d Leapfrog f ell error d depende d d dell cuadrado d d d dell paso h h. ¾Si reducimos el paso a la mitad, el error se reduce a la cuarta parte. ¾Se dice que el método Leapfrog es un método de segundo orden. ¿Por q qué el método Leapfrog p g es de 2º orden? • Para el primer paso: e( x1 ) = y ( x1 ) − [ y0 + f ( xm , ym )h] • ((xm, ym) es el p punto intermedio . En él,, la derivada vale aprox.: p h h⎞ h ⎛ f ( xm , ym ; k ) = f ⎜ xo + , yo + f1 ≈ f ( x0 , y0 ) + f ' ( x0 , y0 ) 2 2⎠ 2 ⎝ • y(x1) es el valor exacto de la solución en el punto x1. Vale aprox. aprox 1 y ( x1 ) = y0 + y ' ( x0 )h + y ' ' ( x0 )h 2 + Ch 3 2 h2 y ( x1 ) = y0 + f ( xo , yo )h + f ' ( x0 , y0 ) + Ch 3 2 • Luego, sustituyendo en la primera eq. e( x1 ) = C h 3 El método de RungeRunge g -Kutta • Se conoce de forma general como método de Runge-Kutta Runge Kutta todas las generalizaciones del método Leapfrog en las que se hacen varias evaluaciones de la función f(x,y) en cada paso h. • Por ejemplo, el método Leapfrog es también un método de Runge-Kutta de segundo orden. • El método de Runge-Kutta de cuarto orden es el método serio más sencillo para hacer integración numérica. • Se recomienda usarlo como primer método de prueba, pero no tiene por qué ser el método que dé más precisión ni el más eficiente computacionalmente para un problema dado. Runge--Kutta de 4 Runge 4º orden 1) Dado xj, yj, calcular la d i d en ese punto. derivada y0 f1 = f ( x j , y j ) f1 = f ( x0 , y0 ; k ) x0 x1 Un método U odo de d RungeRunge u g -Kutta u ad de 4º o orden d 2) Encontrar un punto a mitad del paso. h ym = y j + f1 2 y0 h ym = y0 + f1 2 ym h/2 xm x0 h xm = x j + 2 Un método U odo de d RungeRunge u g -Kutta u ad de 4º o orden d 2) Calcular la derivada f2 en ese punto. t h h⎞ ⎛ f 2 = f ⎜ x j + , y j + f1 2 2⎠ ⎝ y0 f 2 = f ( xm , y m ; k ) ym h/2 xm x0 Runge Rungeu g -Kutta u ad de 4º o orden d Usar la derivada f2 para j la estimación del mejorar punto intermedio. h ym ' = y j + f 2 2 y0 h y m ' = y0 + f 2 2 ym ' h/2 xm x0 x1 h xm = x j + 2 Runge Rungeu g -Kutta u ad de 4º o orden d 3) Calcular la derivada f3 en ell nuevo punto t iintermedio t di h h⎞ ⎛ f3 = f ⎜ x j + , y j + f 2 2 2⎠ ⎝ y0 ff33 == ff((xxmm,,yymm')') ym ' h/2 xm x0 x1 Runge Rungeu g -Kutta u ad de 4º o orden d Usar la derivada f3 para calcular una primera estimación ó del punto final xj+1,yj+1. x1 = x0 + h y1e = y0 + f 3 h y0 y1e = y0 + f 3 h y1e h x0 x1 Runge Rungeu g -Kutta u ad de 4º o orden d Calcular la derivada f4 en la estimación ó del punto final. f 4 = f (x j + h, y j + f 3 h ) y0 f 4 = f ( x0 + h, y0 + f 3 h ) h x0 x1 Runge Rungeu g -Kutta u ad de 4º o orden d f1 + 2 f 2 + 2 f 3 + f 4 fP = 6 Hacer una estimación de la derivada promediando f1, f2, f3 y f4 como: y0 f1 + 2 f 2 + 2 f 3 + f 4 fP = 6 h x0 x1 Runge Rungeu g -Kutta u ad de 4º o orden d y j +1 = y j + hf p Usar fp para calcular el punto final y0 y1 = y0 + f p h h x0 x1 Método RK4. Implementación en Matlab Matlab.. Comparativa Euler Euler--Leapfrog Leapfrog--RK4 ¾ Hemos conseguido mucha más precisión que con los dos métidos anteriores usando el mismo paso. ¾ El precio i que h hemos pagado d es que hacemos h cuatro t evaluaciones de f(x,y) en cada paso. Error del método RK4 ¾En el método RK de cuarto orden el error depende de h4, como corresponde a un método de cuarto orden.. ¾Si reducimos d i ell paso a lla mitad, it d ell error se reduce d a lla di dieciseisava i i parte. Estabilidad • Volvamos al método de Euler. Supongamos que quiero resolver el problema bl para un tiempo ti t más á grande. d • Empiezo probando con el método de Euler y hago el paso h más grande para tener que hacer menos cálculos. cálculos Si hago h>1 la solución numérica que obtengo es absurda. Origen de la inestabilidad En el ejemplo con h>1 el error que cometo en el primer paso crece en cada d iteración it ió d dell método. ét d Para que un método sea estable el error que cometo en cada paso debe atenuarse en las siguientes iteraciones. iteraciones Error del sexto paso. Error del primer paso. Explicación para el método de Euler • En el ejemplo que hemos puesto: dy d = −ky dx k >0 • De acuerdo con el método de Euler: yn = yn −1 + f ( xn −1 , yn −1 )h = yn −1 − kyn −1h = (1 − kh ) yn −1 • Deshaciendo D h i d iteraciones it i hasta h t ell punto t iinicial i i l ((x0,y0): ) yn = (1 − kh) yn −1 = (1 − kh) 2 yn −1 = ... = (1 − kh) n y0 • Para que yn tienda a cero, que es el comportamiento correcto: 1 − kh < 1 2 h< k Generalización • Si escribimos la ecuación diferencial general: dy d = f ( x, y; k ) dx • La condición de estabilidad del método de Euler puede escribirse como: 1 − kh < 1 f ( x, y; k ) 1+ h <1 y(x ) • Para cualesquiera valores de f(x,y;h) y la solución del problema y(x). CONCLUSIÓN: Como en general, no conoceremos f(x,y;k)/y(x) de antemano porque no conocemos y(x), no podemos decir cuál es el mayor paso h que es conveniente utilizar. Control del paso • El mismo i problema bl tienen i llos otros algoritmos l i que h hemos utilizado. • La solución es cambiar el paso h conforme resolvemos el problema para mantener el error bajo control • A eso se le llama control del paso. En cualquier cálculo serio hay que usar control del paso. Las rutinas q que hemos p presentado como ejemplo j p no tienen control de paso. Por esa razón, en cualquier cálculo serio hay que usar las funciones de Matlab, que sí incorporan control de paso. Control del p paso p por ““step step p doubling doubling” g” ((I)) Suponemos que estamos en xj y quiero avanzar la solución a xj+1=xj+h usando el Método de Runge-Kutta de 4º orden. orden Además quiero que el error de truncamiento sea menor que un valor ∆. • Primero avanzamos la solución en un solo paso. p xj h x j +1 • Como el método que estoy usando es de cuarto orden, sé que: yexact ( x j +1 ) − y1 p ( x j +1 ) = Ch 5 + O(h 6 ) Solución exacta Solución numérica aproximada Error de truncamiento de 1 paso Términos de orden superior Control del p paso p por ““step step p doubling doubling” g” ((II)) • Ahora avanzo la solución en dos pasos de anchura h/2. xj h/2 xm h/2 x j +1 • Como el método que estoy usando es de cuarto orden, sé que: 5 ⎛h⎞ yexact ( x j +1 ) − y2 p ( x j +1 ) = 2C ⎜ ⎟ + O(h 6 ) ⎝2⎠ Solución exacta Solución numérica aproximada Error de truncamiento de 2 pasos Términos de orden superior Control del p paso p por ““step step p doubling doubling” g” ((III)) Estimamos el error de truncamiento e(xj+1) como: e( x j +1 ) ≈ y1 p ( x j +1 ) − y2 p ( x j +1 ) Error de truncamiento Solución numérica aproximada (1 paso) Solución numérica aproximada (2 pasos) • Si e(xj+1)>∆ tenemos que reducir el tamaño del paso h para mantener el error de truncamiento dentro del límite requerido. Podemos ayudarnos de que sabemos que si dividimos el paso por dos, el error de truncamiento se divide por 16. • Si e(xj+1)<∆ podemos aumentar el tamaño del paso h para avanzar más rápidamente y acabar el cálculo antes.. Normalmente las rutinas son más conservativas a la hora de aumentar el paso que reducirlo. Métodos explícitos en Matlab Matlab.. Matlab tiene dos funciones para el método de Runge Runge-Kutta. Kutta. [x,y]=ode45(odefun,xspan,y0,options) [x,y]=ode23(odefun,xspan,y0,options) ode[orden del método][orden en el que se evalúa el error] Parámetros de entrada: odefun: la función f(x,y,z) en forma de función anónima. xspan: un vector t [x0 [ 0 xf] f] con los l valores l inicial i i i l y fi finall d de x y0: el valor inicial de la variable dependiente y. options: estructura con parámetros adicionales Parámetros de salida: x: vector con los valores de la variable independiente x y: vector con los valores de la variable dependiente y. E t ffunciones Estas i sólo ól resuelven l ecuaciones i del d l tipo: ti dyy = f ( x, y; k ) dx Cómo modificar la estructura options p Para modificar la estructura options se usa el comando odeset: options=odeset(‘Campo1’,Valor1,’Campo2’,Valor2,…) Parametros de entrada: Campo1,Campo2,…: Nombre de los campos de la estructura p que q q queremos modificar. options Valor1,Valor2,…: Valor que queremos del correspondiente campo. InitialStep Significado Rango por Valor p defecto MaxStep Valor V l d de h para ell primer paso. Máximo Má i valor l d dell paso h que aceptamos. Reall positivo Reall positivo Va iable Variable ( x f − x0 ) / 10 Parámetros que controlan el error. En Matlab, el máximo error de truncamiento en un paso ∆ se especifica ifi cómo: ó [ ∆ = Max AbsTol Ab l , RelTol l l× yj ] RelTol: Controla la cifra significativa de la solución que está afectada de error. Su valor por defecto es 10-3, lo que indica que es la tercera cifra significativa de la solución la que está afectada de error. AbsTol: Evita que la expresión anterior conduzca a error si |yj| se hace muy pequeño. Por ejemplo, si |yj|=0 → RelTol x |yj|=0, lo que indicaría que o queremos error de truncamiento (algo i imposible) ibl ) . S Su valor l por defecto d f t es 10-66 pero siempre i ha h de d ser bastante mayor que eps. RelTol y AbsTol son campos de la estructura options Ecuaciones de orden 2 o superior. Los métodos que hemos expuesto sólo resuelven ecuaciones del tipo: dy = f ( x, y; k ) dx ¿Que hacer entonces si tengo una ecuación de 2º orden o superior? Dijimos que resolveríamos: dy d2y dny B( x, y ) = A1 ( x, y ) + A2 ( x, y ) 2 + ... + An ( x, y ) n d dx d dx d dx Las ecuaciones diferenciales de orden 2º o superior las podemos resolver convirtiéndolas en sistemas de ecuaciones diferenciales de primer orden. Ejemplo Para una ecuación de segundo orden: dy d d2y B( x, y ) = A1 ( x, y ) + A2 ( x, y ) 2 dx dx Hacemos el cambio de variable: dy z= dx Nos queda el sistema de dos ecuaciones de primer orden acopladas: dz B( x, y ) = A1 ( x, y )z + A2 ( x, y ) dx dz B( x, y ) − A1 ( x, y ) z = dx A2 ( x, y ) dy =z dx Bibliografía del Tema. Tema Numerical Recipes, http://www.nr.com/oldverswitcher.html A. Quarterioni, F. Salieri, Cálculo científico con Matlab y Octave (capítulo 7) , Springer-Verlag (2006), ISBN 10 88-470-0503-5 Cleve Moler. Numerical computing with Matlab. http://www.mathworks.com/moler/chapters.html Abramowitz and Stegun. Handbook of mathematical functions. http://www.nrbook.com/abramowitz_and_stegun/