Implementación de métodos numéricos en Mathematica de forma

Transcripción

Implementación de métodos numéricos en Mathematica de forma
Implementación de métodos numéricos
en Mathematica de forma funcional
José Luis Gómez Muñoz
Los comandos NestWhileList y Function
ã Se duplica el número, comenzando con 10, mientras el número sea menor que 100
NestWhileList@
Function@numero, 2 ∗ numeroD,
10,
Function@numero, numero < 100D
D
810, 20, 40, 80, 160<
ã Se le suma dos al número, comenzando con 6, mientras el número sea menor que 15
NestWhileList@
Function@z, z + 2D,
6,
Function@w, w < 15D
D
86, 8, 10, 12, 14, 16<
ã A la pareja de números se les suma {10,200} respectivamente, comenzando con la pareja {3,7},
mientras el primer elemento de la pareja sea menor que 50
NestWhileList@
Function@pareja, pareja + 810, 200<D,
83, 7<,
Function@pareja, pareja@@1DD < 50D
D
883, 7<, 813, 207<, 823, 407<, 833, 607<, 843, 807<, 853, 1007<<
Printed by Mathematica for Students
metodos09.nb
2
Método de Euler implementación funcional
ã Ecuación diferencial del tipo:
dy
= f Hx, yL
dx
y Hx0 L = y0
Método de Euler para obtener solución aproximada:
x j+1 = x j + h
y j+1 = y j + h * f Ix j , y j M
Un programa de Mathematica que implementa este método:
euler@f_, 8xo_, yo_<, xend_, h_D :=
NestWhileList@
H∗Método numérico: ∗L
Function@ parejaxy, parejaxy + 8h, h ∗ Apply@f, parejaxyD< D,
H∗Valores iniciales: ∗L
8xo, yo<,
H∗Condición para seguir calculando: ∗L
Function@ parejaxy, parejaxy@@1DD < xendD D
ã Ejemplo:
f@x_, y_D := 0.1 ∗ y ∗ H100 − yL;
datos = euler@f, 80, 50<, 2, 0.05D;
ListPlot@datos, AxesOrigin → 80, 0<, PlotLabel → y '@xD f@x, yDD
y£ HxL 0.1 H100 - yL y
100
80
60
40
20
0.5
1.0
1.5
Printed by Mathematica for Students
2.0
metodos09.nb
3
ã Solución exacta
f@x_, y_D := 0.1 ∗ y ∗ H100 − yL;
sol = DSolve@8y '@xD f@x, y@xDD, y@0D 50<, y, xD;
exacta@x_D := y@xD ê. sol@@1DD;
Plot@exacta@xD, 8x, 0, 2<, AxesOrigin → 80, 0<, PlotLabel → exacta@xDD
Solve::ifun : Inverse functions are being used by Solve, so
some solutions may not be found; use Reduce for complete solution information. à
100. µ 2.7182810. x
1. + 2.7182810. x
100
80
60
40
20
0.5
1.0
1.5
Printed by Mathematica for Students
2.0
metodos09.nb
4
ã Ejemplo:
k@x_D := 0.1 ∗
H1 + Sin@2 ∗ π ∗ x ê 1DL
;
2
ymax@x_D := 75 − 25 ∗ Cos@2 ∗ π ∗ x ê 1D;
f@x_, y_D := k@xD ∗ y ∗ Hymax@xD − yL;
datos = euler@f, 80, 50<, 2, 0.05D;
ListPlot@datos, AxesOrigin → 80, 0<, PlotLabel → y '@xD f@x, yDD
y£ HxL 0.05 y HsinH2 p xL + 1L H-25 cosH2 p xL - y + 75L
80
60
40
20
0.5
1.0
1.5
Printed by Mathematica for Students
2.0
metodos09.nb
5
Método “Euler Mejorado”, implementación funcional
ã Ecuación diferencial del tipo:
dy
= f Hx, yL
dx
y Hx0 L = y0
Método de Euler para obtener solución aproximada:
x j+1 = x j + h
k1 = h ◊ f Ix j , y j M
k2 = h ◊ f Ix j + h, y j + k1 M
y j+1 = y j +
k1 +k2
2
Un programa de Mathematica que implementa este método. Nótese el uso de Module adentro de
Function:
eulermejorado@f_, 8xo_, yo_<, xend_, h_D :=
NestWhileList@
H∗Método numérico: ∗L
Function@ parejaxy,
Module@8k1, k2<,
k1 = h ∗ Apply@f, parejaxyD;
k2 = h ∗ Apply@f, parejaxy + 8h, k1<D;
parejaxy + 8h, 0.5 ∗ Hk1 + k2L<D D,
H∗Valores iniciales: ∗L
8xo, yo<,
H∗Condición para seguir calculando: ∗L
Function@ parejaxy, parejaxy@@1DD < xendD D
Printed by Mathematica for Students
metodos09.nb
6
ã Ejemplo Euler Mejorado:
k@x_D := 0.1 ∗
H1 + Sin@2 ∗ π ∗ x ê 1DL
;
2
ymax@x_D := 75 − 25 ∗ Cos@2 ∗ π ∗ x ê 1D;
f@x_, y_D := k@xD ∗ y ∗ Hymax@xD − yL;
datos = eulermejorado@f, 80, 50<, 2, 0.05D;
ListPlot@datos, AxesOrigin → 80, 0<, PlotLabel → y '@xD f@x, yDD
y£ HxL 0.05 y HsinH2 p xL + 1L H-25 cosH2 p xL - y + 75L
80
60
40
20
0.5
1.0
1.5
2.0
ã Ejercicio para los estudiantes: De una manera similar a como se implementó Euler mejorado,
implementar el Método de Runge-Kutta de cuarto orden:
x j+1 = x j + h
k1 = h ◊ f Ix j , y j M
h
k1
2
h
2
k2
2
2
k2 = h ◊ f Ix j + , y j +
k3 = h ◊ f Ix j + , y j +
M
M
k4 = h ◊ f Ix j + h, y j + k3 M
y j+1 = y j +
k1
6
+
k2
3
+
k3
3
+
k4
6
Método de Euler de Orden Superior, implementación funcional
ã Ecuación diferencial del tipo:
y HnL = f Ix, y, y ', y '', … , y Hn-1L M
y Hx0 L = y0
y ' Hx0 L = y '0
ª
y
Hn-1L
Hn-1L
Hx0 L = y0
Método de Euler (de orden superior) para obtener solución aproximada:
Printed by Mathematica for Students
metodos09.nb
7
x j+1 = x j + h
y j+1 = y j + h ◊y ' j
y ' j+1 = y j + h ◊ y '' j
y '' j+1 = y j + h ◊ y ''' j
ª
y
Hn-1L
j+1
= y j + h ◊ y HnL j
y HnL j+1 = y j + h ◊ f Ix, y, y ', y '', … , y Hn-1L M
Un programa de Mathematica que implementa este método:
eulerOrdenSuperior@f_, listaini_, xend_, h_D :=
NestWhileList@
H∗Método numérico:∗L
Function@ listaxyderivs,
Module@8listaincrementos<,
listaincrementos =
Flatten@8h,
h ∗ listaxyderivs@@ 3 ;; Length@listaxyderivsD DD,
h ∗ Apply@f, listaxyderivsD<D;
listaxyderivs + listaincrementosD D,
H∗Valores iniciales:∗L
listaini,
H∗Condición para seguir calculando: ∗L
Function@ listaxyderivs, listaxyderivs@@1DD <= xendD D
Printed by Mathematica for Students
metodos09.nb
8
ã Euler de orden superior:
npuntos = 40;
x0 = 1.0;
xfin = 5.0;
y0 = 2.0;
v0 = − 1.0;
f@x_, y_, v_D := − v + 2 x − 3 y;
aproximados = eulerOrdenSuperiorBf, 8x0, y0, v0<, xfin,
mispuntos = aproximados@@All, 1 ;; 2DD;
ListPlot@mispuntos, PlotStyle → PointSize@LargeD,
PlotLabel → y ''@xD f@x, y, y '@xDDD
y££ HxL -y£ HxL + 2 x - 3 y
3.0
2.5
2.0
1.5
1.0
0.5
2
3
4
Printed by Mathematica for Students
5
xfin − x0
npuntos
F;
metodos09.nb
9
ã Euler de orden superior:
npuntos = 40;
x0 = 1.0;
xfin = 5.0;
y0 = 2.0;
v0 = − 1.0;
a0 = 3.0;
f@x_, y_, v_, a_D := a − v + 2 x − 3 y;
aproximados = eulerOrdenSuperiorBf, 8x0, y0, v0, a0<, xfin,
mispuntos = aproximados@@All, 1 ;; 2DD;
ListPlot@mispuntos, PlotStyle → PointSize@LargeD,
PlotLabel → y '''@xD f@x, y@xD, y '@xD, y ''@xDDD
yH3L HxL y££ HxL - y£ HxL - 3 yHxL + 2 x
5
2
3
4
-5
-10
-15
-20
-25
Printed by Mathematica for Students
5
xfin − x0
npuntos
F;

Documentos relacionados