Introducción al Método de Elemento Finito en Mathematica
Transcripción
Introducción al Método de Elemento Finito en Mathematica
Introducción al Método de Elemento Finito en Mathematica José Luis Gómez Muñoz Departamento de Física y Matemáticas Campus Estado de México Instituto Tecnológico y de Estudios Superiores de Monterrey Julio 2012 Printed by Mathematica for Students FEMcurso.nb 2 1. Ejemplo del método de Bubnov-Galerkin Basado en el trabajo de John H. Mathews http://math.fullerton.edu/mathews/n2003/GalerkinMod.html Adaptado por José Luis Gómez Muñoz http://homepage.cem.itesm.mx/lgomez/ ã Se va a calcular una solución aproximada a una ecuación diferencial ordinaria, lineal e inhomogénea, d d - IpHxL yHxLM + qHxL yHxL = f HxL, con las condiciones de frontera yHaL = ya , yHbL = yb , como se dx dx muestra a continuación : Clear@x, y, p, q, f, a, bD; p@x_D := x2 ; q@x_D := 30; f@x_D := − 14 x; a = 0; b = 1; ya = 0; yb = 0.5; Print@"−∂x Hp@xD ∂x y@xDL+q@xD∗y@xDf@xD"D; Print@− ∂x Hp@xD ∂x y@xDL + q@xD ∗ y@xD f@xDD; Print@y@aD ya D; Print@y@bD yb D; −∂x Hp@xD ∂x y@xDL+q@xD∗y@xDf@xD 30 y@xD − 2 x y @xD − x2 y @xD − 14 x y@0D 0 y@1D 0.5 Printed by Mathematica for Students FEMcurso.nb 3 ã La solución aproximada FHxL será una combinación lineal de ciertas funciones linealmente independientes, llamadas funciones base: FHxL = f0 HxL + ⁄nj=1 c j f j HxL. Cada función base f j HxL cumple con las condiciones de frontera f j HaL = 0, f j HbL = 0, excepto f0 HxL, que cumple las condiciones de frontera del problema f0 HaL = ya , f0 HbL = yb . Clear@n, φ, x, jD; φ0 @x_D := ya + y b − ya b−a Hx − aL; n = 3; φ1 @x_D := Hx − aL ∗ Hx − bL; φ2 @x_D := Hx − aL2 ∗ Hx − bL; φ3 @x_D := Hx − aL2 ∗ Hx − bL2 ; funciones = TableAφj @xD, 8j, 0, n<E; Plot@funciones, 8x, a, b<, PlotLabel → "Funciones base", PlotRange → AllD Funciones base 0.5 0.4 0.3 0.2 0.1 0.2 0.4 0.6 0.8 1.0 -0.1 -0.2 ã La solución aproximada tendrá la forma FHxL = f0 HxL + ⁄nj=1 c j f j HxL. El objetivo será encontrar los coeficientes c j que den la mejor aproximación a la solución de la ecuación diferencial: Clear@Φ, cD; n Φ@x_D := φ0 @xD + ‚ cj ∗ φj @xD; j=1 Print@"Forma de la aproximación a la solución:"D Print@"Φ@xD=", Φ@xDD Printed by Mathematica for Students FEMcurso.nb 4 Forma de la aproximación a la solución: Φ@xD=0.5 x + H− 1 + xL x c1 + H− 1 + xL x2 c2 + H− 1 + xL2 x2 c3 ã La ecuación diferencial puede escribirse de la forma: d d - IpHxL yHxLM + qHxL yHxL - f HxL = 0 dx dx Si reemplazamos la solución aproximada FHxL en lugar de la solución exacta yHxL en el lado izquierdo de la ecuación anterior, el resultado ya no será exactamente cero. En su lugar obtendremos una función conocida como residuo, rHxL. En otras palabras, si el residuo rHxL, mostrado abajo, fuera cero, en ese caso la solución aproximada sería la solución exacta: d d - IpHxL FHxLM + qHxL FHxL - f HxL = rHxL dx dx Abajo se puede ver la expresión para el residuo en este ejemplo: r@x_D := − ∂x Hp@xD ∂x Φ@xDL + q@xD ∗ Φ@xD − f@xD; Print@"Residuo de la aproximación:"D; Print@"r@xD=", r@xDD Residuo de la aproximación: r@xD=14 x − x2 I2 c1 + 2 H− 1 + xL c2 + 4 x c2 + 2 H− 1 + xL2 c3 + 8 H− 1 + xL x c3 + 2 x2 c3 M − 2 x I0.5 + H− 1 + xL c1 + x c1 + 2 H− 1 + xL x c2 + x2 c2 + 2 H− 1 + xL2 x c3 + 2 H− 1 + xL x2 c3 M + 30 I0.5 x + H− 1 + xL x c1 + H− 1 + xL x2 c2 + H− 1 + xL2 x2 c3 M ã El método de Bubnov-Galerkin consiste en encontrar la combinación lineal FHxL = f0 HxL + ⁄nj=1 c j f j HxL cuyo residuo rHxL tenga componente igual a cero en el subespacio generado por las funciones base n 9f j = j=1 (sin incluir f0 ). Esto significa que el producto punto del residuo por cada función base debe ser b cero, Ÿa f j HxL rHxL ‚ x ä 0. Cada uno de estos productos punto igualados a cero genera una ecuación cuyas incognitas son los coeficientes c j , como se muestra a continuación. Nótese que no se incluye el producto punto con f0 , dado que ya se tomó c0 = 1 para cumplir con las condiciones de frontera: b ecuaciones = TableB‡ φj @xD ∗ r@xD x 0, 8j, 1, n<F; a Print@"Galerkin: residuo ortogonal a funciones base"D; TableForm@ecuacionesD Galerkin: residuo ortogonal a funciones base − 2.33333 + 1.13333 c1 + 0.6 c2 − 0.238095 c3 0 − 1.4 + 0.6 c1 + 0.371429 c2 − 0.121429 c3 0 0.466667 − 0.238095 c1 − 0.121429 c2 + 0.0539683 c3 0 Printed by Mathematica for Students FEMcurso.nb 5 ã A continuación se muestra el sistema de ecuaciones en forma matricial: parametros = TableAcj , 8j, 1, n<E; 8v, m< = N@ CoefficientArrays@ecuaciones, parametrosD D; Print@MatrixForm@mD, ".", MatrixForm@parametrosD, "==", MatrixForm@− vD D c1 1.13333 0.6 − 0.238095 2.33333 0.6 0.371429 − 0.121429 . c2 == 1.4 c3 − 0.238095 − 0.121429 0.0539683 − 0.466667 ã Como ya tenemos la matriz y el vector del sistema lineal, podemos obtener la solución usando el comando LinearSolve[] de Mathematica: LinearSolve@m, − vD 81.11225, 2.83562, 2.64006< ã Sin embargo el comando NSolve proporciona la misma respuesta en un formato más útil para ser usado después en este documento: soluciones = NSolve@ecuaciones, parametrosD 88c1 → 1.11225, c2 → 2.83562, c3 → 2.64006<< ã La solución aproximada se obtiene reemplazando los coeficientes c j en la expresión FHxL = f0 HxL + ⁄nj=1 c j f j HxL. Abajo se le llama gHxL a la solución aproximada que se obtiene por este procedimiento: g@x_D := ReplaceAll@Φ@xD, soluciones@@1DD D; Print@"Solución aproximada por el método de Galerkin: "D; Print@"g@xD=", g@xDD Solución aproximada por el método de Galerkin: g@xD=0.5 x + 1.11225 H− 1 + xL x + 2.83562 H− 1 + xL x2 + 2.64006 H− 1 + xL2 x2 Printed by Mathematica for Students FEMcurso.nb 6 ã Ésta es la gráfica de la solución aproximada con el método de Bubnov-Galerkin: Plot@g@xD, 8x, a, b<, PlotLabel → "Solución aproximada por el método de Galerkin"D Solución aproximada por el método de Galerkin 0.3 0.2 0.1 0.2 0.4 0.6 0.8 1.0 -0.1 -0.2 ã A continuación se muestra la gráfica de la solución analítica exacta, obtenida con el comando DSolve: solexacta = DSolve@8− ∂x Hp@xD ∂x y@xDL + q@xD ∗ y@xD f@xD, y@aD ya , y@bD yb <, y@xD, xD; exacta@x_D := Evaluate@ReplaceAll@y@xD, solexacta@@1DD D D; Plot@exacta@xD, 8x, a, b<, PlotLabel → "Solución analítica exacta"D Solución analítica exacta 0.3 0.2 0.1 0.2 0.4 0.6 0.8 -0.1 -0.2 Printed by Mathematica for Students 1.0 FEMcurso.nb 7 ã A continuación se muestra la gráfica del error de la aproximación de Bubnov-Galerkin en este ejemplo: Plot@exacta@xD − g@xD, 8x, a, b<, PlotLabel → "Error = Analítica−Bubnov−Galerkin"D Error = Analítica-Bubnov-Galerkin 0.004 0.003 0.002 0.001 0.2 0.4 0.6 0.8 -0.001 -0.002 ã Referencias Basado en el trabajo de John H. Mathews http://math.fullerton.edu/mathews/n2003/GalerkinMod.html Adaptado por José Luis Gómez Muñoz http://homepage.cem.itesm.mx/lgomez/ Printed by Mathematica for Students 1.0 FEMcurso.nb 8 2. Ejemplo del método de Bubnov-Galerkin con funciones base del tipo usadas en Elemento Finito (funciones seccionadas de soporte local) Basado en el trabajo de John H. Mathews http://math.fullerton.edu/mathews/n2003/GalerkinMod.html también en la sección 11.5 “El método de Rayleigh-Ritz” del libro de Richard L. Burden y J. Douglas Faires, “Análisis numérico” 9a. edición, editorial Cengage, págs 696-711 y finalmente también en la sección 6.2 “Galerkin’s method with piecewise polynomials” del libro de Kenneth Eriksson, D. Estep, P. Hansbo & C. Johnson, “Computational Differential Equations” Volumen 1, Cambridge University Press, 1997. Adaptado por José Luis Gómez Muñoz http://homepage.cem.itesm.mx/lgomez/ ã Se va a calcular una solución aproximada a una ecuación diferencial ordinaria, lineal e inhomogénea, d d - IpHxL yHxLM + qHxL yHxL = f HxL, con las condiciones de frontera yHaL = ya , yHbL = yb , como se dx dx muestra a continuación : Clear@x, y, p, q, f, a, bD; p@x_D := x2 ; q@x_D := 30; f@x_D := − 14 x; a = 0; b = 1; ya = 0; yb = 0.5; Print@"−∂x Hp@xD ∂x y@xDL+q@xD∗y@xDf@xD → ", − ∂x Hp@xD ∂x y@xDL + q@xD ∗ y@xD f@xDD; Print@y@aD ya D; Print@y@bD yb D; −∂x Hp@xD ∂x y@xDL+q@xD∗y@xDf@xD → 30 y@xD − 2 x y @xD − x2 y @xD − 14 x y@0D 0 y@1D 0.5 Printed by Mathematica for Students FEMcurso.nb 9 ã La solución aproximada FHxL será una combinación lineal de ciertas funciones linealmente independientes, llamadas funciones base: FHxL = ⁄nj=1 c j f j HxL. Las funciones base f j HxL usadas en el método de Elemento Finito tienen soporte local, lo que quiere decir que cada una es distinta de cero sólo en una pequeña parte del dominio: Clear@n, h, φ, x, jD; n = 5; h= b−a n−1 ; DoB 0 < x ≤ h ∗ Hj − 2L 0 h ∗ Hj − 2L < x ≤ h ∗ Hj − 1L x−h∗Hj−2L φj @x_D := EvaluateB h h∗j−x h h ∗ Hj − 1L < x ≤ h ∗ j F, h∗j < x ≤ 1 0 8j, 1, n< F; funciones = TableAφj @xD, 8j, 1, n<E; Plot@funciones, 8x, a, b<, PlotLabel → "Funciones base", PlotRange → AllD Funciones base 1.0 0.8 0.6 0.4 0.2 0.2 0.4 0.6 0.8 Printed by Mathematica for Students 1.0 FEMcurso.nb 10 ã La solución aproximada tendrá la forma FHxL = ⁄nj=1 c j f j HxL. El objetivo será encontrar los coeficientes c j que den la mejor aproximación a la solución de la ecuación diferencial: Clear@Φ, cD; n Φ@x_D := ‚ cj ∗ φj @xD; j=1 Print@"Forma de la aproximación a la solución:"D Print@"Φ@xD=", Φ@xDD Forma de la aproximación a la solución: 4 I 4 + xM − 4 < x ≤ 0 1 Φ@xD= 1 4 I 4 − xM 0 < x ≤ 1 0 c1 + 1 4 0<x≤ 4 I− 4 + xM 1 4 I 4 − xM 1 4 1 2 0 True 3 <x≤ <x≤ 1 4 1 2 3 4 4 I 2 − xM 1 4 0 True 1 True 0 0<x≤ 4x 0<x≤ 0 4 I− 2 + xM 1 c3 + <x≤ 4 H1 − xL 1 2 3 4 0 True <x≤ 1 2 3 4 1 4 1 2 c2 + 0<x≤ 0 4 I− 4 + xM 3 4 4 I 4 − xM 1<x≤ 0 True 3 c4 + <x≤1 5 3 4 <x≤1 c5 5 4 ã La ecuación diferencial puede escribirse de la forma: d d - IpHxL yHxLM + qHxL yHxL - f HxL = 0 dx dx Si reemplazamos la solución aproximada FHxL en lugar de la solución exacta yHxL en el lado izquierdo de la ecuación anterior, el resultado ya no será exactamente cero. En su lugar obtendremos una función conocida como residuo, rHxL. En otras palabras, si el residuo rHxL, mostrado abajo, fuera cero, en ese caso la solución aproximada sería la solución exacta: d d - IpHxL FHxLM + qHxL FHxL - f HxL = rHxL dx dx ã El método de Bubnov-Galerkin consiste en encontrar la combinación lineal FHxL = ⁄nj=1 c j f j HxL cuyo n-1 residuo rHxL tenga componente igual a cero en el subespacio generado por las funciones base 9f j = j=2 (sin incluir f1 ni fn , porqué serán usadas para cumplir las condiciones de frontera). Esto significa que el producto punto del residuo por cada función base debe ser cero: b Ÿa f j HxL rHxL ‚ x = 0 para j = 2 ... n - 1 es decir b -Ÿa f j HxL d dx IpHxL d dx b FHxLM ‚ x + Ÿa f j HxL HqHxL FHxL - f HxLL ‚ x = 0 para j = 2 ... n - 1 ã Sin embargo la aproximación FHxL que estamos utilizando en este ejemplo no tiene segunda derivada. Usando integración por partes se obtiene una expresión que sólo involucra primeras derivadas: -Af j HxL pHxL dF HxL b E dx a b + Ÿa pHxL dF HxL d f j HxL dx dx b ‚ x + Ÿa f j HxL HqHxL FHxL - f HxLL ‚ x = 0 para j = 2 ... n - 1 , pero recordemos que debido a su soporte local, f j HbL = f j HaL = 0 para j = 2 ... n - 1, entonces cada producto punto igualado a cero queda: Ÿa p HxL b dΦ HxL d φj HxL dx dx x + Ÿa φj HxL Hq HxL Φ HxL − f HxLL x = 0 b para j = 2 ... n - 1 , que, junto con las condiciones de frontera c1 = ya , cn = yb , forman un sistema de n ecuaciones para los Printed by Mathematica for Students FEMcurso.nb 11 1 a n b n parámetros c j , como se muestra abajo: ecuaciones = b b TableB‡ p@xD ∗ Φ '@xD ∗ φj '@xD x + ‡ φj @xD ∗ Hq@xD ∗ Φ@xD − f@xDL x == 0, a a 8j, 2, n − 1<F; ecuaciones = Join@8c1 ya <, ecuaciones, 8cn yb <D; TableForm@ecuacionesD c1 0 1 12 1 12 1 12 H− c1 + 8 c2 − 7 c3 L + 1 8 H7 + 10 c1 + 40 c2 + 10 c3 L 0 H− 7 c2 + 26 c3 − 19 c4 L + 1 4 H− 19 c3 + 56 c4 − 37 c5 L + H7 + 5 c2 + 20 c3 + 5 c4 L 0 1 8 H21 + 10 c3 + 40 c4 + 10 c5 L 0 c5 0.5 ã A continuación se muestra el sistema de ecuaciones en forma matricial: parametros = TableAcj , 8j, 1, n<E; 8v, m< = N@ CoefficientArrays@ecuaciones, parametrosD D; Print@MatrixForm@mD, ".", MatrixForm@parametrosD, "==", MatrixForm@− vD D c1 1. 0. 0. 0. 0. 0. c2 1.16667 5.66667 0.666667 0. 0. − 0.875 0. 0.666667 7.16667 − 0.333333 0. . c3 == − 1.75 c4 0. 0. − 0.333333 9.66667 − 1.83333 − 2.625 c5 0. 0. 0. 0. 1. 0.5 ã Como ya tenemos la matriz y el vector del sistema lineal, podemos obtener la solución usando el comando LinearSolve[] de Mathematica: LinearSolve@m, − vD 80., − 0.126051, − 0.241067, − 0.185037, 0.5< Printed by Mathematica for Students FEMcurso.nb 12 ã Sin embargo el comando NSolve proporciona la misma respuesta en un formato más útil para ser usado después en este documento: soluciones = NSolve@ecuaciones, parametrosD 88c1 → 0., c2 → − 0.126051, c3 → − 0.241067, c4 → − 0.185037, c5 → 0.5<< ã La solución aproximada se obtiene reemplazando los coeficientes c j en la expresión FHxL = ⁄nj=1 c j f j HxL. Abajo se le llama gHxL a la solución aproximada que se obtiene por este procedimiento: g@x_D := ReplaceAll@Φ@xD, soluciones@@1DD D; Print@"Solución aproximada por el método de Galerkin: "D; Print@"g@xD=", g@xDD Solución aproximada por el método de Galerkin: 0<x≤ 4x g@xD=0. − 0.126051 4 1 I2 − xM 0 4 I− 2 + xM 1 0.185037 <x≤ 4 H1 − xL 1 2 3 4 0 True <x≤ 1 2 3 4 4 I− 4 + xM 1 − 0.241067 <x≤1 4 I 4 − xM 1 4 1 2 0 True 3 0<x≤ 0 + 0.5 0<x≤ 0 True 0<x≤ 0 1 4 1 4 1 2 4 I− 4 + xM 4 5 I4 3 3 4 − xM 1<x≤ 0 <x≤ <x≤ 3 4 <x≤1 5 4 True ã Ésta es la gráfica de la solución aproximada con el método de Bubnov-Galerkin: Plot@g@xD, 8x, a, b<, PlotLabel → "Solución aproximada"D Solución aproximada 0.5 0.4 0.3 0.2 0.1 0.2 0.4 0.6 0.8 -0.1 -0.2 Printed by Mathematica for Students 1.0 1 4 1 2 3 4 − FEMcurso.nb 13 ã A continuación se muestra la gráfica de la solución analítica exacta, obtenida con el comando DSolve: solexacta = DSolve@8− ∂x Hp@xD ∂x y@xDL + q@xD ∗ y@xD f@xD, y@aD ya , y@bD yb <, y@xD, xD; exacta@x_D := Evaluate@ReplaceAll@y@xD, solexacta@@1DD D D; Plot@exacta@xD, 8x, a, b<, PlotLabel → "Solución analítica exacta"D Solución analítica exacta 0.3 0.2 0.1 0.2 0.4 0.6 0.8 1.0 -0.1 -0.2 ã Podemos graficar juntas la solución analítica y la aproximación con el método de Bubnov-Galerkin: Plot@8exacta@xD, g@xD<, 8x, a, b<, PlotLabel → "Analítica y Bubnov−Galerkin"D Analítica y Bubnov-Galerkin 0.5 0.4 0.3 0.2 0.1 0.2 0.4 0.6 0.8 1.0 -0.1 -0.2 ã Referencias Basado en el trabajo de John H. Mathews http://math.fullerton.edu/mathews/n2003/GalerkinMod.html también en la sección 11.5 “El método de Rayleigh-Ritz” del libro de Richard L. Burden y J. Douglas Faires, Printed by Mathematica for Students FEMcurso.nb 14 también en la sección 11.5 “El método de Rayleigh-Ritz” del libro de Richard L. Burden y J. Douglas Faires, “Análisis numérico” 9a. edición, editorial Cengage, págs 696-711 y finalmente también en la sección 6.2 “Galerkin’s method with piecewise polynomials” del libro de Kenneth Eriksson, D. Estep, P. Hansbo & C. Johnson, “Computational Differential Equations” Volumen 1, Cambridge University Press, 1997. Adaptado por José Luis Gómez Muñoz http://homepage.cem.itesm.mx/lgomez/ Printed by Mathematica for Students FEMcurso.nb 15 3. Ejemplo del Método de Elemento Finito donde las ecuaciones de cada elemento se generan con el método de Bubnov-Galerkin Basado en el trabajo de John H. Mathews http://math.fullerton.edu/mathews/n2003/GalerkinMod.html también en la sección 11.5 “El método de Rayleigh-Ritz” del libro de Richard L. Burden y J. Douglas Faires, “Análisis numérico” 9a. edición, editorial Cengage, págs 696-711 y finalmente también en la sección 6.2 “Galerkin’s method with piecewise polynomials” del libro de Kenneth Eriksson, D. Estep, P. Hansbo & C. Johnson, “Computational Differential Equations” Volumen 1, Cambridge University Press, 1997. Adaptado por José Luis Gómez Muñoz http://homepage.cem.itesm.mx/lgomez/ ã Se va a calcular una solución aproximada a una ecuación diferencial ordinaria, lineal e inhomogénea, d d - IpHxL yHxLM + qHxL yHxL = f HxL, con las condiciones de frontera yHaL = ya , yHbL = yb , como se dx dx muestra a continuación : Clear@x, y, p, q, f, a, bD; p@x_D := x2 ; q@x_D := 30; f@x_D := − 14 x; a = 0; b = 1; ya = 0; yb = 0.5; Print@"−∂x Hp@xD ∂x y@xDL+q@xD∗y@xDf@xD → ", − ∂x Hp@xD ∂x y@xDL + q@xD ∗ y@xD f@xDD; Print@y@aD ya D; Print@y@bD yb D; −∂x Hp@xD ∂x y@xDL+q@xD∗y@xDf@xD → 30 y@xD − 2 x y @xD − x2 y @xD − 14 x y@0D 0 y@1D 0.5 Printed by Mathematica for Students FEMcurso.nb 16 ã La solución aproximada FHxL será una combinación lineal de ciertas funciones linealmente independientes, llamadas funciones base: FHxL = ⁄nj=1 c j f j HxL. Las funciones base f j HxL usadas en el método de Elemento Finito tienen soporte local, lo que quiere decir que cada una es distinta de cero sólo en una pequeña parte del dominio: Clear@n, h, φ, x, jD; n = 5; h= b−a n−1 ; DoB 0 < x ≤ h ∗ Hj − 2L 0 h ∗ Hj − 2L < x ≤ h ∗ Hj − 1L x−h∗Hj−2L φj @x_D := EvaluateB h h∗j−x h h ∗ Hj − 1L < x ≤ h ∗ j F, h∗j < x ≤ 1 0 8j, 1, n< F; funciones = TableAφj @xD, 8j, 1, n<E; Plot@funciones, 8x, a, b<, PlotLabel → "Funciones base", PlotRange → AllD Funciones base 1.0 0.8 0.6 0.4 0.2 0.2 0.4 0.6 0.8 Printed by Mathematica for Students 1.0 FEMcurso.nb 17 ã La solución aproximada tendrá la forma FHxL = ⁄nj=1 c j f j HxL. El objetivo será encontrar los coeficientes c j que den la mejor aproximación a la solución de la ecuación diferencial: Clear@Φ, cD; n Φ@x_D := ‚ cj ∗ φj @xD; j=1 Print@"Forma de la aproximación a la solución:"D; Print@"Φ@xD=", Φ@xDD; Forma de la aproximación a la solución: 4 I 4 + xM − 4 < x ≤ 0 1 Φ@xD= 1 4 I 4 − xM 0 < x ≤ 1 0 c1 + 0<x≤ 4 I− 4 + xM 1 4 I 4 − xM 1 4 1 2 0 True <x≤ <x≤ 1 4 1 2 3 4 4 I 2 − xM 1 4 0 True 1 True 0 3 1 4 0<x≤ 4x 0<x≤ 0 4 I− 2 + xM 1 c3 + <x≤ 4 H1 − xL 1 2 3 4 0 True <x≤ 1 2 3 4 1 4 1 2 c2 + 0<x≤ 0 4 I− 4 + xM 3 4 4 I 4 − xM 1<x≤ 0 True 3 c4 + <x≤1 Printed by Mathematica for Students 5 3 4 <x≤1 5 4 c5 FEMcurso.nb 18 ã En el Método de Elemento Finito (FEM por sus siglas en Inglés) el dominio es dividido en elementos. Cada elemento contiene partes de las funciones seccionadas que no valen cero dentro del elemento: Table@ Plot@funciones, 8x, h ∗ Helemento − 1L, h ∗ elemento<, PlotLabel → "Elemento: " <> ToString@elementoD, PlotRange → 880, 1<, Automatic<D, 8elemento, 1, n − 1< D Elemento: 1 : Elemento: 2 1.0 1.0 0.8 0.8 0.6 , 0.6 0.4 0.4 0.2 0.2 0.0 0.2 0.4 0.6 0.8 0.0 1.0 , 0.2 Elemento: 3 1.0 0.8 0.8 0.6 , 0.4 0.2 0.2 0.4 0.8 1.0 0.6 0.8 1.0 > 0.6 0.4 0.2 0.6 Elemento: 4 1.0 0.0 0.4 0.0 0.2 0.4 0.6 0.8 1.0 ã La ecuación diferencial puede escribirse de la forma: d d - IpHxL yHxLM + qHxL yHxL - f HxL = 0 dx dx Si reemplazamos la solución aproximada FHxL en lugar de la solución exacta yHxL en el lado izquierdo de la ecuación anterior, el resultado ya no será exactamente cero. En su lugar obtendremos una función conocida como residuo, rHxL. En otras palabras, si el residuo rHxL, mostrado abajo, fuera cero, en ese caso la solución aproximada sería la solución exacta: d d - IpHxL FHxLM + qHxL FHxL - f HxL = rHxL dx dx ã El método de Bubnov-Galerkin consiste en encontrar la combinación lineal FHxL = ⁄nj=1 c j f j HxL cuyo residuo rHxL tenga componente igual a cero en el subespacio generado por las funciones base. Esto significa que el producto punto del residuo por cada función base debe ser cero. En el Método de Elemento Finito este cálculo se hace elemento por elemento: Ÿelemento f j HxL rHxL ‚ x = 0 es decir -Ÿelemento f j HxL d dx IpHxL d dx FHxLM ‚ x + Ÿelemento f j HxL HqHxL FHxL - f HxLL ‚ x = 0 ã Sin embargo la aproximación FHxL que estamos utilizando en este ejemplo no tiene segunda derivada. Usando integración por partes se obtiene una expresión que sólo involucra primeras derivadas: Ÿelemento p HxL dΦ HxL d φj HxL dx dx x + Ÿelemento φj HxL Hq HxL Φ HxL − f HxLL x = 0 que forman un sistema de ecuaciones para los parámetros c j correspondientes a las funciones que no Printed by Mathematica for Students FEMcurso.nb 19 son cero dentro del elemento. Estas ecuaciones todavía no toman en cuenta las condiciones de frontera. Abajo se muestra este procedimiento para el primer elemento: elemento = 1; xini = a + h ∗ Helemento − 1L; xfin = a + h ∗ elemento; ecuaciones = TableB‡ xfin xini p@xD ∗ Φ '@xD ∗ φj '@xD x + ‡ xfin xini 8j, 1, n<F; φj @xD ∗ Hq@xD ∗ Φ@xD − f@xDL x == 0, Print@"Ecuaciones sin condiciones de frontera"D; Print@"Elemento:", elementoD; Print@TableForm@ecuacionesDD Ecuaciones sin condiciones de frontera Elemento:1 1 12 1 12 Hc1 − c2 L + 1 48 H− c1 + c2 L + H7 + 120 c1 + 60 c2 L 0 1 24 H7 + 30 c1 + 60 c2 L 0 True True True ã A continuación se muestran las mismas ecuaciones del primer elemento en forma matricial: ecuaciones = ReplaceAll@ecuaciones, True → 0D; parametros = TableAcj , 8j, 1, n<E; 8v, m< = N@ CoefficientArrays@ecuaciones, parametrosD D; Print@"Ecuaciones sin condiciones de frontera"D; Print@"Elemento:", elementoD; Print@MatrixForm@mD, ".", MatrixForm@parametrosD, "==", MatrixForm@− vD D Ecuaciones sin condiciones de frontera Elemento:1 c1 2.58333 1.16667 0. 0. 0. − 0.145833 c2 1.16667 2.58333 0. 0. 0. − 0.291667 0. 0. 0. 0. 0. . c3 == 0. c4 0. 0. 0. 0. 0. 0. c5 0. 0. 0. 0. 0. 0. Printed by Mathematica for Students FEMcurso.nb 20 ã A continuación se calculan las matrices y vectores de carga para todos los elementos en este ejemplo: matrices = 8<; cargas = 8<; DoB xini = a + h ∗ Helemento − 1L; xfin = a + h ∗ elemento; ecuaciones = TableB‡ xfin xini p@xD ∗ Φ '@xD ∗ φj '@xD x + ‡ 8j, 1, n<F; xfin xini φj @xD ∗ Hq@xD ∗ Φ@xD − f@xDL x == 0, ecuaciones = ReplaceAll@ecuaciones, True → 0D; 8v, m< = N@ CoefficientArrays@ecuaciones, parametrosD D; AppendTo@matrices, mD; AppendTo@cargas, − vD; Print@"Ecuaciones sin condiciones de frontera, elemento:", elementoD; Print@MatrixForm@mD, ".", MatrixForm@parametrosD, "==", MatrixForm@− vD D, 8elemento, 1, n − 1<F Printed by Mathematica for Students FEMcurso.nb 21 Ecuaciones sin condiciones de frontera, elemento:1 c1 2.58333 1.16667 0. 0. 0. − 0.145833 c2 1.16667 2.58333 0. 0. 0. − 0.291667 0. 0. 0. 0. 0. . c3 == 0. c4 0. 0. 0. 0. 0. 0. c5 0. 0. 0. 0. 0. 0. Ecuaciones sin condiciones de frontera, elemento:2 c1 0. 0. 0. 0. 0. 0. c2 0. 3.08333 0.666667 0. 0. − 0.583333 0. 0.666667 3.08333 0. 0. . c3 == − 0.729167 c4 0. 0. 0. 0. 0. 0. c5 0. 0. 0. 0. 0. 0. Ecuaciones sin condiciones de frontera, elemento:3 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 4.08333 − 0.333333 0. − 0.333333 4.08333 0. 0. 0. c1 0. 0. c2 0. 0. 0. . c3 == − 1.02083 c4 0. − 1.16667 c5 0. 0. Ecuaciones sin condiciones de frontera, elemento:4 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. c1 0. 0. 0. 0. c2 0. 0. 0. 0. 0. 0. 0. 0. . c3 == c4 0. 5.58333 − 1.83333 − 1.45833 c5 0. − 1.83333 5.58333 − 1.60417 ã A continuación las ecuaciones de todos los elementos se suman para obtener un único sistema de ecuaciones para todos los parámetros c j . Este sistema de ecuaciones todavía no incluye las condiciones de frontera: matrizGlobal = Total@matricesD; cargaGlobal = Total@cargasD; Print@"Ecuaciones sin condiciones de frontera"D; Print@MatrixForm@matrizGlobalD, ".", MatrixForm@parametrosD, "==", MatrixForm@cargaGlobalD D Ecuaciones sin condiciones de frontera c1 2.58333 1.16667 0. 0. 0. − 0.145833 c2 1.16667 5.66667 0.666667 0. 0. − 0.875 0. 0.666667 7.16667 − 0.333333 0. − 1.75 . c3 == c4 0. 0. − 0.333333 9.66667 − 1.83333 − 2.625 c5 0. 0. 0. − 1.83333 5.58333 − 1.60417 Printed by Mathematica for Students FEMcurso.nb 22 ã A continuación se insertan las condiciones de frontera, reemplazando a las ecuaciones correspondientes: matrizGlobal@@1DD = 81, 0, 0, 0, 0<; cargaGlobal@@1DD = ya ; matrizGlobal@@nDD = 80, 0, 0, 0, 1<; cargaGlobal@@nDD = yb ; Print@"Ecuaciones CON condiciones de frontera"D; Print@MatrixForm@matrizGlobalD, ".", MatrixForm@parametrosD, "==", MatrixForm@cargaGlobalD D Ecuaciones CON condiciones de frontera c1 1 0. 0. 0. 0. 0. c2 1.16667 5.66667 0.666667 0. 0. − 0.875 0. 0.666667 7.16667 − 0.333333 0. . c3 == − 1.75 c4 0. 0. − 0.333333 9.66667 − 1.83333 − 2.625 c5 0. 0. 0. 0. 1 0.5 ã Como ya tenemos la matriz y el vector del sistema lineal, podemos obtener la solución usando el comando LinearSolve[] de Mathematica: solvector = LinearSolve@matrizGlobal, cargaGlobalD 80., − 0.126051, − 0.241067, − 0.185037, 0.5< ã Ponemos la solución en un formato adecuado para reemplazar en la expresión de FHxL solu = Table@parametros@@jDD → solvector@@jDD, 8j, 1, n<D 8c1 → 0., c2 → − 0.126051, c3 → − 0.241067, c4 → − 0.185037, c5 → 0.5< ã La solución aproximada se obtiene reemplazando los coeficientes c j en la expresión FHxL = ⁄nj=1 c j f j HxL. Abajo se le llama gHxL a la solución aproximada que se obtiene por este procedimiento: g@x_D := ReplaceAll@Φ@xD, solu D; Print@"Solución aproximada por el método de Galerkin: "D; Print@"g@xD=", g@xDD Printed by Mathematica for Students FEMcurso.nb 23 Solución aproximada por el método de Galerkin: 0<x≤ 4x g@xD=0. − 0.126051 4 1 I2 − xM 0 4 I− 2 + xM 1 0.185037 <x≤ 4 H1 − xL 1 2 3 4 0 True <x≤ 1 2 3 4 4 I− 4 + xM 1 − 0.241067 <x≤1 4 I 4 − xM 1 4 1 2 0 True 3 0<x≤ 0 + 0.5 0<x≤ 0 True 0<x≤ 0 1 4 1 4 1 2 4 I− 4 + xM 4 I 54 3 3 4 − xM 1<x≤ 0 <x≤ <x≤ 3 4 <x≤1 5 4 True ã Ésta es la gráfica de la solución aproximada con el Método de Elemento Finito: Plot@g@xD, 8x, a, b<, PlotLabel → "Solución aproximada"D Solución aproximada 0.5 0.4 0.3 0.2 0.1 0.2 0.4 0.6 0.8 -0.1 -0.2 Printed by Mathematica for Students 1.0 1 4 1 2 3 4 − FEMcurso.nb 24 ã A continuación se muestra la gráfica de la solución analítica exacta, obtenida con el comando DSolve: solexacta = DSolve@8− ∂x Hp@xD ∂x y@xDL + q@xD ∗ y@xD f@xD, y@aD ya , y@bD yb <, y@xD, xD; exacta@x_D := Evaluate@ReplaceAll@y@xD, solexacta@@1DD D D; Plot@exacta@xD, 8x, a, b<, PlotLabel → "Solución analítica exacta"D Solución analítica exacta 0.3 0.2 0.1 0.2 0.4 0.6 0.8 1.0 -0.1 -0.2 ã Podemos graficar juntas la solución analítica y la aproximación con el Método de Elemento Finito: Plot@8exacta@xD, g@xD<, 8x, a, b<, PlotLabel → "Analítica y Elemento Finito"D Analítica y Elemento Finito 0.5 0.4 0.3 0.2 0.1 0.2 0.4 0.6 0.8 1.0 -0.1 -0.2 ã Referencias Basado en el trabajo de John H. Mathews http://math.fullerton.edu/mathews/n2003/GalerkinMod.html también en la sección 11.5 “El método de Rayleigh-Ritz” del libro de Richard L. Burden y J. Douglas Faires, Printed by Mathematica for Students FEMcurso.nb 25 también en la sección 11.5 “El método de Rayleigh-Ritz” del libro de Richard L. Burden y J. Douglas Faires, “Análisis numérico” 9a. edición, editorial Cengage, págs 696-711 y finalmente también en la sección 6.2 “Galerkin’s method with piecewise polynomials” del libro de Kenneth Eriksson, D. Estep, P. Hansbo & C. Johnson, “Computational Differential Equations” Volumen 1, Cambridge University Press, 1997. Adaptado por José Luis Gómez Muñoz http://homepage.cem.itesm.mx/lgomez/ Printed by Mathematica for Students FEMcurso.nb 26 4. Ejemplo del Método de Elemento Finito ã Para poder llevar a cabo los cálculos de esta práctica es necesario instalar el paquete gratis IMS (Imtek Mathematica Suplement). El programa de instalación de IMS se descarga en la siguiente liga: http://portal.uni-freiburg.de/imteksimulation/downloads/ims . ã Primero hay que ejecutar los siguientes comandos Needs[], de tal manera que podamos usar los comandos de IMS del resto de esta práctica: Needs@"Imtek`Assembler`"D; Needs@"Imtek`BoundaryConditions`"D; Needs@"Imtek`FEMOperators`"D; Needs@"Imtek`MeshElementLibrary`"D; Needs@"Imtek`StructuredMesher`"D; Print@"Contextos de los paquetes en esta sesión:", $ContextPathD Contextos de los paquetes en esta sesión: 8Imtek`StructuredMesher`, Imtek`FEMOperators`, Imtek`ShapeFunctions`, Imtek`MeshElementLibrary`, Imtek`Graph`, Imtek`Nodes`, Imtek`BoundaryConditions`, Imtek`Assembler`, PacletManager`, WebServices`, System`, Global`< ã Se va a calcular una solución aproximada a una ecuación diferencial ordinaria, lineal e inhomogénea, d d - IpHxL yHxLM + qHxL yHxL = f HxL, con las condiciones de frontera yHaL = ya , yHbL = yb , como se dx dx muestra a continuación : Clear@x, y, p, q, f, a, bD; p@x_D := x2 ; q@x_D := 30; f@x_D := − 14 x; a = 0; b = 1; ya = 0; yb = 0.5; Print@"−∂x Hp@xD ∂x y@xDL+q@xD∗y@xDf@xD → ", − ∂x Hp@xD ∂x y@xDL + q@xD ∗ y@xD f@xDD; Print@y@aD ya D; Print@y@bD yb D; −∂x Hp@xD ∂x y@xDL+q@xD∗y@xDf@xD → 30 y@xD − 2 x y @xD − x2 y @xD − 14 x y@0D 0 y@1D 0.5 Printed by Mathematica for Students FEMcurso.nb 27 ã Se usa el comando imsGenerateLinearStructuredMesh[] para generar el mallado del dominio. El mallado consiste de nodos (puntos en el dominio) y elementos (en este caso unidimensional, los elementos son intervalos entre nodo y nodo): numElem = 4; mapeo@x_D := a + Hb − aL Hx + 1L 2 ; malla = imsGenerateLinearStructuredMesh@numElem, imsCoordinateMapping → mapeoD; Graphics@ 8Orange, imsDrawElements@mallaD, Purple, imsDrawElementIdText@mallaD, Red, imsDrawNodeText@mallaD <, Frame → True, AspectRatio → 0.5D 1.0 0.5 0.0 1 1 2 2 3 3 4 4 5 -0.5 -1.0 0.0 0.2 0.4 0.6 0.8 1.0 ã Estos son los nodos del mallado: nodos = imsGetNodes@mallaD; numNodos = Length@nodosD; ultimoNodoId = numNodos; Print@"Los nodos son: ", nodosD 1 Los nodos son: :imsNode@1, 80<, 1, 880.<<D, imsNodeB2, : >, 0, 880.<<F, 4 1 3 imsNodeB3, : >, 0, 880.<<F, imsNodeB4, : >, 0, 880.<<F, imsNode@5, 81<, 1, 880.<<D> 2 4 Printed by Mathematica for Students FEMcurso.nb 28 ã Estos son los elementos del mallado: elementos = imsGetElements@mallaD; Print@"Los elementos son: ", elementosD Los elementos son: 8imsLineLinear1DOF@1, 81, 2<, 0D, imsLineLinear1DOF@2, 82, 3<, 0D, imsLineLinear1DOF@3, 83, 4<, 0D, imsLineLinear1DOF@4, 84, 5<, 0D< ã En este ejemplo unidimensional, a cada elemento le corresponden dos nodos: nodosPorElemento = imsGetIncidentsIds@elementosD 881, 2<, 82, 3<, 83, 4<, 84, 5<< ã Hay una matriz local por cada elemento. Después esa matriz local será “ensamblada” en la matriz global en los renglones y columnas que corresponden a los nodos del elemento: matrices = TableBimsMakeElementMatrixBJ 0 0 N, 0 0 nodosPorElemento@@jDD, nodosPorElemento@@jDDF, 8j, 1, numElem<F 8imsElementMatrix@880, 0<, 80, 0<<, 81, 2<, 81, 2<D, imsElementMatrix@880, 0<, 80, 0<<, 82, 3<, 82, 3<D, imsElementMatrix@880, 0<, 80, 0<<, 83, 4<, 83, 4<D, imsElementMatrix@880, 0<, 80, 0<<, 84, 5<, 84, 5<D< ã Hay un vector local de fuerzas, o cargas, por cada elemento. Después ese vector local será “ensamblado” en el vector global en los renglones que corresponden a los nodos del elemento: cargas = TableBimsMakeElementMatrixBJ 0 N, 0 nodosPorElemento@@jDD, nodosPorElemento@@jDDF, 8j, 1, numElem<F 8imsElementMatrix@880<, 80<<, 81, 2<, 81, 2<D, imsElementMatrix@880<, 80<<, 82, 3<, 82, 3<D, imsElementMatrix@880<, 80<<, 83, 4<, 83, 4<D, imsElementMatrix@880<, 80<<, 84, 5<, 84, 5<D< ã El coeficiente pHxL en la ecuación diferencial es la “función de difusión”: d d - IpHxL yHxLM + qHxL yHxL = f HxL dx dx funcionDifusion@maker_, x_D := 88p@xD<<; Print@"funcionDifusion@marker,xD=", funcionDifusion@marker, xDD funcionDifusion@marker,xD=99x2 == Printed by Mathematica for Students FEMcurso.nb 29 ã Aquí se calcula el efecto de la “función de difusión” (coeficiente pHxL en la ecuación diferencial ) en las matrices y cargas (en las ecuaciones) de cada elemento: matricesycargas = Table@ imsNFEMDiffusion@ 8matrices@@jDD, cargas@@jDD<, elementos@@jDD, imsGetNodes@malla, nodosPorElemento@@jDDD, funcionDifusion D, 8j, 1, numElem<D [email protected], − 0.0833333<, 8− 0.0833333, 0.0833333<<, 81, 2<, 81, 2<D, imsElementMatrix@880<, 80<<, 81, 2<, 81, 2<D<, [email protected], − 0.583333<, 8− 0.583333, 0.583333<<, 82, 3<, 82, 3<D, imsElementMatrix@880<, 80<<, 82, 3<, 82, 3<D<, [email protected], − 1.58333<, 8− 1.58333, 1.58333<<, 83, 4<, 83, 4<D, imsElementMatrix@880<, 80<<, 83, 4<, 83, 4<D<, [email protected], − 3.08333<, 8− 3.08333, 3.08333<<, 84, 5<, 84, 5<D, imsElementMatrix@880<, 80<<, 84, 5<, 84, 5<D<< ã Actualizamos la lista de matrices matrices = matricesycargas@@All, 1DD [email protected], − 0.0833333<, 8− 0.0833333, 0.0833333<<, 81, 2<, 81, 2<D, imsElementMatrix@ 880.583333, − 0.583333<, 8− 0.583333, 0.583333<<, 82, 3<, 82, 3<D, [email protected], − 1.58333<, 8− 1.58333, 1.58333<<, 83, 4<, 83, 4<D, [email protected], − 3.08333<, 8− 3.08333, 3.08333<<, 84, 5<, 84, 5<D< ã Actualizamos la lista de cargas cargas = matricesycargas@@All, 2DD 8imsElementMatrix@880<, 80<<, 81, 2<, 81, 2<D, imsElementMatrix@880<, 80<<, 82, 3<, 82, 3<D, imsElementMatrix@880<, 80<<, 83, 4<, 83, 4<D, imsElementMatrix@880<, 80<<, 84, 5<, 84, 5<D< ã El coeficiente qHxL en la ecuación diferencial es la “función de reacción”, d d - IpHxL yHxLM + qHxL yHxL = f HxL dx dx funcionReaccion@marker_, x_D := q@xD; Print@"funcionReaccion@marker,xD=", funcionReaccion@marker, xDD funcionReaccion@marker,xD=30 Printed by Mathematica for Students FEMcurso.nb 30 ã Aquí se calcula el efecto de la “función de reacción” (coeficiente qHxL en la ecuación diferencial ) en las matrices y cargas (en las ecuaciones) de cada elemento: matricesycargas = Table@ imsNFEMReaction@ 8matrices@@jDD, cargas@@jDD<, elementos@@jDD, imsGetNodes@malla, nodosPorElemento@@jDDD, funcionReaccion D, 8j, 1, numElem<D [email protected], 1.16667<, 81.16667, 2.58333<<, 81, 2<, 81, 2<D, imsElementMatrix@880<, 80<<, 81, 2<, 81, 2<D<, [email protected], 0.666667<, 80.666667, 3.08333<<, 82, 3<, 82, 3<D, imsElementMatrix@880<, 80<<, 82, 3<, 82, 3<D<, [email protected], − 0.333333<, 8− 0.333333, 4.08333<<, 83, 4<, 83, 4<D, imsElementMatrix@880<, 80<<, 83, 4<, 83, 4<D<, [email protected], − 1.83333<, 8− 1.83333, 5.58333<<, 84, 5<, 84, 5<D, imsElementMatrix@880<, 80<<, 84, 5<, 84, 5<D<< ã Actualizamos la lista de matrices matrices = matricesycargas@@All, 1DD [email protected], 1.16667<, 81.16667, 2.58333<<, 81, 2<, 81, 2<D, [email protected], 0.666667<, 80.666667, 3.08333<<, 82, 3<, 82, 3<D, [email protected], − 0.333333<, 8− 0.333333, 4.08333<<, 83, 4<, 83, 4<D, [email protected], − 1.83333<, 8− 1.83333, 5.58333<<, 84, 5<, 84, 5<D< ã Actualizamos la lista de cargas cargas = matricesycargas@@All, 2DD 8imsElementMatrix@880<, 80<<, 81, 2<, 81, 2<D, imsElementMatrix@880<, 80<<, 82, 3<, 82, 3<D, imsElementMatrix@880<, 80<<, 83, 4<, 83, 4<D, imsElementMatrix@880<, 80<<, 84, 5<, 84, 5<D< ã La función f HxL en la ecuación diferencial es la “función de carga”, - d dx IpHxL funcionCarga@maker_, x_D := f@xD; Print@"funcionCarga@marker,xD=", funcionCarga@marker, xDD funcionCarga@marker,xD=− 14 x Printed by Mathematica for Students d dx yHxLM + qHxL yHxL = f HxL FEMcurso.nb 31 ã Aquí se calcula el efecto de la “función de carga” ( f HxL en la ecuación diferencial ) en las matrices y cargas (en las ecuaciones) de cada elemento: matricesycargas = Table@ imsNFEMLoad@ 8matrices@@jDD, cargas@@jDD<, elementos@@jDD, imsGetNodes@malla, nodosPorElemento@@jDDD, funcionCarga D, 8j, 1, numElem<D [email protected], 1.16667<, 81.16667, 2.58333<<, 81, 2<, 81, 2<D, imsElementMatrix@88− 0.145833<, 8− 0.291667<<, 81, 2<, 81<D<, [email protected], 0.666667<, 80.666667, 3.08333<<, 82, 3<, 82, 3<D, imsElementMatrix@88− 0.583333<, 8− 0.729167<<, 82, 3<, 81<D<, [email protected], − 0.333333<, 8− 0.333333, 4.08333<<, 83, 4<, 83, 4<D, imsElementMatrix@88− 1.02083<, 8− 1.16667<<, 83, 4<, 81<D<, [email protected], − 1.83333<, 8− 1.83333, 5.58333<<, 84, 5<, 84, 5<D, imsElementMatrix@88− 1.45833<, 8− 1.60417<<, 84, 5<, 81<D<< ã Actualizamos la lista de matrices matrices = matricesycargas@@All, 1DD [email protected], 1.16667<, 81.16667, 2.58333<<, 81, 2<, 81, 2<D, [email protected], 0.666667<, 80.666667, 3.08333<<, 82, 3<, 82, 3<D, [email protected], − 0.333333<, 8− 0.333333, 4.08333<<, 83, 4<, 83, 4<D, [email protected], − 1.83333<, 8− 1.83333, 5.58333<<, 84, 5<, 84, 5<D< ã Actualizamos la lista de cargas cargas = matricesycargas@@All, 2DD 8imsElementMatrix@88− 0.145833<, 8− 0.291667<<, 81, 2<, 81<D, imsElementMatrix@88− 0.583333<, 8− 0.729167<<, 82, 3<, 81<D, imsElementMatrix@88− 1.02083<, 8− 1.16667<<, 83, 4<, 81<D, imsElementMatrix@88− 1.45833<, 8− 1.60417<<, 84, 5<, 81<D< Printed by Mathematica for Students FEMcurso.nb 32 ã A continuación se “ensamblan” las matrices de cada elemento para formar la matriz global, y los vectores de carga de cada elemento para formar el vector de carga global: matrizGlobal = SparseArray@8<, 8numNodos, numNodos<D; cargaGlobal = Table@0, 8numNodos<, 81<D; Do@ imsAssemble@ matrices@@jDD, matrizGlobalD; imsAssemble@ cargas@@jDD, cargaGlobalD, 8j, 1, numElem< D; parametros = TableAcj , 8j, 1, numNodos<E; vectorCargas = Flatten@cargaGlobalD; Print@MatrixForm@matrizGlobalD, ".", MatrixForm@parametrosD, "==", MatrixForm@vectorCargasD D c1 2.58333 1.16667 0 0 0 − 0.145833 c2 1.16667 5.66667 0.666667 0 0 − 0.875 0 0.666667 7.16667 − 0.333333 0 − 1.75 . c3 == c4 0 0 − 0.333333 9.66667 − 1.83333 − 2.625 c5 0 0 0 − 1.83333 5.58333 − 1.60417 ã El siguiente paso es insertar las condiciones de frontera, lo cual modifica a la matriz global y al vector global de cargas. En este ejemplo unidimensional, los únicos nodos de frontera son el primero y el último: imsDirichlet@8matrizGlobal, vectorCargas<, 1, ya D; imsDirichlet@8matrizGlobal, vectorCargas<, ultimoNodoId, yb D; Print@MatrixForm@matrizGlobalD, ".", MatrixForm@parametrosD, "==", MatrixForm@vectorCargasD D 1. 0. 0. 0. 0. 5.66667 0.666667 0. 0. 0.666667 7.16667 − 0.333333 0. 0. − 0.333333 9.66667 0. 0. 0. 0. c1 0. 0. c2 0. − 0.875 0. . c3 == − 1.75 c4 0. − 1.70833 c5 1. 0.5 Printed by Mathematica for Students FEMcurso.nb 33 ã A continuación resolvemos el sistema de ecuaciones, con lo cual obtenemos el valor de la solución aproximada en cada nodo: solvector = LinearSolve@matrizGlobal, vectorCargasD 80., − 0.126051, − 0.241067, − 0.185037, 0.5< ã A partir de los nodos originales construimos nuevos nodos, esta vez cada nodo nuevo incluye el valor de la solución que se acaba de obtener: nodosNuevos = Table@imsSetValues@ nodos@@jDD, 88 solvector@@jDD << D, 8j, 1, numNodos<D :imsNode@1, 80<, 1, 880.<<D, 1 1 imsNodeB2, : >, 0, 88− 0.126051<<F, imsNodeB3, : >, 0, 88− 0.241067<<F, 4 2 3 imsNodeB4, : >, 0, 88− 0.185037<<F, imsNode@5, 81<, 1, 880.5<<D> 4 ã Estos son los nuevos nodos en la frontera. Incluyen el valor de la solución: nodosNuevosFrontera = nodosNuevos@@ imsGetIds@ imsGetBoundaryNodes@mallaD D DD 8imsNode@1, 80<, 1, 880.<<D, imsNode@5, 81<, 1, 880.5<<D< ã Estos son los nuevos nodos interiores. Incluyen el valor de la solución: nodosNuevosInterior = nodosNuevos@@ imsGetIds@ imsGetInteriorNodes@mallaD D DD 1 :imsNodeB2, : >, 0, 88− 0.126051<<F, 4 1 3 imsNodeB3, : >, 0, 88− 0.241067<<F, imsNodeB4, : >, 0, 88− 0.185037<<F> 2 4 Printed by Mathematica for Students FEMcurso.nb 34 ã Esta es la nueva malla, con los valores de la solución, como se muestra en la gráifca: mallaNueva = imsMakeNexus@nodosNuevosFrontera, nodosNuevosInterior, elementosD; graficaFEM = Graphics@8 Brown, imsDrawElementSolution@mallaNuevaD, Green, imsDrawElements@mallaNuevaD, Blue, imsDrawElementIdText@mallaNuevaD, Red, imsDrawNodeText@mallaNuevaD <, Frame → True, AspectRatio → 0.5D 0.4 0.2 0.0 1 1 2 2 3 3 4 4 5 -0.2 0.0 0.2 0.4 0.6 0.8 Printed by Mathematica for Students 1.0 FEMcurso.nb 35 ã A continuación se muestra la gráfica de la solución analítica exacta, obtenida con el comando DSolve: solexacta = DSolve@8− ∂x Hp@xD ∂x y@xDL + q@xD ∗ y@xD f@xD, y@aD ya , y@bD yb <, y@xD, xD; exacta@x_D := Evaluate@ReplaceAll@y@xD, solexacta@@1DD D D; graficaExacta = Plot@exacta@xD, 8x, a, b<, PlotLabel → "Solución analítica exacta", PlotRange → AllD Solución analítica exacta 0.5 0.4 0.3 0.2 0.1 0.2 0.4 0.6 0.8 1.0 -0.1 -0.2 ã Podemos graficar juntas la solución analítica y la aproximación con el método de Elemento Finito: Show@graficaExacta, graficaFEM, PlotLabel → "Analítica y FEM"D Analítica y FEM 0.5 0.4 0.3 0.2 0.1 1 1 0.2 2 2 0.4 3 0.6 3 4 0.8 4 5 1.0 -0.1 -0.2 ã Referencias Para poder llevar a cabo los cálculos de esta práctica es necesario instalar el paquete gratis IMS (Imtek Mathematica Suplement). El programa de instalación de IMS se descarga en la siguiente liga: Printed by Mathematica for Students FEMcurso.nb 36 Mathematica Suplement). El programa de instalación de IMS se descarga en la siguiente liga: http://portal.uni-freiburg.de/imteksimulation/downloads/ims . Capítulo 6, Sección 6.3 “Finite Element Method” de la Tesis de Doctorado de Oliver Rüebenkönig “Free Surface Flow and the IMTEK Mathematica Supplement”, Institut für Mikrosystemtechnik (IMTEK), AlbertLudwigs-Univesität, Freiburg, Alemania. ftp://elmo.imtek.uni-freiburg.de/pub/people/ruebenko/writing/dissertation1.1.pdf . Daryl L. Logan, “A First Course in the Finite Element Method”, Fifth Edition, 2012, Cengage Leraning Printed by Mathematica for Students FEMcurso.nb 37 5. Ejemplo del Método de Elemento Finito con condiciones periódicas ã Para poder llevar a cabo los cálculos de esta práctica es necesario instalar el paquete gratis IMS (Imtek Mathematica Suplement). El programa de instalación de IMS se descarga en la siguiente liga: http://portal.uni-freiburg.de/imteksimulation/downloads/ims . ã Primero hay que ejecutar los siguientes comandos Needs[], de tal manera que podamos usar los comandos de IMS del resto de esta práctica: Needs@"Imtek`Assembler`"D; Needs@"Imtek`BoundaryConditions`"D; Needs@"Imtek`FEMOperators`"D; Needs@"Imtek`MeshElementLibrary`"D; Needs@"Imtek`StructuredMesher`"D; Print@"Contextos de los paquetes en esta sesión:", $ContextPathD Contextos de los paquetes en esta sesión: 8Imtek`StructuredMesher`, Imtek`FEMOperators`, Imtek`ShapeFunctions`, Imtek`MeshElementLibrary`, Imtek`Graph`, Imtek`Nodes`, Imtek`BoundaryConditions`, Imtek`Assembler`, PacletManager`, WebServices`, System`, Global`< ã Se va a calcular una solución aproximada a una ecuación diferencial ordinaria, lineal e inhomogénea, d yHxL + qHxL yHxL = f HxL, con las condiciones periódicas yHaL = yHbL, como se muestra a sHxL dx continuación : Clear@x, y, q, s, f, a, bD; s@x_D := 1; q@x_D := 1; f@x_D := Cos@2 π xD − 2 π Sin@2 π xD; a = 0; b = 1; Print@"s@xD∗∂x y@xD+q@xD∗y@xDf@xD → ", s@xD ∗ ∂x y@xD + q@xD ∗ y@xD f@xDD; Print@"Condiciones periódicas y@aDy@bD, con a=", a, ", b=", bD s@xD∗∂x y@xD+q@xD∗y@xDf@xD → y@xD + y @xD Cos@2 π xD − 2 π Sin@2 π xD Condiciones periódicas y@aDy@bD, con a=0, b=1 Printed by Mathematica for Students FEMcurso.nb 38 ã Se usa el comando imsGenerateLinearStructuredMesh[] para generar el mallado del dominio. El mallado consiste de nodos (puntos en el dominio) y elementos (en este caso unidimensional, los elementos son intervalos entre nodo y nodo): numElem = 5; mapeo@x_D := a + Hb − aL Hx + 1L 2 ; malla = imsGenerateLinearStructuredMesh@numElem, imsCoordinateMapping → mapeoD; Graphics@ 8Orange, imsDrawElements@mallaD, Purple, imsDrawElementIdText@mallaD, Red, imsDrawNodeText@mallaD <, Frame → True, AspectRatio → 0.5D 1.0 0.5 0.0 1 1 2 2 3 3 4 4 5 5 6 -0.5 -1.0 0.0 0.2 0.4 0.6 0.8 1.0 ã Estos son los nodos del mallado: nodos = imsGetNodes@mallaD; numNodos = Length@nodosD; ultimoNodoId = numNodos; Print@"Los nodos son: ", nodosD Los nodos son: 1 2 :imsNode@1, 80<, 1, 880.<<D, imsNodeB2, : >, 0, 880.<<F, imsNodeB3, : >, 0, 880.<<F, 5 5 3 4 imsNodeB4, : >, 0, 880.<<F, imsNodeB5, : >, 0, 880.<<F, imsNode@6, 81<, 1, 880.<<D> 5 5 Printed by Mathematica for Students FEMcurso.nb 39 ã Estos son los elementos del mallado: elementos = imsGetElements@mallaD; Print@"Los elementos son: ", elementosD Los elementos son: 8imsLineLinear1DOF@1, 81, 2<, 0D, imsLineLinear1DOF@2, 82, 3<, 0D, imsLineLinear1DOF@3, 83, 4<, 0D, imsLineLinear1DOF@4, 84, 5<, 0D, imsLineLinear1DOF@5, 85, 6<, 0D< ã En este ejemplo unidimensional, a cada elemento le corresponden dos nodos: nodosPorElemento = imsGetIncidentsIds@elementosD 881, 2<, 82, 3<, 83, 4<, 84, 5<, 85, 6<< ã Hay una matriz local por cada elemento. Después esa matriz local será “ensamblada” en la matriz global en los renglones y columnas que corresponden a los nodos del elemento: matrices = TableBimsMakeElementMatrixBJ 0 0 N, 0 0 nodosPorElemento@@jDD, nodosPorElemento@@jDDF, 8j, 1, numElem<F 8imsElementMatrix@880, 0<, 80, 0<<, 81, 2<, 81, 2<D, imsElementMatrix@880, 0<, 80, 0<<, 82, 3<, 82, 3<D, imsElementMatrix@880, 0<, 80, 0<<, 83, 4<, 83, 4<D, imsElementMatrix@880, 0<, 80, 0<<, 84, 5<, 84, 5<D, imsElementMatrix@880, 0<, 80, 0<<, 85, 6<, 85, 6<D< ã Hay un vector local de fuerzas, o cargas, por cada elemento. Después ese vector local será “ensamblado” en el vector global en los renglones que corresponden a los nodos del elemento: cargas = TableBimsMakeElementMatrixBJ 0 N, 0 nodosPorElemento@@jDD, nodosPorElemento@@jDDF, 8j, 1, numElem<F 8imsElementMatrix@880<, 80<<, 81, 2<, 81, 2<D, imsElementMatrix@880<, 80<<, 82, 3<, 82, 3<D, imsElementMatrix@880<, 80<<, 83, 4<, 83, 4<D, imsElementMatrix@880<, 80<<, 84, 5<, 84, 5<D, imsElementMatrix@880<, 80<<, 85, 6<, 85, 6<D< Printed by Mathematica for Students FEMcurso.nb 40 ã El coeficiente sHxL en la ecuación diferencial es la “función de convección”: d sHxL yHxL + qHxL yHxL = f HxL, dx funcionConveccion@maker_, x_D := 88s@xD<<; Print@"funcionConveccion@marker,xD=", funcionConveccion@marker, xDD funcionConveccion@marker,xD=881<< ã Aquí se calcula el efecto de la “función de convección” (coeficiente sHxL en la ecuación diferencial ) en las matrices y cargas (en las ecuaciones) de cada elemento: matricesycargas = Table@ imsNFEMConvection@ 8matrices@@jDD, cargas@@jDD<, elementos@@jDD, imsGetNodes@malla, nodosPorElemento@@jDDD, funcionConveccion D, 8j, 1, numElem<D 88imsElementMatrix@88− 0.5, 0.5<, 8− 0.5, 0.5<<, 81, 2<, 81, 2<D, imsElementMatrix@880<, 80<<, 81, 2<, 81, 2<D<, 8imsElementMatrix@88− 0.5, 0.5<, 8− 0.5, 0.5<<, 82, 3<, 82, 3<D, imsElementMatrix@880<, 80<<, 82, 3<, 82, 3<D<, 8imsElementMatrix@88− 0.5, 0.5<, 8− 0.5, 0.5<<, 83, 4<, 83, 4<D, imsElementMatrix@880<, 80<<, 83, 4<, 83, 4<D<, 8imsElementMatrix@88− 0.5, 0.5<, 8− 0.5, 0.5<<, 84, 5<, 84, 5<D, imsElementMatrix@880<, 80<<, 84, 5<, 84, 5<D<, 8imsElementMatrix@88− 0.5, 0.5<, 8− 0.5, 0.5<<, 85, 6<, 85, 6<D, imsElementMatrix@880<, 80<<, 85, 6<, 85, 6<D<< ã Actualizamos la lista de matrices matrices = matricesycargas@@All, 1DD 8imsElementMatrix@88− 0.5, 0.5<, 8− 0.5, 0.5<<, 81, 2<, 81, 2<D, imsElementMatrix@88− 0.5, 0.5<, 8− 0.5, 0.5<<, 82, 3<, 82, 3<D, imsElementMatrix@88− 0.5, 0.5<, 8− 0.5, 0.5<<, 83, 4<, 83, 4<D, imsElementMatrix@88− 0.5, 0.5<, 8− 0.5, 0.5<<, 84, 5<, 84, 5<D, imsElementMatrix@88− 0.5, 0.5<, 8− 0.5, 0.5<<, 85, 6<, 85, 6<D< Printed by Mathematica for Students FEMcurso.nb 41 ã Actualizamos la lista de cargas cargas = matricesycargas@@All, 2DD 8imsElementMatrix@880<, 80<<, 81, 2<, 81, 2<D, imsElementMatrix@880<, 80<<, 82, 3<, 82, 3<D, imsElementMatrix@880<, 80<<, 83, 4<, 83, 4<D, imsElementMatrix@880<, 80<<, 84, 5<, 84, 5<D, imsElementMatrix@880<, 80<<, 85, 6<, 85, 6<D< ã El coeficiente qHxL en la ecuación diferencial es la “función de reacción”, d sHxL yHxL + qHxL yHxL = f HxL, dx funcionReaccion@marker_, x_D := q@xD; Print@"funcionReaccion@marker,xD=", funcionReaccion@marker, xDD funcionReaccion@marker,xD=1 ã Aquí se calcula el efecto de la “función de reacción” (coeficiente qHxL en la ecuación diferencial ) en las matrices y cargas (en las ecuaciones) de cada elemento: matricesycargas = Table@ imsNFEMReaction@ 8matrices@@jDD, cargas@@jDD<, elementos@@jDD, imsGetNodes@malla, nodosPorElemento@@jDDD, funcionReaccion D, 8j, 1, numElem<D 88imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 81, 2<, 81, 2<D, imsElementMatrix@880<, 80<<, 81, 2<, 81, 2<D<, 8imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 82, 3<, 82, 3<D, imsElementMatrix@880<, 80<<, 82, 3<, 82, 3<D<, 8imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 83, 4<, 83, 4<D, imsElementMatrix@880<, 80<<, 83, 4<, 83, 4<D<, 8imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 84, 5<, 84, 5<D, imsElementMatrix@880<, 80<<, 84, 5<, 84, 5<D<, 8imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 85, 6<, 85, 6<D, imsElementMatrix@880<, 80<<, 85, 6<, 85, 6<D<< Printed by Mathematica for Students FEMcurso.nb 42 ã Actualizamos la lista de matrices matrices = matricesycargas@@All, 1DD 8imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 81, 2<, 81, 2<D, imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 82, 3<, 82, 3<D, imsElementMatrix@ 88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 83, 4<, 83, 4<D, imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 84, 5<, 84, 5<D, imsElementMatrix@ 88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 85, 6<, 85, 6<D< ã Actualizamos la lista de cargas cargas = matricesycargas@@All, 2DD 8imsElementMatrix@880<, 80<<, 81, 2<, 81, 2<D, imsElementMatrix@880<, 80<<, 82, 3<, 82, 3<D, imsElementMatrix@880<, 80<<, 83, 4<, 83, 4<D, imsElementMatrix@880<, 80<<, 84, 5<, 84, 5<D, imsElementMatrix@880<, 80<<, 85, 6<, 85, 6<D< ã La función f HxL en la ecuación diferencial es la “función de carga”, - d dx IpHxL funcionCarga@maker_, x_D := f@xD; Print@"funcionCarga@marker,xD=", funcionCarga@marker, xDD funcionCarga@marker,xD=Cos@2 π xD − 2 π Sin@2 π xD Printed by Mathematica for Students d dx yHxLM + qHxL yHxL = f HxL FEMcurso.nb 43 ã Aquí se calcula el efecto de la “función de carga” ( f HxL en la ecuación diferencial ) en las matrices y cargas (en las ecuaciones) de cada elemento: matricesycargas = Table@ imsNFEMLoad@ 8matrices@@jDD, cargas@@jDD<, elementos@@jDD, imsGetNodes@malla, nodosPorElemento@@jDDD, funcionCarga D, 8j, 1, numElem<D 88imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 81, 2<, 81, 2<D, imsElementMatrix@88− 0.15567<, 8− 0.383949<<, 81, 2<, 81<D<, 8imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 82, 3<, 82, 3<D, imsElementMatrix@88− 0.607863<, 8− 0.56799<<, 82, 3<, 81<D<, 8imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 83, 4<, 83, 4<D, imsElementMatrix@88− 0.22001<, 80.0329116<<, 83, 4<, 81<D<, 8imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 84, 5<, 84, 5<D, [email protected]<, 80.58833<<, 84, 5<, 81<D<, 8imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 85, 6<, 85, 6<D, [email protected]<, 80.330696<<, 85, 6<, 81<D<< ã Actualizamos la lista de matrices matrices = matricesycargas@@All, 1DD 8imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 81, 2<, 81, 2<D, imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 82, 3<, 82, 3<D, imsElementMatrix@ 88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 83, 4<, 83, 4<D, imsElementMatrix@88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 84, 5<, 84, 5<D, imsElementMatrix@ 88− 0.433333, 0.533333<, 8− 0.466667, 0.566667<<, 85, 6<, 85, 6<D< ã Actualizamos la lista de cargas cargas = matricesycargas@@All, 2DD 8imsElementMatrix@88− 0.15567<, 8− 0.383949<<, 81, 2<, 81<D, imsElementMatrix@88− 0.607863<, 8− 0.56799<<, 82, 3<, 81<D, imsElementMatrix@88− 0.22001<, 80.0329116<<, 83, 4<, 81<D, [email protected]<, 80.58833<<, 84, 5<, 81<D, [email protected]<, 80.330696<<, 85, 6<, 81<D< Printed by Mathematica for Students FEMcurso.nb 44 ã A continuación se “ensamblan” las matrices de cada elemento para formar la matriz global, y se “ensamblan” los vectores de carga de cada elemento para formar el vector de carga global: matrizGlobal = SparseArray@8<, 8numNodos, numNodos<D; cargaGlobal = Table@0, 8numNodos<, 81<D; Do@ imsAssemble@ matrices@@jDD, matrizGlobalD; imsAssemble@ cargas@@jDD, cargaGlobalD, 8j, 1, numElem< D; parametros = TableAcj , 8j, 1, numNodos<E; vectorCargas = Flatten@cargaGlobalD; Print@MatrixForm@matrizGlobalD, ".", MatrixForm@parametrosD, "==", MatrixForm@vectorCargasD D c1 − 0.433333 0.533333 0 0 0 0 − 0.15567 c2 − 0.466667 0.133333 0.533333 0 0 0 − 0.991812 c 0 − 0.466667 0.133333 0.533333 0 0 − 0.788 . 3 == c4 0 0 − 0.466667 0.133333 0.533333 0 0.504801 c5 0 0 0 − 0.466667 0.133333 0.533333 1.09998 c6 0 0 0 0 − 0.466667 0.566667 0.330696 ã El siguiente paso es insertar las condiciones periódicas, lo cual modifica a la matriz global y al vector global de cargas. En este ejemplo unidimensional, sólo es necesario insertar un multiplicador de Lagrange l1 : imsLagrangeMultipliers@ 8 matrizGlobal, vectorCargas <, 88 1, ultimoNodoId<<, 80<, 8 8 1, − 1 < < D; AppendTo@parametros, λ1 D; Print@MatrixForm@matrizGlobalD, ".", MatrixForm@parametrosD, "==", MatrixForm@vectorCargasD D c1 − 0.433333 0.533333 0 0 0 0 1 − 0.15567 c2 − 0.466667 0.133333 0.533333 0 0 0 0 − 0.991812 c3 0 − 0.466667 0.133333 0.533333 0 0 0 − 0.788 0 0 − 0.466667 0.133333 0.533333 0 0 . c4 == 0.504801 c5 0 0 0 − 0.466667 0.133333 0.533333 0 1.09998 c6 0 0 0 0 − 0.466667 0.566667 − 1 0.330696 λ1 1 0 0 0 0 −1 0 0 Printed by Mathematica for Students FEMcurso.nb 45 ã A continuación resolvemos el sistema de ecuaciones, con lo cual obtenemos el valor de la solución aproximada en cada nodo (y también los valores de los multiplicadores de Lagrange, lk ): solvector = LinearSolve@matrizGlobal, vectorCargasD 81.15582, 0.354274, − 0.93687, − 0.933292, 0.360064, 1.15582, 0.15624< ã A partir de los nodos originales construimos nuevos nodos, esta vez cada nodo nuevo incluye el valor de la solución que se acaba de obtener: nodosNuevos = Table@imsSetValues@ nodos@@jDD, 88 solvector@@jDD << D, 8j, 1, numNodos<D 1 :imsNode@1, 80<, 1, 881.15582<<D, imsNodeB2, : >, 0, 880.354274<<F, 5 2 3 imsNodeB3, : >, 0, 88− 0.93687<<F, imsNodeB4, : >, 0, 88− 0.933292<<F, 5 5 4 imsNodeB5, : >, 0, 880.360064<<F, imsNode@6, 81<, 1, 881.15582<<D> 5 ã Estos son los nuevos nodos en la frontera. Incluyen el valor de la solución: nodosNuevosFrontera = nodosNuevos@@ imsGetIds@ imsGetBoundaryNodes@mallaD D DD 8imsNode@1, 80<, 1, 881.15582<<D, imsNode@6, 81<, 1, 881.15582<<D< ã Estos son los nuevos nodos interiores. Incluyen el valor de la solución: nodosNuevosInterior = nodosNuevos@@ imsGetIds@ imsGetInteriorNodes@mallaD D DD 1 2 :imsNodeB2, : >, 0, 880.354274<<F, imsNodeB3, : >, 0, 88− 0.93687<<F, 5 5 3 4 imsNodeB4, : >, 0, 88− 0.933292<<F, imsNodeB5, : >, 0, 880.360064<<F> 5 5 Printed by Mathematica for Students FEMcurso.nb 46 ã Esta es la nueva malla, con los valores de la solución, como se muestra en la gráifca: mallaNueva = imsMakeNexus@nodosNuevosFrontera, nodosNuevosInterior, elementosD; graficaFEM = Graphics@8 Brown, imsDrawElementSolution@mallaNuevaD, Green, imsDrawElements@mallaNuevaD, Blue, imsDrawElementIdText@mallaNuevaD, Red, imsDrawNodeText@mallaNuevaD <, Frame → True, AspectRatio → 0.5D 1.0 0.5 0.0 1 1 2 2 3 3 4 4 5 5 6 -0.5 -1.0 0.0 0.2 0.4 0.6 0.8 Printed by Mathematica for Students 1.0 FEMcurso.nb 47 ã A continuación se muestra la gráfica de la solución analítica exacta, obtenida con el comando DSolve: solexacta = DSolve@8 s@xD ∗ ∂x y@xD + q@xD ∗ y@xD f@xD, y@aD y@bD <, y@xD, xD; exacta@x_D := Evaluate@ReplaceAll@y@xD, solexacta@@1DD D D; graficaExacta = Plot@exacta@xD, 8x, a, b<, PlotLabel → "Solución analítica exacta", PlotRange → All, AxesOrigin → 80, 0<D Solución analítica exacta 1.0 0.5 0.2 0.4 0.6 0.8 1.0 -0.5 -1.0 ã Podemos graficar juntas la solución analítica y la aproximación con el método de Elemento Finito: Show@graficaExacta, graficaFEM, PlotLabel → "Analítica y FEM"D Analítica y FEM 1.0 0.5 1 1 2 0.2 2 3 0.4 3 4 0.6 4 5 0.8 5 -0.5 -1.0 Printed by Mathematica for Students 6 1.0 FEMcurso.nb 48 ã Referencias Para poder llevar a cabo los cálculos de esta práctica es necesario instalar el paquete gratis IMS (Imtek Mathematica Suplement). El programa de instalación de IMS se descarga en la siguiente liga: http://portal.uni-freiburg.de/imteksimulation/downloads/ims . Capítulo 6, Sección 6.3 “Finite Element Method” de la Tesis de Doctorado de Oliver Rüebenkönig “Free Surface Flow and the IMTEK Mathematica Supplement”, Institut für Mikrosystemtechnik (IMTEK), AlbertLudwigs-Univesität, Freiburg, Alemania. ftp://elmo.imtek.uni-freiburg.de/pub/people/ruebenko/writing/dissertation1.1.pdf . Daryl L. Logan, “A First Course in the Finite Element Method”, Fifth Edition, 2012, Cengage Leraning Printed by Mathematica for Students FEMcurso.nb 49 6. Ejemplo del Método de Elemento Finito en dos dimensiones ã Para poder llevar a cabo los cálculos de esta práctica es necesario instalar el paquete gratis IMS (Imtek Mathematica Suplement). El programa de instalación de IMS se descarga en la siguiente liga: http://portal.uni-freiburg.de/imteksimulation/downloads/ims . ã Primero hay que ejecutar los siguientes comandos Needs[], de tal manera que podamos usar los comandos de IMS del resto de esta práctica: Needs@"Imtek`Assembler`"D; Needs@"Imtek`BoundaryConditions`"D; Needs@"Imtek`FEMOperators`"D; Needs@"Imtek`MeshElementLibrary`"D; Needs@"Imtek`StructuredMesher`"D; Print@"Contextos de los paquetes en esta sesión:", $ContextPathD Contextos de los paquetes en esta sesión: 8Imtek`StructuredMesher`, Imtek`FEMOperators`, Imtek`ShapeFunctions`, Imtek`MeshElementLibrary`, Imtek`Graph`, Imtek`Nodes`, Imtek`BoundaryConditions`, Imtek`Assembler`, PacletManager`, WebServices`, System`, Global`< ã Se va a calcular una solución aproximada la ecuación diferencial parcial que se muestra al evaluar los siguiente comandos: Clear@x, y, z, p, q, f, xa, xb, ya, ybD; p@x_, y_D := x2 ; q@x_, y_D := 30; f@x_, y_D := − 10 ∗ x ∗ 3 4 −y ; xa = 0; xb = 2; ya = 0; yb = 2; zxa = 0; zxb = 0.5; Print@"−∂x Hp@x,yD ∂x z@x,yDL+q@x,yD∗z@x,yDf@x,yD"D; Print@− ∂x Hp@x, yD ∂x z@x, yDL + q@x, yD ∗ z@x, yD f@x, yDD; Print@z@xa, yD zxa D; Print@z@xb, yD zxb D; Printed by Mathematica for Students FEMcurso.nb 50 −∂x Hp@x,yD ∂x z@x,yDL+q@x,yD∗z@x,yDf@x,yD 30 z@x, yD − 2 x zH1,0L @x, yD − x2 zH2,0L @x, yD − 10 x 3 −y 4 z@0, yD 0 z@2, yD 0.5 ã Se usa el comando imsGenerateLinearStructuredMesh[ ] para generar el mallado del dominio. El mallado consiste de nodos (puntos en el dominio) y elementos (en este ejemplo los elementos son cuadriláteros cuyos vértices son los nodos): numElemX = 3; numElemY = 3; numElem = numElemX ∗ numElemY; Hxb − xaL Hx + 1L Hyb − yaL Hy + 1L mapeo@8x_, y_<D := :xa + , ya + >; 2 2 malla = imsGenerateLinearStructuredMesh@ numElemX, numElemY, imsCoordinateMapping → mapeoD; Graphics@8 Orange, imsDrawElements@mallaD, Purple, imsDrawElementIdText@mallaD, Red, imsDrawNodeText@mallaD <, Frame → TrueD 2.0 13 14 7 15 16 8 9 1.5 9 1.0 10 4 11 12 5 5 6 6 7 8 0.5 1 2 0.0 1 0.0 2 0.5 3 3 1.0 4 1.5 Printed by Mathematica for Students 2.0 FEMcurso.nb 51 ã Estos son los nodos del mallado: nodos = imsGetNodes@mallaD; numNodos = Length@nodosD; ultimoNodoId = numNodos; Print@"Los nodos son: ", nodosD 2 Los nodos son: :imsNode@1, 80, 0<, 1, 880.<<D, imsNodeB2, : , 0>, 1, 880.<<F, 3 4 imsNodeB3, : , 0>, 1, 880.<<F, imsNode@4, 82, 0<, 1, 880.<<D, 3 2 2 2 imsNodeB5, :0, >, 1, 880.<<F, imsNodeB6, : , >, 0, 880.<<F, 3 3 3 4 2 2 imsNodeB7, : , >, 0, 880.<<F, imsNodeB8, :2, >, 1, 880.<<F, 3 3 3 4 2 4 imsNodeB9, :0, >, 1, 880.<<F, imsNodeB10, : , >, 0, 880.<<F, 3 3 3 4 4 4 imsNodeB11, : , >, 0, 880.<<F, imsNodeB12, :2, >, 1, 880.<<F, 3 3 3 2 imsNode@13, 80, 2<, 1, 880.<<D, imsNodeB14, : , 2>, 1, 880.<<F, 3 4 imsNodeB15, : , 2>, 1, 880.<<F, imsNode@16, 82, 2<, 1, 880.<<D> 3 ã Estos son los elementos del mallado: elementos = imsGetElements@mallaD; Print@"Los elementos son: ", elementosD Los elementos son: 8imsQuadLinear1DOF@1, 81, 2, 6, 5<, 0D, imsQuadLinear1DOF@2, 82, 3, 7, 6<, 0D, imsQuadLinear1DOF@3, 83, 4, 8, 7<, 0D, imsQuadLinear1DOF@4, 85, 6, 10, 9<, 0D, imsQuadLinear1DOF@5, 86, 7, 11, 10<, 0D, imsQuadLinear1DOF@6, 87, 8, 12, 11<, 0D, imsQuadLinear1DOF@7, 89, 10, 14, 13<, 0D, imsQuadLinear1DOF@8, 810, 11, 15, 14<, 0D, imsQuadLinear1DOF@9, 811, 12, 16, 15<, 0D< ã En este ejemplo con cuadriláteros, a cada elemento le corresponden cuatro nodos: nodosPorElemento = imsGetIncidentsIds@elementosD 881, 2, 6, 5<, 82, 3, 7, 6<, 83, 4, 8, 7<, 85, 6, 10, 9<, 86, 7, 11, 10<, 87, 8, 12, 11<, 89, 10, 14, 13<, 810, 11, 15, 14<, 811, 12, 16, 15<< Printed by Mathematica for Students FEMcurso.nb 52 ã Hay una matriz local por cada elemento. Después cada matriz local será “ensamblada” en la matriz global, en lo renglones y columnas que corresponden a los nodos del elemento: 0 0 matrices = TableBimsMakeElementMatrixB 0 0 0 0 0 0 0 0 0 0 0 0 , 0 0 nodosPorElemento@@jDD, nodosPorElemento@@jDDF, 8j, 1, numElem<F 8imsElementMatrix@ 880, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<<, 81, 2, 6, 5<, 81, 2, 6, 5<D, imsElementMatrix@880, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<<, 82, 3, 7, 6<, 82, 3, 7, 6<D, imsElementMatrix@ 880, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<<, 83, 4, 8, 7<, 83, 4, 8, 7<D, imsElementMatrix@880, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<<, 85, 6, 10, 9<, 85, 6, 10, 9<D, imsElementMatrix@880, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<<, 86, 7, 11, 10<, 86, 7, 11, 10<D, imsElementMatrix@880, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<<, 87, 8, 12, 11<, 87, 8, 12, 11<D, imsElementMatrix@880, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<<, 89, 10, 14, 13<, 89, 10, 14, 13<D, imsElementMatrix@880, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<<, 810, 11, 15, 14<, 810, 11, 15, 14<D, imsElementMatrix@880, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<, 80, 0, 0, 0<<, 811, 12, 16, 15<, 811, 12, 16, 15<D< ã Hay un vector local de fuerzas, o cargas, por cada elemento. Después ese vector local será “ensamblado” en el vector global, en los renglones que corresponden a los nodos del elemento: 0 0 cargas = TableBimsMakeElementMatrixB , 0 0 nodosPorElemento@@jDD, nodosPorElemento@@jDDF, 8j, 1, numElem<F 8imsElementMatrix@880<, 80<, 80<, 80<<, 81, 2, 6, 5<, 81, 2, 6, 5<D, imsElementMatrix@880<, 80<, 80<, 80<<, 82, 3, 7, 6<, 82, 3, 7, 6<D, imsElementMatrix@880<, 80<, 80<, 80<<, 83, 4, 8, 7<, 83, 4, 8, 7<D, imsElementMatrix@880<, 80<, 80<, 80<<, 85, 6, 10, 9<, 85, 6, 10, 9<D, imsElementMatrix@880<, 80<, 80<, 80<<, 86, 7, 11, 10<, 86, 7, 11, 10<D, imsElementMatrix@880<, 80<, 80<, 80<<, 87, 8, 12, 11<, 87, 8, 12, 11<D, imsElementMatrix@880<, 80<, 80<, 80<<, 89, 10, 14, 13<, 89, 10, 14, 13<D, imsElementMatrix@880<, 80<, 80<, 80<<, 810, 11, 15, 14<, 810, 11, 15, 14<D, imsElementMatrix@880<, 80<, 80<, 80<<, 811, 12, 16, 15<, 811, 12, 16, 15<D< Printed by Mathematica for Students FEMcurso.nb 53 ã El coeficiente p(x,y) en la ecuación diferencial − ∂x Hp@x, yD ∂x z@x, yDL + q@x, yD ∗ z@x, yD f@x, yD es el único término diferente de cero en la función tensorial de difusión: funcionDifusion@marker_, x_, y_D := 88p@x, yD, 0<, 80, 0<<; Print@ "funcionDifusion@marker,x,yD=", MatrixForm@funcionDifusion@marker, x, yDD D funcionDifusion@marker,x,yD= x2 0 0 0 Printed by Mathematica for Students FEMcurso.nb 54 ã Aquí se calcula el efecto de la “función tensorial de difusión“ en las matrices y cargas (o sea, en las ecuaciones) de cada elemento: matricesycargas = Table@ imsNFEMDiffusion@8matrices@@jDD, cargas@@jDD<, elementos@@jDD, imsGetNodes@malla, nodosPorElemento@@jDDD, funcionDifusionD, 8j, 1, numElem<D Printed by Mathematica for Students FEMcurso.nb 55 [email protected], − 0.0493827, − 0.0246914, 0.0246914<, 8− 0.0493827, 0.0493827, 0.0246914, − 0.0246914<, 8− 0.0246914, 0.0246914, 0.0493827, − 0.0493827<, 80.0246914, − 0.0246914, − 0.0493827, 0.0493827<<, 81, 2, 6, 5<, 81, 2, 6, 5<D, imsElementMatrix@880<, 80<, 80<, 80<<, 81, 2, 6, 5<, 81, 2, 6, 5<D<, [email protected], − 0.345679, − 0.17284, 0.17284<, 8− 0.345679, 0.345679, 0.17284, − 0.17284<, 8− 0.17284, 0.17284, 0.345679, − 0.345679<, 80.17284, − 0.17284, − 0.345679, 0.345679<<, 82, 3, 7, 6<, 82, 3, 7, 6<D, imsElementMatrix@880<, 80<, 80<, 80<<, 82, 3, 7, 6<, 82, 3, 7, 6<D<, [email protected], − 0.938272, − 0.469136, 0.469136<, 8− 0.938272, 0.938272, 0.469136, − 0.469136<, 8− 0.469136, 0.469136, 0.938272, − 0.938272<, 80.469136, − 0.469136, − 0.938272, 0.938272<<, 83, 4, 8, 7<, 83, 4, 8, 7<D, imsElementMatrix@880<, 80<, 80<, 80<<, 83, 4, 8, 7<, 83, 4, 8, 7<D<, [email protected], − 0.0493827, − 0.0246914, 0.0246914<, 8− 0.0493827, 0.0493827, 0.0246914, − 0.0246914<, 8− 0.0246914, 0.0246914, 0.0493827, − 0.0493827<, 80.0246914, − 0.0246914, − 0.0493827, 0.0493827<<, 85, 6, 10, 9<, 85, 6, 10, 9<D, imsElementMatrix@880<, 80<, 80<, 80<<, 85, 6, 10, 9<, 85, 6, 10, 9<D<, [email protected], − 0.345679, − 0.17284, 0.17284<, 8− 0.345679, 0.345679, 0.17284, − 0.17284<, 8− 0.17284, 0.17284, 0.345679, − 0.345679<, 80.17284, − 0.17284, − 0.345679, 0.345679<<, 86, 7, 11, 10<, 86, 7, 11, 10<D, imsElementMatrix@880<, 80<, 80<, 80<<, 86, 7, 11, 10<, 86, 7, 11, 10<D<, [email protected], − 0.938272, − 0.469136, 0.469136<, 8− 0.938272, 0.938272, 0.469136, − 0.469136<, 8− 0.469136, 0.469136, 0.938272, − 0.938272<, 80.469136, − 0.469136, − 0.938272, 0.938272<<, 87, 8, 12, 11<, 87, 8, 12, 11<D, imsElementMatrix@880<, 80<, 80<, 80<<, 87, 8, 12, 11<, 87, 8, 12, 11<D<, [email protected], − 0.0493827, − 0.0246914, 0.0246914<, 8− 0.0493827, 0.0493827, 0.0246914, − 0.0246914<, 8− 0.0246914, 0.0246914, 0.0493827, − 0.0493827<, 80.0246914, − 0.0246914, − 0.0493827, 0.0493827<<, 89, 10, 14, 13<, 89, 10, 14, 13<D, imsElementMatrix@880<, 80<, 80<, 80<<, 89, 10, 14, 13<, 89, 10, 14, 13<D<, [email protected], − 0.345679, − 0.17284, 0.17284<, 8− 0.345679, 0.345679, 0.17284, − 0.17284<, 8− 0.17284, 0.17284, 0.345679, − 0.345679<, 80.17284, − 0.17284, − 0.345679, 0.345679<<, 810, 11, 15, 14<, 810, 11, 15, 14<D, imsElementMatrix@880<, 80<, 80<, 80<<, 810, 11, 15, 14<, 810, 11, 15, 14<D<, [email protected], − 0.938272, − 0.469136, 0.469136<, 8− 0.938272, 0.938272, 0.469136, − 0.469136<, 8− 0.469136, 0.469136, 0.938272, − 0.938272<, 80.469136, − 0.469136, − 0.938272, 0.938272<<, 811, 12, 16, 15<, 811, 12, 16, 15<D, imsElementMatrix@ 880<, 80<, 80<, 80<<, 811, 12, 16, 15<, 811, 12, 16, 15<D<< Printed by Mathematica for Students FEMcurso.nb 56 ã Actualizamos la lista de matrices matrices = matricesycargas@@All, 1DD [email protected], − 0.0493827, − 0.0246914, 0.0246914<, 8− 0.0493827, 0.0493827, 0.0246914, − 0.0246914<, 8− 0.0246914, 0.0246914, 0.0493827, − 0.0493827<, 80.0246914, − 0.0246914, − 0.0493827, 0.0493827<<, 81, 2, 6, 5<, 81, 2, 6, 5<D, [email protected], − 0.345679, − 0.17284, 0.17284<, 8− 0.345679, 0.345679, 0.17284, − 0.17284<, 8− 0.17284, 0.17284, 0.345679, − 0.345679<, 80.17284, − 0.17284, − 0.345679, 0.345679<<, 82, 3, 7, 6<, 82, 3, 7, 6<D, [email protected], − 0.938272, − 0.469136, 0.469136<, 8− 0.938272, 0.938272, 0.469136, − 0.469136<, 8− 0.469136, 0.469136, 0.938272, − 0.938272<, 80.469136, − 0.469136, − 0.938272, 0.938272<<, 83, 4, 8, 7<, 83, 4, 8, 7<D, [email protected], − 0.0493827, − 0.0246914, 0.0246914<, 8− 0.0493827, 0.0493827, 0.0246914, − 0.0246914<, 8− 0.0246914, 0.0246914, 0.0493827, − 0.0493827<, 80.0246914, − 0.0246914, − 0.0493827, 0.0493827<<, 85, 6, 10, 9<, 85, 6, 10, 9<D, [email protected], − 0.345679, − 0.17284, 0.17284<, 8− 0.345679, 0.345679, 0.17284, − 0.17284<, 8− 0.17284, 0.17284, 0.345679, − 0.345679<, 80.17284, − 0.17284, − 0.345679, 0.345679<<, 86, 7, 11, 10<, 86, 7, 11, 10<D, [email protected], − 0.938272, − 0.469136, 0.469136<, 8− 0.938272, 0.938272, 0.469136, − 0.469136<, 8− 0.469136, 0.469136, 0.938272, − 0.938272<, 80.469136, − 0.469136, − 0.938272, 0.938272<<, 87, 8, 12, 11<, 87, 8, 12, 11<D, [email protected], − 0.0493827, − 0.0246914, 0.0246914<, 8− 0.0493827, 0.0493827, 0.0246914, − 0.0246914<, 8− 0.0246914, 0.0246914, 0.0493827, − 0.0493827<, 80.0246914, − 0.0246914, − 0.0493827, 0.0493827<<, 89, 10, 14, 13<, 89, 10, 14, 13<D, imsElementMatrix@ 880.345679, − 0.345679, − 0.17284, 0.17284<, 8− 0.345679, 0.345679, 0.17284, − 0.17284<, 8− 0.17284, 0.17284, 0.345679, − 0.345679<, 80.17284, − 0.17284, − 0.345679, 0.345679<<, 810, 11, 15, 14<, 810, 11, 15, 14<D, [email protected], − 0.938272, − 0.469136, 0.469136<, 8− 0.938272, 0.938272, 0.469136, − 0.469136<, 8− 0.469136, 0.469136, 0.938272, − 0.938272<, 80.469136, − 0.469136, − 0.938272, 0.938272<<, 811, 12, 16, 15<, 811, 12, 16, 15<D< Printed by Mathematica for Students FEMcurso.nb 57 ã Actualizamos la lista de cargas: cargas = matricesycargas@@All, 2DD 8imsElementMatrix@880<, 80<, 80<, 80<<, 81, 2, 6, 5<, 81, 2, 6, 5<D, imsElementMatrix@880<, 80<, 80<, 80<<, 82, 3, 7, 6<, 82, 3, 7, 6<D, imsElementMatrix@880<, 80<, 80<, 80<<, 83, 4, 8, 7<, 83, 4, 8, 7<D, imsElementMatrix@880<, 80<, 80<, 80<<, 85, 6, 10, 9<, 85, 6, 10, 9<D, imsElementMatrix@880<, 80<, 80<, 80<<, 86, 7, 11, 10<, 86, 7, 11, 10<D, imsElementMatrix@880<, 80<, 80<, 80<<, 87, 8, 12, 11<, 87, 8, 12, 11<D, imsElementMatrix@880<, 80<, 80<, 80<<, 89, 10, 14, 13<, 89, 10, 14, 13<D, imsElementMatrix@880<, 80<, 80<, 80<<, 810, 11, 15, 14<, 810, 11, 15, 14<D, imsElementMatrix@880<, 80<, 80<, 80<<, 811, 12, 16, 15<, 811, 12, 16, 15<D< ã El coeficiente q(x,y) en la ecuación − ∂x Hp@x, yD ∂x z@x, yDL + q@x, yD ∗ z@x, yD f@x, yD es la “función de reacción”: funcionReaccion@marker_, x_, y_D := q@x, yD; Print@"funcionReaccion@marker,x,yD=", funcionReaccion@marker, x, yDD funcionReaccion@marker,x,yD=30 Printed by Mathematica for Students FEMcurso.nb 58 ã Aquí se calcula el efecto de la “función de reacción“ en las matrices y cargas (o sea, en las ecuaciones) de cada elemento: matricesycargas = Table@ imsNFEMReaction@8matrices@@jDD, cargas@@jDD<, elementos@@jDD, imsGetNodes@malla, nodosPorElemento@@jDDD, funcionReaccionD, 8j, 1, numElem<D [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 81, 2, 6, 5<, 81, 2, 6, 5<D, imsElementMatrix@880<, 80<, 80<, 80<<, 81, 2, 6, 5<, 81, 2, 6, 5<D<, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 82, 3, 7, 6<, 82, 3, 7, 6<D, imsElementMatrix@880<, 80<, 80<, 80<<, 82, 3, 7, 6<, 82, 3, 7, 6<D<, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 83, 4, 8, 7<, 83, 4, 8, 7<D, imsElementMatrix@880<, 80<, 80<, 80<<, 83, 4, 8, 7<, 83, 4, 8, 7<D<, [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 85, 6, 10, 9<, 85, 6, 10, 9<D, imsElementMatrix@880<, 80<, 80<, 80<<, 85, 6, 10, 9<, 85, 6, 10, 9<D<, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 86, 7, 11, 10<, 86, 7, 11, 10<D, imsElementMatrix@880<, 80<, 80<, 80<<, 86, 7, 11, 10<, 86, 7, 11, 10<D<, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 87, 8, 12, 11<, 87, 8, 12, 11<D, imsElementMatrix@880<, 80<, 80<, 80<<, 87, 8, 12, 11<, 87, 8, 12, 11<D<, [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 89, 10, 14, 13<, 89, 10, 14, 13<D, imsElementMatrix@880<, 80<, 80<, 80<<, 89, 10, 14, 13<, 89, 10, 14, 13<D<, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 810, 11, 15, 14<, 810, 11, 15, 14<D, imsElementMatrix@880<, 80<, 80<, 80<<, 810, 11, 15, 14<, 810, 11, 15, 14<D<, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 811, 12, 16, 15<, 811, 12, 16, 15<D, imsElementMatrix@ 880<, 80<, 80<, 80<<, 811, 12, 16, 15<, 811, 12, 16, 15<D<< Printed by Mathematica for Students FEMcurso.nb 59 ã Actualizamos la lista de matrices: matrices = matricesycargas@@All, 1DD [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 81, 2, 6, 5<, 81, 2, 6, 5<D, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 82, 3, 7, 6<, 82, 3, 7, 6<D, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 83, 4, 8, 7<, 83, 4, 8, 7<D, [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 85, 6, 10, 9<, 85, 6, 10, 9<D, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 86, 7, 11, 10<, 86, 7, 11, 10<D, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 87, 8, 12, 11<, 87, 8, 12, 11<D, [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 89, 10, 14, 13<, 89, 10, 14, 13<D, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 810, 11, 15, 14<, 810, 11, 15, 14<D, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 811, 12, 16, 15<, 811, 12, 16, 15<D< ã Actualizamos la lista de cargas: cargas = matricesycargas@@All, 2DD 8imsElementMatrix@880<, 80<, 80<, 80<<, 81, 2, 6, 5<, 81, 2, 6, 5<D, imsElementMatrix@880<, 80<, 80<, 80<<, 82, 3, 7, 6<, 82, 3, 7, 6<D, imsElementMatrix@880<, 80<, 80<, 80<<, 83, 4, 8, 7<, 83, 4, 8, 7<D, imsElementMatrix@880<, 80<, 80<, 80<<, 85, 6, 10, 9<, 85, 6, 10, 9<D, imsElementMatrix@880<, 80<, 80<, 80<<, 86, 7, 11, 10<, 86, 7, 11, 10<D, imsElementMatrix@880<, 80<, 80<, 80<<, 87, 8, 12, 11<, 87, 8, 12, 11<D, imsElementMatrix@880<, 80<, 80<, 80<<, 89, 10, 14, 13<, 89, 10, 14, 13<D, imsElementMatrix@880<, 80<, 80<, 80<<, 810, 11, 15, 14<, 810, 11, 15, 14<D, imsElementMatrix@880<, 80<, 80<, 80<<, 811, 12, 16, 15<, 811, 12, 16, 15<D< Printed by Mathematica for Students FEMcurso.nb 60 ã El coeficiente f(x,y) en la ecuación − ∂x Hp@x, yD ∂x z@x, yDL + q@x, yD ∗ z@x, yD f@x, yD es la “función de carga”: funcionCarga@marker_, x_, y_D := f@x, yD; Print@"funcionCarga@marker,x,yD=", funcionCarga@marker, x, yDD funcionCarga@marker,x,yD=− 10 x 3 −y 4 ã Aquí se calcula el efecto de la “función de carga“ en las matrices y cargas (o sea, en las ecuaciones) de cada elemento: matricesycargas = Table@ imsNFEMLoad@8matrices@@jDD, cargas@@jDD<, elementos@@jDD, imsGetNodes@malla, nodosPorElemento@@jDDD, funcionCargaD, 8j, 1, numElem<D Printed by Mathematica for Students FEMcurso.nb 61 [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 81, 2, 6, 5<, 81, 2, 6, 5<D, imsElementMatrix@88− 0.130316<, 8− 0.260631<, 8− 0.150892<, 8− 0.0754458<<, 81, 2, 6, 5<, 81<D<, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 82, 3, 7, 6<, 82, 3, 7, 6<D, imsElementMatrix@88− 0.521262<, 8− 0.651578<, 8− 0.377229<, 8− 0.301783<<, 82, 3, 7, 6<, 81<D<, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 83, 4, 8, 7<, 83, 4, 8, 7<D, imsElementMatrix@88− 0.912209<, 8− 1.04252<, 8− 0.603567<, 8− 0.528121<<, 83, 4, 8, 7<, 81<D<, [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 85, 6, 10, 9<, 85, 6, 10, 9<D, [email protected]<, 80.0685871<, 80.178326<, 80.0891632<<, 85, 6, 10, 9<, 81<D<, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 86, 7, 11, 10<, 86, 7, 11, 10<D, [email protected]<, 80.171468<, 80.445816<, 80.356653<<, 86, 7, 11, 10<, 81<D<, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 87, 8, 12, 11<, 87, 8, 12, 11<D, [email protected]<, 80.274348<, 80.713306<, 80.624143<<, 87, 8, 12, 11<, 81<D<, [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 89, 10, 14, 13<, 89, 10, 14, 13<D, [email protected]<, 80.397805<, 80.507545<, 80.253772<<, 89, 10, 14, 13<, 81<D<, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 810, 11, 15, 14<, 810, 11, 15, 14<D, [email protected]<, 80.994513<, 81.26886<, 81.01509<<, 810, 11, 15, 14<, 81<D<, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 811, 12, 16, 15<, 811, 12, 16, 15<D, imsElementMatrix@ 881.39232<, 81.59122<, 82.03018<, 81.77641<<, 811, 12, 16, 15<, 81<D<< Printed by Mathematica for Students FEMcurso.nb 62 ã Actualizamos la lista de matrices: matrices = matricesycargas@@All, 1DD [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 81, 2, 6, 5<, 81, 2, 6, 5<D, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 82, 3, 7, 6<, 82, 3, 7, 6<D, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 83, 4, 8, 7<, 83, 4, 8, 7<D, [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 85, 6, 10, 9<, 85, 6, 10, 9<D, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 86, 7, 11, 10<, 86, 7, 11, 10<D, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 87, 8, 12, 11<, 87, 8, 12, 11<D, [email protected], 0.691358, 0.345679, 0.765432<, 80.691358, 1.53086, 0.765432, 0.345679<, 80.345679, 0.765432, 1.53086, 0.691358<, 80.765432, 0.345679, 0.691358, 1.53086<<, 89, 10, 14, 13<, 89, 10, 14, 13<D, [email protected], 0.395062, 0.197531, 0.91358<, 80.395062, 1.82716, 0.91358, 0.197531<, 80.197531, 0.91358, 1.82716, 0.395062<, 80.91358, 0.197531, 0.395062, 1.82716<<, 810, 11, 15, 14<, 810, 11, 15, 14<D, [email protected], − 0.197531, − 0.0987654, 1.20988<, 8− 0.197531, 2.41975, 1.20988, − 0.0987654<, 8− 0.0987654, 1.20988, 2.41975, − 0.197531<, 81.20988, − 0.0987654, − 0.197531, 2.41975<<, 811, 12, 16, 15<, 811, 12, 16, 15<D< Printed by Mathematica for Students FEMcurso.nb 63 ã Actualizamos la lista de cargas: cargas = matricesycargas@@All, 2DD 8imsElementMatrix@ 88− 0.130316<, 8− 0.260631<, 8− 0.150892<, 8− 0.0754458<<, 81, 2, 6, 5<, 81<D, imsElementMatrix@88− 0.521262<, 8− 0.651578<, 8− 0.377229<, 8− 0.301783<<, 82, 3, 7, 6<, 81<D, imsElementMatrix@ 88− 0.912209<, 8− 1.04252<, 8− 0.603567<, 8− 0.528121<<, 83, 4, 8, 7<, 81<D, [email protected]<, 80.0685871<, 80.178326<, 80.0891632<<, 85, 6, 10, 9<, 81<D, imsElementMatrix@ 880.137174<, 80.171468<, 80.445816<, 80.356653<<, 86, 7, 11, 10<, 81<D, [email protected]<, 80.274348<, 80.713306<, 80.624143<<, 87, 8, 12, 11<, 81<D, imsElementMatrix@ 880.198903<, 80.397805<, 80.507545<, 80.253772<<, 89, 10, 14, 13<, 81<D, [email protected]<, 80.994513<, 81.26886<, 81.01509<<, 810, 11, 15, 14<, 81<D, imsElementMatrix@ 881.39232<, 81.59122<, 82.03018<, 81.77641<<, 811, 12, 16, 15<, 81<D< Printed by Mathematica for Students FEMcurso.nb 64 ã A continuación se “ensamblan” las matrices de cada elemento para formar la matriz global, y se “ensamblan” los vectores de carga de cada elemento para formar el vector de carga global: matrizGlobal = SparseArray@8<, 8numNodos, numNodos<D; cargaGlobal = Table@0, 8numNodos<, 81<D; Do@ imsAssemble@matrices@@jDD, matrizGlobalD; imsAssemble@cargas@@jDD, cargaGlobalD, 8j, 1, numElem< D; parametros = TableAcj , 8j, 1, numNodos<E; vectorCargas = Flatten@cargaGlobalD; Print@MatrixForm@matrizGlobalD, ".", MatrixForm@parametrosD, "==", MatrixForm@vectorCargasD D 1.53086 0.691358 0 0 0.765432 0.345679 0 0 0 0 0 0 0 0 0 0 0.691358 0 0 3.35802 0.395062 0 0.395062 4.24691 − 0.197531 0 − 0.197531 2.41975 0.345679 0 0 1.67901 0.197531 0 0.197531 2.12346 − 0.0987654 0 − 0.0987654 1.20988 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.765432 0.345679 0 0 3.06173 1.38272 0 0 0.765432 0.345679 0 0 0 0 0 0 0.345679 0 0 1.67901 0.197531 0 0.197531 2.12346 − 0.0987654 0 − 0.0987654 1.20988 1.38272 0 0 6.71605 0.790123 0 0.790123 8.49383 − 0.395062 0 − 0.395062 4.83951 0.345679 0 0 1.67901 0.197531 0 0.197531 2.12346 − 0.0987654 0 − 0.0987654 1.20988 0 0 0 0 0 0 0 0 0 0 0 0 ã El siguiente paso es insertar las condiciones de frontera, lo cual modificará a la matriz global y al vector global de cargas. Primero seleccionamos todos los nodos que están en la frontera izquierda (los que tienen coordenadas Hxa,y)): nodosIzquierda = Select@nodos, Function@nodo, Part@imsGetCoords@nodoD, 1D xaDD :imsNode@1, 80, 0<, 1, 880.<<D, imsNodeB5, :0, imsNodeB9, :0, 4 3 2 3 >, 1, 880.<<F, >, 1, 880.<<F, imsNode@13, 80, 2<, 1, 880.<<D> Printed by Mathematica for Students 0.765432 0.345679 3.06173 1.38272 0.765432 0.345679 FEMcurso.nb 65 ã A continuación insertamos la condición de que la solución vale zxa en cada nodo de la frontera izquierda: Do@ imsDirichlet@8matrizGlobal, vectorCargas<, imsGetIds@ nodosIzquierda@@jDD D, zxa D, 8j, 1, Length@nodosIzquierdaD< D; Print@MatrixForm@matrizGlobalD, ".", MatrixForm@parametrosD, "==", MatrixForm@vectorCargasD D 1. 0. 0. 0. 0. 3.35802 0.395062 0. 0. 0.395062 4.24691 − 0.197531 0. 0. − 0.197531 2.41975 0. 0. 0. 0. 0. 1.67901 0.197531 0. 0. 0.197531 2.12346 − 0.0987654 0. 0. − 0.0987654 1.20988 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.67901 0.197531 0. 0. 0.197531 2.12346 − 0.0987654 0. 0. − 0.0987654 1.20988 1. 0. 0. 0. 0. 6.71605 0.790123 0. 0. 0.790123 8.49383 − 0.395062 0. 0. − 0.395062 4.83951 0. 0. 0. 0. 0. 1.67901 0.197531 0. 0. 0.197531 2.12346 − 0.0987654 0. 0. − 0.0987654 1.20988 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.197531 0. 1.67901 0. 0.197531 2.12346 0. 0. − 0.0987654 1. 0. 0. 6.71605 0.790123 0. 0.790123 8.49383 0. 0. − 0.395062 0. 0. 0. 1.67901 0.197531 0. 0.197531 2.12346 0. 0. − 0.0987654 ã Ahora seleccionamos todos los nodos que están en la frontera derecha (los que tienen coordenadas Hxb,y)): nodosDerecha = Select@nodos, Function@nodo, Part@imsGetCoords@nodoD, 1D xbDD :imsNode@4, 82, 0<, 1, 880.<<D, imsNodeB8, :2, imsNodeB12, :2, 4 3 2 3 >, 1, 880.<<F, >, 1, 880.<<F, imsNode@16, 82, 2<, 1, 880.<<D> Printed by Mathematica for Students FEMcurso.nb 66 ã A continuación insertamos la condición de que la solución vale zxb en cada nodo de la frontera derecha: Do@ imsDirichlet@8matrizGlobal, vectorCargas<, imsGetIds@ nodosDerecha@@jDD D, zxb D, 8j, 1, Length@nodosDerechaD< D; Print@MatrixForm@matrizGlobalD, ".", MatrixForm@parametrosD, "==", MatrixForm@vectorCargasD D 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 3.35802 0.395062 0. 0. 1.67901 0.197531 0. 0. 0. 0. 0. 0. 0. 0. 0.395062 4.24691 0. 0. 0.197531 2.12346 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.67901 0.197531 0. 0. 6.71605 0.790123 0. 0. 1.67901 0.197531 0. 0. 0. 0. 0.197531 2.12346 0. 0. 0.790123 8.49383 0. 0. 0.197531 2.12346 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.67901 0.197531 0. 0. 6.71605 0.790123 0. 0. 1.67901 0. 0. 0. 0. 0. 0.197531 2.12346 0. 0. 0.790123 8.49383 0. 0. 0.197531 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.67901 0.197531 0. 0. 3.35802 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.197531 2.12346 0. 0. 0.395062 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ã A continuación resolvemos el sistema de ecuaciones, con lo cual obtenemos el valor de la solución aproximada en cada nodo: solvector = LinearSolve@matrizGlobal, vectorCargasD 80., − 0.184302, − 0.308437, 0.5, 0., − 0.0229368, − 0.0133702, 0.5, 0., 0.138428, 0.281697, 0.5, 0., 0.299793, 0.576763, 0.5< Printed by Mathematica for Students FEMcurso.nb 67 ã A partir de los nodos originales construimos nuevos nodos, esta vez cada nodo nuevo incluye el valor de la solución: nodosNuevos = Table@imsSetValues@nodos@@jDD, 88 solvector@@jDD <<D, 8j, 1, numNodos<D 2 :imsNode@1, 80, 0<, 1, 880.<<D, imsNodeB2, : , 0>, 1, 88− 0.184302<<F, 3 4 imsNodeB3, : , 0>, 1, 88− 0.308437<<F, imsNode@4, 82, 0<, 1, 880.5<<D, 3 2 2 2 imsNodeB5, :0, >, 1, 880.<<F, imsNodeB6, : , >, 0, 88− 0.0229368<<F, 3 3 3 4 2 2 imsNodeB7, : , >, 0, 88− 0.0133702<<F, imsNodeB8, :2, >, 1, 880.5<<F, 3 3 3 4 2 4 imsNodeB9, :0, >, 1, 880.<<F, imsNodeB10, : , >, 0, 880.138428<<F, 3 3 3 4 4 4 imsNodeB11, : , >, 0, 880.281697<<F, imsNodeB12, :2, >, 1, 880.5<<F, 3 3 3 2 imsNode@13, 80, 2<, 1, 880.<<D, imsNodeB14, : , 2>, 1, 880.299793<<F, 3 4 imsNodeB15, : , 2>, 1, 880.576763<<F, imsNode@16, 82, 2<, 1, 880.5<<D> 3 ã Estos son los nuevos nodos en la frontera. Incluyen el valor de la solución: nodosNuevosFrontera = nodosNuevos@@ imsGetIds@imsGetBoundaryNodes@mallaD D DD 2 :imsNode@1, 80, 0<, 1, 880.<<D, imsNodeB2, : , 0>, 1, 88− 0.184302<<F, 3 4 imsNodeB3, : , 0>, 1, 88− 0.308437<<F, imsNode@4, 82, 0<, 1, 880.5<<D, 3 2 2 imsNodeB5, :0, >, 1, 880.<<F, imsNodeB8, :2, >, 1, 880.5<<F, 3 3 4 4 imsNodeB9, :0, >, 1, 880.<<F, imsNodeB12, :2, >, 1, 880.5<<F, 3 3 2 imsNode@13, 80, 2<, 1, 880.<<D, imsNodeB14, : , 2>, 1, 880.299793<<F, 3 4 imsNodeB15, : , 2>, 1, 880.576763<<F, imsNode@16, 82, 2<, 1, 880.5<<D> 3 Printed by Mathematica for Students FEMcurso.nb 68 ã Estos son los nuevos nodos interiores. Incluyen el valor de la solución: nodosNuevosInterior = nodosNuevos@@ imsGetIds@imsGetInteriorNodes@mallaD D DD 2 2 4 :imsNodeB6, : , >, 0, 88− 0.0229368<<F, imsNodeB7, : , 3 3 3 2 4 4 imsNodeB10, : , >, 0, 880.138428<<F, imsNodeB11, : , 3 3 3 2 3 4 3 >, 0, 88− 0.0133702<<F, >, 0, 880.281697<<F> ã Esta es la nueva malla, con los valores de la solución, como se muestra en la gráfica: mallaNueva = imsMakeNexus@nodosNuevosFrontera, nodosNuevosInterior, elementosD; graficaFEM = Graphics3D@8 imsDrawElementSolution@ mallaNueva D <, Axes → True, PlotLabel → "Solución aproximada con\n Elemento Finito"D Solución aproximada con Elemento Finito 0.4 2.0 0.2 0.0 1.5 -0.2 1.0 0.0 0.5 0.5 1.0 1.5 2.0 0.0 Printed by Mathematica for Students FEMcurso.nb 69 ã A continuación se obtiene la solución analítica exacta, para comparla con la aproximación por Elemento Finito: solexacta = DSolve@8− ∂x Hp@x, yD ∂x z@x, yDL + q@x, yD ∗ z@x, yD f@x, yD, z@xa, yD zxa , z@xb, yD zxb <, z@x, yD, 8x, y<D; exacta@x_, y_D := Evaluate@ReplaceAll@z@x, yD, solexacta@@1DD D D; graficaExacta = Plot3D@exacta@x, yD, 8x, xa, xb<, 8y, ya, yb<, PlotLabel → "Solución exacta"D Printed by Mathematica for Students FEMcurso.nb 70 ã Aquí se comapara la gráfica de la solución aproximada por Elemento Finito con la gráifca de la solución analítica exacta: Column@8graficaFEM, graficaExacta<D Solución aproximada con Elemento Finito 0.4 0.2 0.0 -0.2 2.0 1.5 1.0 0.0 0.5 0.5 1.0 1.5 2.0 0.0 Printed by Mathematica for Students