tema5-1.pdf

Anuncio
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/
Descargar