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;