{"id":11654,"date":"2023-10-06T05:09:31","date_gmt":"2023-10-06T10:09:31","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/analisisnumerico\/?p=11654"},"modified":"2026-01-28T08:44:07","modified_gmt":"2026-01-28T13:44:07","slug":"edp-parabolica-analitico-implicito-sympy","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u07\/edp-parabolica-analitico-implicito-sympy\/","title":{"rendered":"7.1.4 EDP Parab\u00f3lica - anal\u00edtico impl\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=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u07\/edp-parabolica-explicito-sympy\/#edpdiscreta\">cont\u00ednua a discreta<\/a><\/p>\n\n\n\n<p> <a href=\"#algoritmoimplicito\">algoritmo impl\u00edcito<\/a><br><a name=\"metodoimplicito\"><\/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=\"implicito\">5. EDP Parab\u00f3lica - M\u00e9todo impl\u00edcito con Sympy<\/h2>\n\n\n\n<p>Para el ejercicio presentado en el numeral 1, se desarrolla el m\u00e9todo impl\u00edcito.<\/p>\n\n\n\n<p>Las <strong>diferencias finitas centradas y hacia atr\u00e1s<\/strong> se definen en el diccionario <code>dif_dividida<\/code>.<\/p>\n\n\n\n<p>Para desarrollar la expresi\u00f3n discreta, se incorpora la funci\u00f3n <code>edp_sustituye_L()<\/code>, que busca el en cada t\u00e9rmino de la suma los componentes de \u03bb y los sustituye por la variable L.<\/p>\n\n\n\n<p>Para cada valor de j, se crean las ecuaciones desde la forma discreta de la EDP, moviendo a la derecha los valores conocidos para generar un sistema de ecuaciones A.X=B. Se resuelve el sistema de ecuaciones&nbsp; y se actualiza la matriz u[i,j] de resultados.<\/p>\n\n\n\n<p>Por la extensi\u00f3n de los pasos a mostrar, para las iteraciones en cada fila, solo se presentan para la primera fila. En caso de requerir observar m\u00e1s filas, puede cambiar el par\u00e1metro en el bloque de salida, en el condicional:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; gutter: false; title: ; notranslate\" title=\"\">\n    elif (tipo==dict):\n        if entrada&lt;2\n<\/pre><\/div>\n\n\n<p>Los resultados para el algoritmo son:<\/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)\n-4\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 :\n4\u22c5L\u22c5U(i - 1, j) + 4\u22c5L\u22c5U(i + 1, j) + (-8\u22c5L - 4)\u22c5U(i, j) + 4\u22c5U(i, j - 1) = 0\n\n discreta :\n-6\u22c5U(i, j) + 4\u22c5U(i, j - 1) + U(i - 1, j) + U(i + 1, j) = 0\n\nM\u00e9todo impl\u00edcito EDP Parab\u00f3lica\nj: 1 ; i: 1\nU(0, 1) + 4\u22c5U(1, 0) - 6\u22c5U(1, 1) + U(2, 1) = 0\n-6\u22c5U(1, 1) + U(2, 1) = -160.0\nj: 1 ; i: 2\nU(1, 1) + 4\u22c5U(2, 0) - 6\u22c5U(2, 1) + U(3, 1) = 0\nU(1, 1) - 6\u22c5U(2, 1) + U(3, 1) = -100.0\nj: 1 ; i: 3\nU(2, 1) + 4\u22c5U(3, 0) - 6\u22c5U(3, 1) + U(4, 1) = 0\nU(2, 1) - 6\u22c5U(3, 1) + U(4, 1) = -100.0\nj: 1 ; i: 4\nU(3, 1) + 4\u22c5U(4, 0) - 6\u22c5U(4, 1) + U(5, 1) = 0\nU(3, 1) - 6\u22c5U(4, 1) + U(5, 1) = -100.0\nj: 1 ; i: 5\nU(4, 1) + 4\u22c5U(5, 0) - 6\u22c5U(5, 1) + U(6, 1) = 0\nU(4, 1) - 6\u22c5U(5, 1) + U(6, 1) = -100.0\nj: 1 ; i: 6\nU(5, 1) + 4\u22c5U(6, 0) - 6\u22c5U(6, 1) + U(7, 1) = 0\nU(5, 1) - 6\u22c5U(6, 1) + U(7, 1) = -100.0\nj: 1 ; i: 7\nU(6, 1) + 4\u22c5U(7, 0) - 6\u22c5U(7, 1) + U(8, 1) = 0\nU(6, 1) - 6\u22c5U(7, 1) + U(8, 1) = -100.0\nj: 1 ; i: 8\nU(7, 1) + 4\u22c5U(8, 0) - 6\u22c5U(8, 1) + U(9, 1) = 0\nU(7, 1) - 6\u22c5U(8, 1) + U(9, 1) = -100.0\nj: 1 ; i: 9\nU(8, 1) + 4\u22c5U(9, 0) - 6\u22c5U(9, 1) + U(10, 1) = 0\nU(8, 1) <strong>- 6\u22c5<\/strong>U(9, 1) = <strong>-140.0<\/strong>\nA :\n&#091;&#091;-6.  1.  0.  0.  0.  0.  0.  0.  0.]\n &#091; 1. -6.  1.  0.  0.  0.  0.  0.  0.]\n &#091; 0.  1. -6.  1.  0.  0.  0.  0.  0.]\n &#091; 0.  0.  1. -6.  1.  0.  0.  0.  0.]\n &#091; 0.  0.  0.  1. -6.  1.  0.  0.  0.]\n &#091; 0.  0.  0.  0.  1. -6.  1.  0.  0.]\n &#091; 0.  0.  0.  0.  0.  1. -6.  1.  0.]\n &#091; 0.  0.  0.  0.  0.  0.  1. -6.  1.]\n &#091; 0.  0.  0.  0.  0.  0.  0.  <strong>1<\/strong>. <strong>-6<\/strong>.]]\nB :\n&#091;-160. -100. -100. -100. -100. -100. -100. -100. <strong>-140<\/strong>.]\nX :\n&#091;<strong>31.01 26.03 25.18 25.03 25.01 25.01 25.08 25.44 27.57<\/strong>]\nResultados para U(x,y)\nxi: &#091;0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]\nyj: &#091;0.   0.01 0.02 0.03 0.04]\n j, U&#091;i,j]\n4 &#091;60.   40.67 30.61 26.75 25.51 25.18 25.24 25.76 27.41 31.71 40.  ]\n3 &#091;60.   38.34 29.06 26.09 25.28 25.09 25.13 25.47 26.74 30.72 40.  ]\n2 &#091;60.   35.25 27.49 25.55 25.12 25.03 25.05 25.24 26.07 29.39 40.  ]\n1 &#091;60.   <strong>31.01 26.03 25.18 25.03 25.01 25.01 25.08 25.44 27.57<\/strong> 40.  ]\n0 &#091;60. 25. 25. 25. 25. 25. 25. 25. 25. 25. 40.]\n<\/code><\/pre>\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=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u07\/edp-parabolica-explicito-sympy\/#edpdiscreta\">cont\u00ednua a discreta<\/a><\/p>\n\n\n\n<p> <a href=\"#algoritmoimplicito\">algoritmo impl\u00edcito<\/a><br><a name=\"metodoimplicito\"><\/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=\"algoritmoimplicito\">6. Algoritmo en Python<\/h2>\n\n\n\n<p>Para el m\u00e9todo impl\u00edcito se a\u00f1ade la secci\u00f3n donde se reemplazan los valores en los bordes y en la barra en la matriz U(x,y) en el algoritmo identificada como&nbsp; <code>u_xy<\/code> . Para diferenciar si el valor existe se usa la matriz de estados <code>u_mask<\/code> con estados <code>True\/False<\/code>.<\/p>\n\n\n\n<p>Tambi\u00e9n se incorpora la funci\u00f3n <code>edp_sustituyeValorU()<\/code> que para cada t\u00e9rmino suma de la ecuaci\u00f3n busca en la matriz <code>u_xy<\/code> si el valor U(i,j) existe y lo cambia. Luego pasa el valor al lado derecho de la ecuaci\u00f3n par formar el sistema de ecuaciones.<\/p>\n\n\n\n<p>Con los valores existentes antes de la iteraci\u00f3n, se obtienen las ecuaciones por cada punto i,j de una fila para el sistema de ecuaciones en la forma A.x=B. El sistema se resuelve con las instrucciones de Numpy. El resultado se actualiza en la matriz <code>u_xy<\/code> y la matriz&nbsp; <code>u_mask<\/code> para indicar que el valor ya est\u00e1 disponible.<\/p>\n\n\n\n<p>Compare los resultados con el m\u00e9todo num\u00e9rico y <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mnumericos\/mn-recursos\/resumen-python-conceptos\/#tiempo-algoritmo\">mida los tiempos de ejecuci\u00f3n<\/a> de cada algoritmo para escribir sus observaciones.<\/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, atras\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 - U.subs(j,j-1))\/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\ndef edp_sustituye_L(resultado):\n    ''' sustituye lambda con Dy**ordeny\/Dx**x\/K_\n    por L, al simplificar Lambda\n    '''\n    discreta = resultado&#x5B;'(discreta=0)*Dy**ordeny']\n    ordenDy = resultado&#x5B;'ordenDy']\n    ordenDx = resultado&#x5B;'ordenDx']\n    discreta_L = 0\n    # separa cada t\u00e9rmino de suma\n    term_suma = sym.Add.make_args(discreta)\n    for term_k in term_suma:\n        # busca partes de L y cambia por valor L\n        cambiar = False # por orden de derivada\n        if term_k.has(Dx) and term_k.has(Dy):\n            partes = term_k.args\n            ordeny = 1\n            ordenx = 1\n            for unaparte in partes:    \n                if unaparte.has(Dy):\n                    if unaparte.is_Pow:\n                        partey = unaparte.args\n                        ordeny = partey&#x5B;1]\n                if unaparte.has(Dx):\n                    if unaparte.is_Pow:\n                        partey = unaparte.args\n                        ordenx = partey&#x5B;1]\n            if (ordeny&lt;=ordenDy and ordenx&lt;=-ordenDx):\n                cambiar = True\n        if cambiar==True:\n            term_k = term_k*L\/resultado&#x5B;'Lambda_L']\n        discreta_L = discreta_L + term_k\n        # simplifica unos con decimal a entero \n        discreta_L = redondea_coef(discreta_L)\n    return(discreta_L)\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: # si es entero\n    L_k = int(L_k)\nresultado&#x5B;'Lambda L_k'] = L_k\n\ndiscreta = edp.lhs # EDP discreta\nfor derivada in dif_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 = edp_sustituye_L(resultado)\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\n# M\u00e9todo impl\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\/2,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# u_mask&#x5B;i,j] con valores iniciales o calculados:True\nu_mask = np.zeros(shape=(n,m),dtype=bool)\nu_mask&#x5B;0,:]  = True # izquierda Ta\nu_mask&#x5B;-1,:] = True # derecha   Tb\nu_mask&#x5B;:,0]  = True # inferior  Tc\n\n# M\u00e9todo impl\u00edcito para EDP Parab\u00f3lica\n# a usar en iteraciones\ndiscreta = resultado&#x5B;'discreta']\n\ndef edp_sustituyeValorU(discreta,xi,yj,u_xy,u_mask):\n    '''Sustituye en edp discreta los valores conocidos de U&#x5B;i,j]\n    tomados desde u_xy, marcados con u_mask\n    u_mask indica si el valor se ha calculado con edp.\n    '''\n    LHS = discreta.lhs # lado izquierdo de ecuacion\n    RHS = discreta.rhs # lado derecho\n    # sustituye U&#x5B;i,j] con valores conocidos\n    A_diagonal = &#x5B;] # lista de i,j para matriz de coeficientes A\n    # Separa t\u00e9rminos suma\n    term_suma = sym.Add.make_args(LHS)\n    for term_k in term_suma:\n        # busca U&#x5B;i,j] y cambia por valor uxt&#x5B;i,j]\n        cambiar = False ; cambiar_valor = 0 ; cambiar_factor = 0\n        # separa cada factor de t\u00e9rmino\n        factor_Mul = sym.Mul.make_args(term_k)\n        for factor_k in factor_Mul:\n            # busca U&#x5B;i,j] en matriz uxt&#x5B;i,j]\n            if factor_k.is_Function:\n                &#x5B;i_k,j_k] = factor_k.args\n                if not(np.isnan(u_xy&#x5B;i_k,j_k])):\n                    cambiar = u_mask&#x5B;i_k,j_k]\n                    cambiar_factor = factor_k\n                    cambiar_valor = u_xy&#x5B;i_k,j_k]\n                else:\n                    A_diagonal.append(&#x5B;i_k,j_k,term_k\/factor_k])\n        # encontr\u00f3 valor U&#x5B;i,j],term_k va a la derecha de ecuaci\u00f3n\n        if cambiar == True:\n            LHS = LHS - term_k\n            term_ki = term_k.subs(cambiar_factor,cambiar_valor)\n            RHS = RHS - term_ki\n    discreta = sym.Eq(LHS,RHS)\n    B_diagonal = RHS\n    resultado = &#x5B;discreta,A_diagonal,B_diagonal]\n    return (resultado)\n\n# ITERAR para plantear las ecuaciones en &#x5B;i,j]\nresultado = {} # resultados en diccionario\neq_itera = &#x5B;] ; tamano = (n-2)\nA = np.zeros(shape=(tamano,tamano),dtype=float)\nB = np.zeros(tamano,dtype=float)\nfor j_k in range(1,m,1): # no usar valores en bordes\n    resultado&#x5B;j_k] ={}\n    for i_k in range(1,n-1,1): \n        eq_conteo = i_k-1\n        discreta_ij = discreta.subs({i:i_k,j:j_k,\n                                     x:xi&#x5B;i_k],y:yj&#x5B;j_k]})\n        resultado&#x5B;j_k]&#x5B;eq_conteo]= {'j':j_k, 'i':i_k,\n                                 'discreta_ij': discreta_ij}\n        # usa valores de frontera segun u_mask con True\n        discreta_k = edp_sustituyeValorU(discreta_ij,\n                                        xi,yj,u_xy,u_mask)\n        discreta_ij = discreta_k&#x5B;0]\n        A_diagonal  = discreta_k&#x5B;1] # lista de (i,j,coeficiente) \n        B_diagonal  = discreta_k&#x5B;2] # constante para B\n        resultado&#x5B;j_k]&#x5B;eq_conteo]&#x5B;'discreta_k'] = discreta_k&#x5B;0]\n        # a\u00f1ade ecuacion a resolver\n        eq_itera.append(discreta_ij)\n        # Aplica coeficientes de ecuacion en A y B:\n        # A_diagonal tiene lista de (i,j,coeficiente) \n        for uncoeff in A_diagonal:\n            columna = uncoeff&#x5B;0]-1\n            fila = eq_conteo\n            A&#x5B;fila,columna] = uncoeff&#x5B;2]\n        B&#x5B;eq_conteo] = float(B_diagonal) # discreta_ij.rhs\n    # resuelve el sistema A.X=B en Numpy\n    X_k = np.linalg.solve(A,B)\n    # actualiza uxt&#x5B;i,j] , u_mask segun X_k\n    u_xy&#x5B;1:n-1,j_k] = X_k\n    u_mask&#x5B;1:n-1,j_k] = True\n    # almacena resultados\n    resultado&#x5B;j_k]&#x5B;'A'] = np.copy(A)\n    resultado&#x5B;j_k]&#x5B;'B'] = np.copy(B)\n    resultado&#x5B;j_k]&#x5B;'X'] = np.copy(X_k)\n\n# SALIDA\nnp.set_printoptions(precision=verdigitos)\nalgun_numero = &#x5B;int,float,str,'Lambda L_k']\nprint('\\nM\u00e9todo impl\u00edcito EDP Parab\u00f3lica')\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    elif (tipo==dict):\n        if entrada&lt;2:\n            eq_conteo = resultado&#x5B;entrada].keys()\n            for una_eq in eq_conteo:\n                if una_eq=='A' or una_eq=='B' or una_eq=='X':\n                    print(una_eq,':')\n                    print(resultado&#x5B;entrada]&#x5B;una_eq])\n                else:\n                    print('j:',resultado&#x5B;entrada]&#x5B;una_eq]&#x5B;'j'],'; '\n                          'i:',resultado&#x5B;entrada]&#x5B;una_eq]&#x5B;'i'])\n                    sym.pprint(resultado&#x5B;entrada]&#x5B;una_eq]&#x5B;'discreta_ij'])\n                    sym.pprint(resultado&#x5B;entrada]&#x5B;una_eq]&#x5B;'discreta_k'])\n    else:\n        print('\\n',entrada,': \\n',resultado&#x5B;entrada])\nprint('Resultados para U(x,y)')\nprint('xi:',xi)\nprint('yj:',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=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u07\/edp-parabolica-explicito-sympy\/#edpdiscreta\">cont\u00ednua a discreta<\/a><\/p>\n\n\n\n<p> <a href=\"#algoritmoimplicito\">algoritmo impl\u00edcito<\/a><br><a name=\"metodoimplicito\"><\/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 impl\u00edcito 5. EDP Parab\u00f3lica - M\u00e9todo impl\u00edcito con Sympy Para el ejercicio presentado en el numeral 1, se desarrolla el m\u00e9todo impl\u00edcito. Las diferencias finitas centradas y hacia atr\u00e1s se definen en el diccionario dif_dividida. Para desarrollar la expresi\u00f3n discreta, se incorpora la funci\u00f3n edp_sustituye_L(), que busca el en [&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-11654","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\/11654","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=11654"}],"version-history":[{"count":4,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/11654\/revisions"}],"predecessor-version":[{"id":21222,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/11654\/revisions\/21222"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=11654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=11654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=11654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}