{"id":8672,"date":"2023-10-05T14:36:07","date_gmt":"2023-10-05T19:36:07","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/analisisnumerico\/?p=8672"},"modified":"2026-01-16T17:27:48","modified_gmt":"2026-01-16T22:27:48","slug":"edp-parabolica-explicito-sympy","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u07\/edp-parabolica-explicito-sympy\/","title":{"rendered":"7.1.3 EDP Parab\u00f3lica - anal\u00edtico expl\u00edcito con Sympy-Python"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p>EDP Parab\u00f3lica<\/p>\n\n\n\n<p> <a href=\"#edpdiscreta\">cont\u00ednua a discreta<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmodiscretiza\">algoritmo discreta<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoexplicito\">algoritmo explicito<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ejercicio\">1. Ejercicio<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>:&nbsp; Chapra 30.2 p888 pdf912,&nbsp;Burden 9Ed 12.2 p725, Rodr\u00edguez 10.2 p406<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\frac{\\partial ^2 u}{\\partial x ^2} = K\\frac{\\partial u}{\\partial t}<\/span>\n\n\n\n<p>Valores de frontera: <strong>T<\/strong>a = 60, <strong>T<\/strong>b = 40, <strong>T<\/strong>0 = 25<br>Longitud en <strong>x<\/strong> a = 0, b = 1,&nbsp; Constante <strong>K<\/strong>= 4<br>Tama\u00f1o de paso dx = 0.1, dt = dx\/10<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p>EDP Parab\u00f3lica<\/p>\n\n\n\n<p> <a href=\"#edpdiscreta\">cont\u00ednua a discreta<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmodiscretiza\">algoritmo discreta<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoexplicito\">algoritmo explicito<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"edpdiscreta\">2. EDP Parab\u00f3lica cont\u00ednua a discreta<\/h2>\n\n\n\n<p>El resultado del algoritmo para el ejercicio propuesto es:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>EDP Parab\u00f3lica cont\u00ednua a discreta\n ordenDx : 2\n ordenDy : 1\n\n edp=0 :\n  2                             \n \u2202               \u2202              \n\u2500\u2500\u2500(u(x, y)) - 4\u22c5\u2500\u2500(u(x, y)) = 0\n  2              \u2202y             \n\u2202x                              \n K_ : 4\n\n Lambda_L :\n  Dy \n\u2500\u2500\u2500\u2500\u2500\n    2\n4\u22c5Dx \n Lambda L_k : 0.250000000000000\n\n (discreta=0)*Dy**ordeny :\n                            2\u22c5Dy\u22c5U(i, j)   Dy\u22c5U(i - 1, j)   Dy\u22c5U(i + 1, j)\n4\u22c5U(i, j) - 4\u22c5U(i, j + 1) - \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n                                  2               2                2      \n                                Dx              Dx               Dx       \n\n discreta_L=0 :\n\u239b    2\u22c5Dy\u239e                           Dy\u22c5U(i - 1, j)   Dy\u22c5U(i + 1, j)    \n\u239c4 - \u2500\u2500\u2500\u2500\u239f\u22c5U(i, j) - 4\u22c5U(i, j + 1) + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 = 0\n\u239c      2 \u239f                                  2                2          \n\u239d    Dx  \u23a0                                Dx               Dx           \n\n discreta :\n2\u22c5U(i, j) - 4\u22c5U(i, j + 1) + U(i - 1, j) + U(i + 1, j) = 0\n<\/code><\/pre>\n\n\n\n<p>El desarrollo anal\u00edtico comienza en escribir la ecuaci\u00f3n diferencial parcial parab\u00f3lica de la forma cont\u00ednua a la representaci\u00f3n discreta, siguiendo los criterios indicados en la parte te\u00f3rica usando derivadas expresadas en diferencias divididas.<\/p>\n\n\n\n<p>La EDP se escribe en formato Sympy en el bloque de ingreso en dos partes: lado izquierdo (LHS) de la ecuaci\u00f3n y lado derecho (RHS), definiendo u como una funci\u00f3n de variables x,y.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\n# INGRESO\nfxy = 0*x+0*y  # f(x,y) = 0 , ecuacion complementaria\n# ecuacion edp : LHS=RHS\nLHS = sym.diff(u,x,2) \nRHS = 4*sym.diff(u,y,1) + fxy\nedp = sym.Eq(LHS-RHS,0)\n<\/pre><\/div>\n\n\n<p>La ecuaci\u00f3n f(x,y) se a\u00f1ade para ser usada con otros ejercicios que puede revisar en la secci\u00f3n de Evaluaciones.<\/p>\n\n\n\n<p>Las expresiones para <strong>dif<\/strong>erencias <strong>divididas<\/strong> seleccionadas se ingresan como un diccionario:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\n# centrada, adelante \ndif_dividida ={sym.diff(u,x,2): (U.subs(i,i-1)-2*U+U.subs(i,i+1))\/(Dx**2),\n               sym.diff(u,y,1): (U.subs(j,j+1)-U)\/Dy}\n<\/pre><\/div>\n\n\n<p>Las condiciones iniciales en los extremos a y b, y la temperatura en la barra, pueden ser funciones matem\u00e1ticas, por lo que se propone usar el formato lambda de las variables x o y. En el ejercicio b\u00e1sico presentado en la parte te\u00f3rica, la barra tiene temperatura constante, por lo que escribe como una&nbsp; constante mas cero por la variable independiente, esta forma facilita la evaluaci\u00f3n de un vector xi por ejemplo, en caso de disponer una expresi\u00f3n diferente.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\n# Valores de frontera\nfya = lambda y: 60 +0*y  # izquierda\nfyb = lambda y: 40 +0*y  # derecha\nfxc = lambda x: 25 +0*x  # inferior, funci\u00f3n inicial\n<\/pre><\/div>\n\n\n<p>los dem\u00e1s par\u00e1metros del ejercicio se ingresan m\u00e1s adelante de forma semejante al ejercicio con Numpy.<\/p>\n\n\n\n<p>Todas las expresiones se escriben al lado izquierdo (LHS) de la igualdad, la parte del lado derecho(RHS) se la prefiere mantener en cero. La expresi\u00f3n se organiza manteniendo el coeficiente en 1 para el termino de Dx de mayor orden. Se sustituyen las derivadas por diferencias divididas, para luego simplificar la expresi\u00f3n usando \u03bb como referencia.<\/p>\n\n\n\n<p>Al desarrollar el m\u00e9todo expl\u00edcito se requiere indicar el nodo u(i,<em><strong>j+1<\/strong><\/em>) a buscar<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>buscar = U.<em><strong>subs<\/strong><\/em>(<em><strong>j<\/strong><\/em>,j+1) <span style=\"color: #ff0000\"># U&#091;i,<strong>j+1<\/strong>] m\u00e9todo expl\u00edcito<\/span><\/code><\/pre>\n\n\n\n<p>El valor de K se puede determinar en la expresi\u00f3n al reordenar para que el t\u00e9rmino de Dx de mayor grado sea la unidad. El valor de K ser\u00e1 el del t\u00e9rmino Dy con signo negativo, al encontrarse en el lado izquierdo (LHS) de la expresi\u00f3n, en la propuesta te\u00f3rica se encontraba como positivo del lado derecho.<\/p>\n\n\n\n<p>El t\u00e9rmino de mayor grado se puede obtener al revisar la expresi\u00f3n por cada t\u00e9rmino de la suma, buscando el factor que contiene Dx o Dy en cada caso. Por ser un poco ordenado se a\u00f1ade la funci\u00f3n <code>edp_coef_Dx()<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p>EDP Parab\u00f3lica<\/p>\n\n\n\n<p> <a href=\"#edpdiscreta\">cont\u00ednua a discreta<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmodiscretiza\">algoritmo discreta<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoexplicito\">algoritmo explicito<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"algoritmodiscretiza\">3. Algoritmo cont\u00ednua a discreta en Python<\/h2>\n\n\n\n<p>Para revisar los resultados de algunos pasos para obtener la expresi\u00f3n discreta de EDP, se usa un diccionario a ser usado en el bloque de salida. Para las expresiones de ecuaci\u00f3n se usa <code>sym.pprint()<\/code>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Ecuaciones Diferenciales Parciales Parab\u00f3licas\n# EDP Parab\u00f3licas cont\u00ednua a discreta con Sympy\nimport numpy as np\nimport sympy as sym\n\n# u(x,y) funciones continuas y variables simb\u00f3licas usadas\nt = sym.Symbol('t',real=True) # independiente\nx = sym.Symbol('x',real=True)\ny = sym.Symbol('y',real=True) \nu = sym.Function('u')(x,y) # funcion \nf = sym.Function('f')(x,y) # funcion complemento\nK = sym.Symbol('K',real=True)\n# U&#x5B;i,j] funciones discretas y variables simb\u00f3licas usadas\ni  = sym.Symbol('i',integer=True,positive=True) # indices\nj  = sym.Symbol('j',integer=True,positive=True)\nDt = sym.Symbol('Dt',real=True,positive=True)\nDx = sym.Symbol('Dx',real=True,positive=True)\nDy = sym.Symbol('Dy',real=True,positive=True)\nL  = sym.Symbol('L',real=True)\nU  = sym.Function('U')(i,j)\n\n# INGRESO\nfxy = 0*x+0*y  # f(x,y) = 0 , ecuacion complementaria\n# ecuacion edp : LHS=RHS\nLHS = sym.diff(u,x,2) \nRHS = 4*sym.diff(u,y,1) + fxy\nedp = sym.Eq(LHS-RHS,0)\n\n# centrada, adelante \ndif_dividida ={sym.diff(u,x,2): (U.subs(i,i-1)-2*U+U.subs(i,i+1))\/(Dx**2),\n               sym.diff(u,y,1): (U.subs(j,j+1)-U)\/Dy}\n\nbuscar = U.subs(j,j+1) # U&#x5B;i,j+1] m\u00e9todo expl\u00edcito\n\n# Valores de frontera\nfya = lambda y: 60 +0*y  # izquierda\nfyb = lambda y: 40 +0*y  # derecha\nfxc = lambda x: 25 +0*x  # inferior, funci\u00f3n inicial\n\n# &#x5B;a,b] dimensiones de la barra\na = 0  # longitud en x\nb = 1\ny0 = 0 # tiempo inicial, aumenta con dt en n iteraciones\n\n# muestreo en ejes, discreto\nx_tramos = 10\ndx  = (b-a)\/x_tramos\ndy  = dx\/10\nn_iteraciones = 4 # iteraciones en tiempo\n\nverdigitos = 2      # para mostrar en tabla de resultados\ncasicero = 1e-15    # para redondeo de t\u00e9rminos en ecuacion\n\n# PROCEDIMIENTO --------------------------------------\n\ndef edp_coef_Dx(edp,x,ordenx):\n    ''' Extrae el coeficiente de la derivada Dx de ordenx,\n    edp es la ecuaci\u00f3n como lhs=rhs\n    '''\n    coeff_x = 1.0 # valor inicial\n    # separa cada t\u00e9rmino de suma\n    term_suma = sym.Add.make_args(edp.lhs)\n    for term_k in term_suma:\n        if term_k.is_Mul: # mas de un factor\n            factor_Mul = sym.Mul.make_args(term_k)\n            coeff_temp = 1; coeff_usar = False\n            # separa cada factor de t\u00e9rmino \n            for factor_k in factor_Mul:\n                if not(factor_k.is_Derivative):\n                    coeff_temp = coeff_temp*factor_k\n                else: # factor con derivada de ordenx\n                    partes = factor_k.args\n                    if partes&#x5B;1]==(x,ordenx):\n                        coeff_usar = True\n            if coeff_usar==True:\n                coeff_x = coeff_x*coeff_temp\n    return(coeff_x)\n\ndef redondea_coef(ecuacion, precision=6,casicero = 1e-15):\n    ''' redondea coeficientes de t\u00e9rminos suma de una ecuacion\n    ecuaci\u00f3n como lhs=rhs\n    '''\n    tipo = type(ecuacion)\n    tipo_eq = False\n    if tipo == sym.core.relational.Equality:\n        RHS = ecuacion.rhs  # separa lado derecho\n        ecuacion = ecuacion.lhs # analiza lado izquierdo\n        tipo = type(ecuacion)\n        tipo_eq = True\n\n    if tipo == sym.core.add.Add: # t\u00e9rminos suma de ecuacion\n        term_sum = sym.Add.make_args(ecuacion)\n        ecuacion = sym.S.Zero  # vacia\n        for term_k in term_sum:\n            # factor multiplicativo de termino suma\n            term_mul = sym.Mul.make_args(term_k)\n            producto = sym.S.One\n            for factor in term_mul:\n                if not(factor.has(sym.Symbol)): # es numerico\n                    factor = np.around(float(factor),precision)\n                    if (abs(factor)%1)&lt;casicero: # si es entero\n                        factor = int(factor)\n                producto = producto*factor\n            ecuacion = ecuacion + producto\n            \n    if tipo == sym.core.mul.Mul: # termino \u00fanico, busca factores\n        term_mul = sym.Mul.make_args(ecuacion)\n        producto = sym.S.One\n        for factor in term_mul:\n            if not(factor.has(sym.Symbol)): # es numerico\n                factor = np.around(float(factor),precision)\n                if (abs(factor)%1)&lt;casicero: # si es entero\n                    factor = int(factor)\n            producto = producto*factor\n        ecuacion = producto\n        \n    if tipo == float: # solo un numero\n        if (abs(ecuacion)%1)&lt;casicero: \n            ecuacion = int(ecuacion)\n            \n    if tipo_eq==True: # era igualdad, integra lhs=rhs\n        ecuacion = sym.Eq(ecuacion,RHS)\n\n    return(ecuacion)\n\n\nresultado = {} # resultados en diccionario\n# orden de derivada por x, y\nedp_x = edp.subs(x,0)\nedp_y = edp.subs(y,0)\nordenDx = sym.ode_order(edp_x,u)\nordenDy = sym.ode_order(edp_y,u)\nresultado&#x5B;'ordenDx'] = ordenDx  # guarda en resultados\nresultado&#x5B;'ordenDy'] = ordenDy\n# coeficiente derivada orden mayor a 1 (d2u\/dx2)\ncoeff_x = edp_coef_Dx(edp,x,ordenDx)\nLHS = edp.lhs  # lado izquierdo de edp\nRHS = edp.rhs  # lado derecho de edp\nif not(coeff_x==1):\n    LHS = LHS\/coeff_x\n    RHS = RHS\/coeff_x\n# toda la expresi\u00f3n a la izquierda\nedp = sym.Eq(LHS-RHS,0) \nK_ = -edp_coef_Dx(edp,y,ordenDy)\nif abs(K_)%1&lt;casicero: # si es entero\n    K_ = int(K_)\nresultado&#x5B;'edp=0']  = edp\nresultado&#x5B;'K_']  = K_\n\n# lambda en ecuacion edp\nlamb = (Dy**ordenDy)\/(Dx**ordenDx)\nif ordenDy==1 and ordenDx==2:\n        lamb = lamb\/K_\nresultado&#x5B;'Lambda_L'] = lamb\n# valor de Lambda en ecuacion edp\nL_k = lamb.subs(&#x5B;(Dx,dx),(Dy,dy)])\nif abs(L_k)%1&lt;casicero:\n    L_k = int(L_k)\nresultado&#x5B;'Lambda L_k'] = L_k\n\ndiscreta = edp.lhs # EDP discreta\nfor derivada in dif_dividida: # reemplaza diferencia dividida\n    discreta = discreta.subs(derivada,dif_dividida&#x5B;derivada])\n\n# simplifica con Lambda_L\ndiscreta_L = sym.expand(discreta*(Dy**ordenDy),mul=True)\nresultado&#x5B;'(discreta=0)*Dy**ordeny'] = discreta_L\n\ndiscreta_L = discreta_L.subs(lamb,L)\ndiscreta_L = sym.collect(discreta_L,U) #agrupa u&#x5B;,]\ndiscreta_L = sym.Eq(discreta_L,0)\nresultado&#x5B;'discreta_L=0'] = discreta_L\n        \n# sustituye constantes en ecuaci\u00f3n a iterar\ndiscreta_L = discreta_L.subs(&#x5B;(Dx,dx),(Dy,dy),(L,L_k)])\ndiscreta_L = redondea_coef(discreta_L)\nresultado&#x5B;'discreta'] = discreta_L\n\n# SALIDA\nnp.set_printoptions(precision=verdigitos)\nalgun_numero = &#x5B;int,float,str,'Lambda L_k']\nprint('EDP Parab\u00f3lica cont\u00ednua a discreta')\nfor entrada in resultado:\n    tipo = type(resultado&#x5B;entrada])\n    if tipo in algun_numero or entrada in algun_numero:\n        print('',entrada,':',resultado&#x5B;entrada])\n    else:\n        print('\\n',entrada,':')\n        sym.pprint(resultado&#x5B;entrada])\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p>EDP Parab\u00f3lica<\/p>\n\n\n\n<p> <a href=\"#edpdiscreta\">cont\u00ednua a discreta<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmodiscretiza\">algoritmo discreta<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoexplicito\">algoritmo explicito<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading explicito\" id=\"algoritmoexplicito\">4. Algoritmo m\u00e9todo expl\u00edcito con Sympy<\/h2>\n\n\n\n<p>El desarrollo del <strong>m\u00e9todo expl\u00edcito<\/strong> para una ecuaci\u00f3n diferencial parcial <strong>parab\u00f3lica<\/strong> usando <strong>Sympy<\/strong>, requiere a\u00f1adir instrucciones para procesar la expresi\u00f3n obtenida en el algoritmo anterior con los valores de i,j.<\/p>\n\n\n\n<p>Se a\u00f1aden las instrucciones para iterar la expresi\u00f3n discreta para cada i,j dentro de la matriz U creada para el ejercicio. Se aplican las condiciones iniciales a los bordes de la matriz, para luego proceder a iterar.<\/p>\n\n\n\n<p>Como en las actividades del curso se requiere realizar al menos 3 iteraciones para las expresiones del algoritmo con papel y l\u00e1piz, solo se presentar\u00e1n los resultados de las expresiones para la primera fila en j=0.<\/p>\n\n\n\n<p>El algoritmo para la EDP del ejemplo muestra el siguiente resultado:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>M\u00e9todo expl\u00edcito EDP Parab\u00f3lica\ndiscreta_itera:\n              U(i, j)   U(i - 1, j)   U(i + 1, j)\nU(i, j + 1) = \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n                 2           4             4     \n\n iterar i,j:\nj:  0  ;  i:  1  ;  ecuacion: 0\n          U(0, 0)   U(1, 0)   U(2, 0)\nU(1, 1) = \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n             4         2         4   \nU(1, 1) = 33.75\nj:  0  ;  i:  2  ;  ecuacion: 1\n          U(1, 0)   U(2, 0)   U(3, 0)\nU(2, 1) = \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n             4         2         4   \nU(2, 1) = 25.0\nj:  0  ;  i:  3  ;  ecuacion: 2\n          U(2, 0)   U(3, 0)   U(4, 0)\nU(3, 1) = \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n             4         2         4   \nU(3, 1) = 25.0\nj:  0  ;  i:  4  ;  ecuacion: 3\n          U(3, 0)   U(4, 0)   U(5, 0)\nU(4, 1) = \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n             4         2         4   \nU(4, 1) = 25.0\nj:  0  ;  i:  5  ;  ecuacion: 4\n          U(4, 0)   U(5, 0)   U(6, 0)\nU(5, 1) = \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n             4         2         4   \nU(5, 1) = 25.0\nj:  0  ;  i:  6  ;  ecuacion: 5\n          U(5, 0)   U(6, 0)   U(7, 0)\nU(6, 1) = \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n             4         2         4   \nU(6, 1) = 25.0\nj:  0  ;  i:  7  ;  ecuacion: 6\n          U(6, 0)   U(7, 0)   U(8, 0)\nU(7, 1) = \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n             4         2         4   \nU(7, 1) = <strong>25.0<\/strong>\nj:  0  ;  i:  8  ;  ecuacion: 7\n          U(7, 0)   U(8, 0)   U(9, 0)\nU(8, <span style=\"color: #0000ff\"><strong>1<\/strong><\/span>) = \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n             4         2         4   \nU(8, <span style=\"color: #0000ff\"><strong>1<\/strong><\/span>) = <span style=\"color: #ff00ff\"><strong>25.0<\/strong><\/span>\nj:  0  ;  i:  9  ;  ecuacion: 8\n          U(8, 0)   U(9, 0)   U(10, 0)\nU(9, <span style=\"color: #0000ff\"><strong>1<\/strong><\/span>) = \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500 + \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n             4         2         4    \nU(9, <span style=\"color: #0000ff\"><strong>1<\/strong><\/span>) = <span style=\"color: #0000ff\"><strong>28.75<\/strong><\/span>\n... continua calculando\n\nx: &#091;0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\nt: &#091;0.   0.01 0.02 0.03 0.04]\n j, U&#091;i,j]\n4 &#091;60.   42.77 31.29 26.37 25.14 25.   25.06 25.59 27.7  32.62 40.  ]\n3 &#091;60.   40.86 29.38 25.55 25.   25.   25.   25.23 26.88 31.8  40.  ]\n2 &#091;60.   38.12 27.19 25.   25.   25.   25.   25.   25.94 30.62 40.  ]\n<strong><span style=\"color: #0000ff\">1<\/span><\/strong> &#091;60.   33.75 25.   25.   25.   25.   25.   <strong>25.<\/strong>   <span style=\"color: #ff00ff\"><strong>25.<\/strong><\/span>   <span style=\"color: #0000ff\"><strong>28.75<\/strong><\/span> 40.  ]\n0 &#091;60. 25. 25. 25. 25. 25. 25. 25. 25. 25. 40.]\n<\/code><\/pre>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# M\u00e9todo expl\u00edcito EDP Parab\u00f3lica ------------\n# ITERAR para cada i,j dentro de U \n# x&#x5B;i] , y&#x5B;j]  valor en posici\u00f3n en cada eje\nxi = np.arange(a,b+dx\/2,dx)\nyj = np.arange(y0,n_iteraciones*dy+dy,dy)\nn = len(xi)\nm = len(yj)\n# Matriz U\nu_xy = np.zeros(shape=(n,m),dtype = float)\nu_xy = u_xy*np.nan # valor inicial dentro de u\n# llena u con valores en fronteras\nu_xy&#x5B;:,0]   = fxc(xi)  # inferior  Tc\nu_xy&#x5B;0,:]   = fya(yj)  # izquierda Ta\nu_xy&#x5B;n-1,:] = fyb(yj)  # derecha   Tb\nu0 = np.copy(u_xy)     # matriz u inicial\n\n# busca el t\u00e9rmino no conocido\nu_explicito = sym.solve(discreta_L,buscar)\nu_explicito = sym.Eq(buscar,u_explicito&#x5B;0])\nresultado&#x5B;'discreta_itera'] = u_explicito\n\nprint('\\nM\u00e9todo expl\u00edcito EDP Parab\u00f3lica')\nprint('discreta_itera:')\nsym.pprint(u_explicito)\n\n# iterando\nprint('\\n iterar i,j:')\nj_k = 0\nfor j_k in range(0,m-1,1):\n    for i_k in range(1,n-1,1):\n        eq_conteo = j_k*(n-2)+(i_k-1)\n        discreta_ij = u_explicito.subs({i:i_k,j:j_k})\n        valorij = 0 # calcula valor de nodo ij\n        # separa cada t\u00e9rmino de suma\n        term_suma = sym.Add.make_args(discreta_ij.rhs)\n        for term_k in term_suma:\n            term_ki = 1\n            if term_k.is_Function:\n                &#x5B;i_f,j_f] = term_k.args\n                term_ki = u_xy&#x5B;i_f,j_f]\n            elif term_k.is_Mul: # mas de un factor\n                factor_Mul = sym.Mul.make_args(term_k)\n                # separa cada factor de t\u00e9rmino \n                for factor_k in factor_Mul:\n                    if factor_k.is_Function:\n                        &#x5B;i_f,j_f] = factor_k.args\n                        term_ki = term_ki*u_xy&#x5B;i_f,j_f]\n                    else:\n                        term_ki = term_ki*factor_k\n            else:\n                term_ki = term_k\n            valorij = valorij + term_ki\n        &#x5B;i_f,j_f] = discreta_ij.lhs.args\n        u_xy&#x5B;i_f,j_f] = float(valorij) # actualiza matriz u\n        # muestra las primeras m iteraciones\n        if eq_conteo&lt;(n-2):\n            print('j: ',j_k,' ; ','i: ',i_k,\n                  ' ; ','ecuacion:',eq_conteo)\n            sym.pprint(discreta_ij)\n            print(discreta_ij.lhs,'=',float(valorij))\nprint('... continua calculando')\n\n# SALIDA\nnp.set_printoptions(precision=verdigitos)\nprint('\\nx:',xi)\nprint('t:',yj)\nprint(' j, U&#x5B;i,j]')\nfor j_k in range(m-1,-1,-1):\n    print(j_k, (u_xy&#x5B;:,j_k]))\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<div class=\"wp-block-group has-medium-font-size is-layout-flex wp-block-group-is-layout-flex\">\n<p>EDP Parab\u00f3lica<\/p>\n\n\n\n<p> <a href=\"#edpdiscreta\">cont\u00ednua a discreta<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmodiscretiza\">algoritmo discreta<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmoexplicito\">algoritmo explicito<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>EDP Parab\u00f3lica cont\u00ednua a discreta algoritmo discreta algoritmo explicito 1. Ejercicio Referencia:&nbsp; Chapra 30.2 p888 pdf912,&nbsp;Burden 9Ed 12.2 p725, Rodr\u00edguez 10.2 p406 Valores de frontera: Ta = 60, Tb = 40, T0 = 25Longitud en x a = 0, b = 1,&nbsp; Constante K= 4Tama\u00f1o de paso dx = 0.1, dt = dx\/10 EDP Parab\u00f3lica [&hellip;]<\/p>\n","protected":false},"author":8043,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"wp-custom-template-entrada-mn-unidades","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[],"class_list":["post-8672","post","type-post","status-publish","format-standard","hentry","category-mn-u07"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/8672","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/users\/8043"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/comments?post=8672"}],"version-history":[{"count":8,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/8672\/revisions"}],"predecessor-version":[{"id":21093,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/8672\/revisions\/21093"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=8672"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=8672"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=8672"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}