{"id":557,"date":"2017-07-04T09:10:26","date_gmt":"2017-07-04T14:10:26","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/matg1013\/?p=557"},"modified":"2026-04-03T20:27:37","modified_gmt":"2026-04-04T01:27:37","slug":"diferencias-finitas-avanzadas-polinomio","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u04\/diferencias-finitas-avanzadas-polinomio\/","title":{"rendered":"4.2.1 Interpolaci\u00f3n por Diferencias finitas avanzadas (h) con 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><a href=\"#concepto\">Dif_Finitas Avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><br><a name=\"concepto\"><\/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=\"concepto\">1. Interpolaci\u00f3n por Diferencias finitas avanzadas<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: Rodr\u00edguez 6.6.4 p221, Burden 9Ed p129<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/DifFinAvanz01_anima.gif\" alt=\"diferencias finitas avanzadas con varios puntos gr\u00e1fico animado\" class=\"wp-image-13540\" \/><\/figure>\n\n\n\n<p>Se usa en interpolaci\u00f3n cuando los puntos en el \"eje x\" se encuentran <strong><em>igualmente espaciados<\/em><\/strong>, la diferencia entre puntos consecutivos x<sub>i<\/sub> es una constante denominada <strong>h<\/strong>.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><strong>h<\/strong> = x<sub>i+1<\/sub> - x<sub>i<\/sub><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1293\" height=\"803\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/diferenciasfinitasAvzd_ani.gif\" alt=\"diferencias finitas avanzadas gr\u00e1ficos animados\" class=\"wp-image-23341\" \/><\/figure>\n\n\n\n<p>Una relaci\u00f3n entre derivadas y diferencias finitas se establece mediante: <span class=\"wp-katex-eq\" data-display=\"false\"> f^{(n)}(z) = \\frac{\\Delta ^{n} f_{0}}{h^{n}}<\/span> para alg\u00fan z en el intervalo [x<sub>0<\/sub>,x<sub>n<\/sub>].<\/p>\n\n\n\n<p><span class=\"wp-katex-eq\" data-display=\"false\"> \\frac{\\Delta ^{n} f_{0}}{h^{n}}<\/span> es una aproximaci\u00f3n para la n-\u00e9sima derivada f<sup>(n)<\/sup><\/p>\n\n\n\n<p>El polinomio de interpolaci\u00f3n se puede construir por medio de <strong><em>diferencias finitas avanzadas<\/em><\/strong> con las siguiente f\u00f3rmula:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_n (x) = f_0 + \\frac{\\Delta f_0}{h} (x - x_0) + <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> + \\frac{\\Delta^2 f_0}{2!h^2} (x - x_0)(x - x_1) + <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> + \\frac{\\Delta^3 f_0}{3!h^3} (x - x_0)(x - x_1)(x - x_2) + \\text{...}<\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> + \\frac{\\Delta^n f_0}{n!h^n} (x - x_0)(x - x_1) \\text{...} (x - x_{n-1}) <\/span>\n\n\n\n<p>Observe que en la medida que se toman m\u00e1s puntos de muestra, el grado del polinomio puede ser mayor.<\/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><a href=\"#concepto\">Dif_Finitas Avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><br><a name=\"concepto\"><\/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\">2. Ejercicio<\/h2>\n\n\n\n<p>Se toman los datos del ejercicio de <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u04\/diferencias-finitas\/\" data-type=\"post\" data-id=\"552\">diferencias finitas<\/a> , observando que se requiere que el tama\u00f1o de paso <strong>h<\/strong>&nbsp; sea constante entre los puntos consecutivos x<sub>i<\/sub>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>xi = &#091;0.1, 0.2, 0.3, 0.4]\nfi = &#091;1.45, 1.6, 1.7, 2.0]<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><span style=\"color: #ff00ff\">x<sub>i<\/sub><\/span><\/td><td><span style=\"color: #ff00ff\">0.1<\/span><\/td><td><span style=\"color: #ff00ff\">0.2<\/span><\/td><td><span style=\"color: #ff00ff\">0.3<\/span><\/td><td><span style=\"color: #ff00ff\">0.4<\/span><\/td><\/tr><tr><td><span style=\"color: #0000ff\">f<sub>i<\/sub><\/span><\/td><td><span style=\"color: #0000ff\">1.45<\/span><\/td><td><span style=\"color: #0000ff\">1.6<\/span><\/td><td><span style=\"color: #0000ff\">1.7<\/span><\/td><td><span style=\"color: #0000ff\">2.0<\/span><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Para \u00e9ste ejercicio se comprueba que <strong>h<\/strong> = 0.1<\/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><a href=\"#concepto\">Dif_Finitas Avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><br><a name=\"concepto\"><\/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=\"analitico\">3. Desarrollo Anal\u00edtico<\/h2>\n\n\n\n<p>Se inicia el c\u00e1lculo de la distancia entre puntos xi, comprobando que debe ser constante <strong>h<\/strong>, adem\u00e1s que los valores xi deben encontrarse ordenados de forma ascendente:<\/p>\n\n\n\n<p><strong>h<\/strong> = xi[1] - xi[0] = 0.2-0.1 = 0.1<br><strong>h<\/strong> = xi[2] - xi[1] = 0.3-0.2 = 0.1<br><strong>h<\/strong> = xi[3] - xi[2] = 0.4-0.3 = 0.1<\/p>\n\n\n\n<p>Se usan los resultados previos del ejercicio con <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u04\/diferencias-finitas\/\">diferencias finitas<\/a>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Tabla Diferencia Finita: \n&#091;&#091;'i', 'xi', <span style=\"color: #0000ff\">'fi'<\/span>, 'd1f', 'd2f', 'd3f', 'd4f']]\n&#091;&#091; 0.    0.1   <strong><span style=\"color: #0000ff\">1.45<\/span>  <span style=\"color: #008000\">0.15<\/span><\/strong> -0.05  0.25  0.  ]\n &#091; 1.    0.2   <span style=\"color: #0000ff\">1.6<\/span>   0.1   0.2   0.    0.  ]\n &#091; 2.    0.3   <span style=\"color: #0000ff\">1.7<\/span>   0.3   0.    0.    0.  ]\n &#091; 3.    0.4   <span style=\"color: #0000ff\">2.<\/span>    0.    0.    0.    0.  ]]<\/code><\/pre>\n\n\n\n<p>Como los tama\u00f1os de paso en xi son constantes, h=0.1, es posible usar el m\u00e9todo. Para la construcci\u00f3n del polinomio, se usan los valores de diferencias finitas de la primera fila desde la columna 3 en adelante.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>dfinita = tabla&#091;0,3:] = &#091;<strong><span style=\"color: #008000\">0.15<\/span><\/strong>, -0.05, 0.25, 0.]<\/code><\/pre>\n\n\n\n<p>Se empieza con el valor del primer punto de la funci\u00f3n f(0.1), j=0.<\/p>\n\n\n\n<p class=\"has-text-align-center\">p<sub>3<\/sub>(x) = f<sub>0<\/sub> = <span style=\"color: #0000ff\">1.45<\/span><\/p>\n\n\n\n<p>para a\u00f1adirle el t\u00e9rmino j=1, m\u00e1s el <code>factor<\/code> por calcular:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> factor = \\frac{\\Delta^1 f_0}{1!h^1} = \\frac{0.15}{1!(0.1)} = 1.5 <\/span>\n\n\n\n<p>completando el t\u00e9rmino como:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> t\u00e9rmino = factor(x-x_0) = 1.5(x-0.1) <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x) = 1.45 + 1.5(x-0.1) <\/span>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/diferenciafinitaAvzd_term2.gif\" alt=\"interpolaci\u00f3n diferencias finitas avanzadas dos t\u00e9rminos\" class=\"wp-image-23353\" \/><\/figure>\n\n\n\n<p>Para el segundo t\u00e9rmino j=2, se repite el proceso:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> factor = \\frac{\\Delta^2 f_0}{2!h^2} = \\frac{-0.05}{2!(0.1)^2} = -2.5 <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> t\u00e9rmino = factor(x-x_0) = -2.5(x-0.1)(x-0.2) <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x)= 1.45 + 1.5(x-0.1) +(-2.5)(x-0.1)(x-0.2)<\/span>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/diferenciafinitaAvzd_term3.gif\" alt=\"interpolaci\u00f3n diferencias finitas avanzadas tres t\u00e9rminos\" class=\"wp-image-23354\" \/><\/figure>\n\n\n\n<p>Finalmente, a\u00f1adiendo el t\u00e9rmino j=3 cuyo c\u00e1lculo es semejante a los anteriores, se deja como <strong><em>tarea<\/em><\/strong>.<\/p>\n\n\n\n<p>El resultado del m\u00e9todo es:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x)= 1.45 + 1.5(x-0.1) -2.5(x-0.1)(x-0.2) + <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> + 41.667(x - 0.3)(x - 0.2)(x - 0.1)<\/span>\n\n\n\n<p>Se puede seguir simplificando la respuesta, por ejemplo usando solo el t\u00e9rmino de grado con 1.5(x-0.1) se tiene que:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x) = 1.3 + 1.5x -2.5(x-0.1)(x-0.2)+ <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> + 41.667(x - 0.3)(x - 0.2)(x - 0.1)<\/span>\n\n\n\n<p>Seguir simplificando la expresi\u00f3n en papel, los detalles se deja como <em><strong>tarea<\/strong><\/em>, se obtiene:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x) = 1+ 6.833x 27.5x^2+41.666x^3 <\/span>\n\n\n\n<p>La gr\u00e1fica del polinomio obtenido comprueba que pasa por cada uno de los puntos del ejercicio.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/diferenciafinitaAvzd_term4.gif\" alt=\"interpolaci\u00f3n diferencias finitas avanzadas cuatro t\u00e9rminos\" class=\"wp-image-23355\" \/><\/figure>\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><a href=\"#concepto\">Dif_Finitas Avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><br><a name=\"concepto\"><\/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=\"algoritmo\">4. Algoritmo en Python<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Interpolaci\u00f3n con Diferencias Finitas Avanzadas en Python\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/XqvzUoSuV2A?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p>El polinomio se construye usando el ejercicio de diferencias finitas.<\/p>\n\n\n\n<p>Para construir la expresi\u00f3n del polinomio a\u00f1adiendo los t\u00e9rminos de la f\u00f3rmula, se define la variable simb\u00f3lica <strong>x<\/strong> con Sympy.<\/p>\n\n\n\n<p>Para simplificar el polinomio resultante con las expresiones de multiplicaci\u00f3n, se utiliza la instrucci\u00f3n <code>sym.expand()<\/code>.<\/p>\n\n\n\n<p>En caso de requerir evaluar la f\u00f3rmula con un vector de datos se la convierte a la forma lambda para evaluaci\u00f3n num\u00e9rica.<\/p>\n\n\n\n<p>teniendo como resultado:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>dtramos:  &#091;0.1 0.1 0.1]\nTabla Diferencias Finitas\n&#091;&#091;'i', 'xi', 'fi', 'd1f', 'd2f', 'd3f', 'd4f']]\n&#091;&#091; 0.    0.1   1.45  <strong><span style=\"color: #008000\">0.15<\/span> <span style=\"color: #d35400\">-0.05<\/span>  0.25  0.<\/strong>  ]\n &#091; 1.    0.2   1.6   0.1   0.2   0.    0.  ]\n &#091; 2.    0.3   1.7   0.3   0.    0.    0.  ]\n &#091; 3.    0.4   2.    0.    0.    0.    0.  ]]\ndfinita: \n&#091; <strong><span style=\"color: #008000\">0.15<\/span> <span style=\"color: #d35400\">-0.05<\/span>  0.25  0.<\/strong>  ]\nDiferencias Finitas Avanzadas\npolinomio: \n1.5*x + 41.6666666666667*(x - 0.3)*(x - 0.2)*(x - 0.1) - 2.50000000000001*(x - 0.2)*(x - 0.1) + 1.3\npolinomio simplificado: \n41.6666666666667*x**3 - 27.5*x**2 + 6.83333333333335*x + 0.999999999999999\np(x):\n                  3         2                                         \n41.6666666666667\u22c5x  - 27.5\u22c5x  + 6.83333333333335\u22c5x + 0.999999999999999<\/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; highlight: [49,56,57,60,61]; title: ; notranslate\" title=\"\">\n# Polinomio interpolaci\u00f3n\n# Diferencias Finitas Avanzadas\n# Tarea: Verificar tama\u00f1o de vectores,\n#        verificar puntos equidistantes en x\n \nimport numpy as np\nimport math\nimport sympy as sym\n \n# INGRESO\nxi = &#x5B;0.1, 0.2, 0.3, 0.4]\nfi = &#x5B;1.45, 1.6, 1.7, 2.0]\n\ntitulo = 'Diferencias Finitas Avanzadas'\n \n# PROCEDIMIENTO\ncasicero = 1e-15  # redondear a cero\n# Matrices como arreglo, numeros reales\nxi = np.array(xi,dtype=float)\nfi = np.array(fi,dtype=float)\nn = len(xi)\n\n# Tabla de Diferencias Finitas\ntabla_etiq = &#x5B;'i','xi','fi']\nki = np.arange(0,n,1) # filas\ntabla = np.concatenate((&#x5B;ki],&#x5B;xi],&#x5B;fi]),axis=0)\ntabla = np.transpose(tabla)\ndfinita = np.zeros(shape=(n,n),dtype=float)\ntabla = np.concatenate((tabla,dfinita), axis=1)\nn,m = np.shape(tabla)\n# Calular tabla de Diferencias Finitas\ndiagonal = n-1 # derecha a izquierda\nj = 3  # inicia en columna 3\nwhile (j &lt; m): # columna\n    tabla_etiq.append('d'+str(j-2)+'f') \n    i = 0 # fila\n    while (i &lt; diagonal): # antes de diagonal\n        tabla&#x5B;i,j] = tabla&#x5B;i+1,j-1]-tabla&#x5B;i,j-1]\n         \n        if abs(tabla&#x5B;i,j])&lt;casicero: # casicero revisa\n                tabla&#x5B;i,j]=0\n        i = i + 1\n    diagonal = diagonal - 1\n    j = j + 1\n \n# POLINOMIO con diferencias Finitas Avanzadas\n# caso: puntos equidistantes en eje x\ndtramos = np.diff(xi,1) # tramos xi\ndfinita = tabla&#x5B;0,3:] # diferencias finitas\nh = xi&#x5B;1] - xi&#x5B;0]     # suponer tramos equidistantes\n \n# polinomio con diferencias Finitas Avanzadas\nx = sym.Symbol('x')\npolinomio = fi&#x5B;0] +0*x # sym.S.Zero en Sympy\nfor i in range(1,n,1):\n    denominador = math.factorial(i)*(h**i)\n    factor = dfinita&#x5B;i-1]\/denominador\n    termino = 1\n    for j in range(0,i,1):\n        termino = termino*(x-xi&#x5B;j])\n    polinomio = polinomio + termino*factor\n \npolisimple = polinomio.expand() # simplifica los (x-xi)\npx = sym.lambdify(x,polisimple) # evaluacion numerica\n \n# SALIDA\nprint('dtramos:',dtramos)\nprint('Tabla Diferencias Finitas')\nprint(&#x5B;tabla_etiq])\nprint(tabla)\nprint('dfinita: ')\nprint(dfinita)\nprint(titulo)\nprint('polinomio: ')\nprint(polinomio)\nprint('polinomio simplificado: ' )\nprint(polisimple)\nprint('p(x):')\nsym.pprint(polisimple)\n<\/pre><\/div>\n\n\n<p>el polinomio de puede evaluar como px(valor) una vez que se convierte a la forma lambda para usar con Numpy:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt;&gt; px(0.1)\n1.4500000000000004\n&gt;&gt;&gt; px(0.2)\n1.6000000000000025\n&gt;&gt;&gt; px0.3)\n1.7000000000000042\n&gt;&gt;&gt; <\/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><a href=\"#concepto\">Dif_Finitas Avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><br><a name=\"concepto\"><\/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=\"grafica\">5. Gr\u00e1fica de polinomio de interpolaci\u00f3n<\/h2>\n\n\n\n<p>Las instrucciones son semejantes a las presentadas en <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u04\/polinomio-interpola-vandermonde\/\" data-type=\"post\" data-id=\"534\">polinomio de interpolaci\u00f3n<\/a>. <\/p>\n\n\n\n<p>Se a\u00f1aden las instrucciones para realizar la gr\u00e1fica en el intervalo [a,b] dado por los valores x<sub>i<\/sub>, definiendo el n\u00famero de muestras = 21 que son suficientes para que la gr\u00e1fica se observe sin distorsi\u00f3n.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA --------------\nimport matplotlib.pyplot as plt\n\nmuestras = 21  # resoluci\u00f3n gr\u00e1fica\n\na = np.min(xi) # intervalo &#x5B;a,b]\nb = np.max(xi)\nxk = np.linspace(a,b,muestras)\nyk = px(xk)\n\nplt.plot(xi,fi,'o', label='&#x5B;xi,fi]')\nplt.plot(xk,yk, label='p(x)')\n\n# entorno de grafica\nplt.xlabel('xi')\nplt.ylabel('fi')\nplt.legend()\nplt.title(titulo)\nplt.tight_layout()\nplt.show()\n<\/pre><\/div>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/diferenciafinitaAvzd_term4.gif\" alt=\"interpolaci\u00f3n diferencias finitas avanzadas cuatro t\u00e9rminos\" class=\"wp-image-23355\" \/><\/figure>\n\n\n\n<p><strong>Tarea<\/strong>: se recomienda realizar las gr\u00e1ficas comparativas entre m\u00e9todos, debe mostrar la diferencia con los m\u00e9todos que requieren el tama\u00f1o de paso equidistante <strong>h<\/strong>, y los que no lo requieren. Permite detectar errores de selecci\u00f3n de m\u00e9todo para interpolaci\u00f3n.<\/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><a href=\"#concepto\">Dif_Finitas Avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><br><a name=\"concepto\"><\/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=\"funcion\">6. Algoritmo como funci\u00f3n<\/h2>\n\n\n\n<p>Se reordena el algoritmo para usar funciones. El bloque de salida es semejante al resultado anterior. Las funciones pueden ser reutilizadas de ser necesarias en el siguiente m\u00e9todo de interpolaci\u00f3n.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Tabla de Diferencias finitas\n&#091;&#091;'i', 'xi', 'fi', 'd1f', 'd2f', 'd3f', 'd4f']]\n&#091;&#091; 0.    0.1   1.45  0.15 -0.05  0.25  0.  ]\n &#091; 1.    0.2   1.6   0.1   0.2   0.    0.  ]\n &#091; 2.    0.3   1.7   0.3   0.    0.    0.  ]\n &#091; 3.    0.4   2.    0.    0.    0.    0.  ]]\nxi_ascendente: True\ntramos xi Equidistantes: True\nTramo h: 0.1\ndfinitas: \n&#091; 0.15 -0.05  0.25  0.  ]\npolinomio: \n1.30000000000000 +\n1.5*x +\n-2.50000000000001*(x - 0.2)*(x - 0.1) +\n41.6666666666667*(x - 0.3)*(x - 0.2)*(x - 0.1)\n\npolinomio simplificado: \n41.6666666666667*x**3 - 27.5*x**2 + 6.83333333333335*x + 0.999999999999999\np(x):\n                  3         2                                         \n41.6666666666667\u22c5x  - 27.5\u22c5x  + 6.83333333333335\u22c5x + 0.999999999999999<\/code><\/pre>\n\n\n\n<p>Se a\u00f1ade un bloque en forma de funciones para la revisi\u00f3n que los puntos xi se presenten en <strong>orden <\/strong>ascendente y sean <strong>equidistantes<\/strong>.<\/p>\n\n\n\n<p>El m\u00e9todo para las tablas de diferencias finitas es muy semejante al de diferencias finitas divididas, se integra en una sola funci\u00f3n con el par\u00e1metro de selecci\u00f3n de <strong>tipo_tabla<\/strong>, par\u00e1metro usado tambi\u00e9n para generar el t\u00edtulo de la gr\u00e1fica.<\/p>\n\n\n\n<p>En caso de existir inconsistencias o errores se almacenan en una lista de mensajes \"msj\".<\/p>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; highlight: [132,133,136,137,138,139,146,155]; title: ; notranslate\" title=\"\">\n# Diferencias finitas Avanzadas\/Divididas de Newton\n# funciones diferencias_tabla, revisa_orden, tramos_equidistantes,\n# Tarea: Verificar tama\u00f1o de vectores\nimport numpy as np\nimport math\nimport sympy as sym\n\n# INGRESO\nxi = &#x5B;0.1, 0.2, 0.3, 0.4]\nfi = &#x5B;1.45, 1.6, 1.7, 2.0]\n \ntipo_tabla = 'finitas' # finitas o divididas\n\n# Algoritmos como Funciones\ndef revisa_orden(xi,orden='up'):\n    ''' Revisa orden en vector xi.\n      orden='up': orden ascendente\n      orden='down' : orden descendente\n    resultado:\n      True:  xi ordenado,\n      False: xi desordenado y d\u00f3nde.\n    '''\n    # Vectores como arreglo, numeros reales\n    xi = np.array(xi,dtype=float)\n    n = len(xi)\n    msj = &#x5B;] # mensajes de error\n     \n    # xi revisar orden ascendente o descendente\n    tramos  = np.diff(xi,1)  # diferencias en xi\n    ordenado = True  # suponer ordenados\n    k = 1 # 1: ascendente\n    if orden=='down':\n        k = -1 # -1: descendente\n    donde = -1\n    i = 0\n    while i&lt;(n-1) and donde&lt;0:\n        if k*tramos&#x5B;i]&lt;0:\n            ordenado = False\n            donde = i+1\n            msj.append(&#x5B;'sin orden',donde])\n        i = i+1\n    return(&#x5B;ordenado,msj])\n \ndef tramos_equidistantes(xi, casicero = 1e-15):\n    ''' Revisa tama\u00f1os de paso h en vector xi.\n    True:  h son equidistantes,\n    False: h tiene tama\u00f1o de paso diferentes y d\u00f3nde.\n    '''\n    # Vectores como arreglo, numeros reales\n    xi = np.array(xi,dtype=float)\n    n = len(xi)\n    msj = &#x5B;] # mensajes de error\n     \n    # revisa tama\u00f1os de paso desiguales o no equidistantes\n    h_iguales = True\n    if (n-1)&gt;=2: # al menos dos tramos\n        dtramos = np.diff(xi,2) # cero o menores a casicero\n        errado  = np.max(np.abs(dtramos)) # |error| mayor\n        if errado&gt;=casicero:  # no equidistantes\n            h_iguales=False\n            donde = np.argmax(np.abs(dtramos))+1\n            msj.append(&#x5B;'no equidistantes',donde])\n \n    return(&#x5B;h_iguales,msj])\n \ndef diferencias_tabla(xi,fi,tipo='finitas', vertabla=False,\n                casicero = 1e-15, precision=4):\n    '''Genera la tabla de diferencias finitas o divididas\n      tipo = 'finitas, tipo = 'divididas'\n    resultado en: tabla, titulo\n    Tarea: verificar tama\u00f1o de vectores\n    '''\n    # revisa tipo de tabla\n    tipolist = &#x5B;'finitas','divididas']\n    if not(tipo in tipolist):\n        print('error de tipo, seleccione:',tipolist)\n        return()\n     \n    prefijo = &#x5B;'d','f']\n    if tipo=='divididas':\n        prefijo = &#x5B;'F&#x5B;',']']\n     \n    # Matrices como arreglo, numeros reales\n    xi = np.array(xi,dtype=float)\n    fi = np.array(fi,dtype=float)\n    n = len(xi)\n \n    # Tabla de Diferencias Finitas\/Divididas\n    tabla_etiq = &#x5B;'i','xi','fi']\n    ki = np.arange(0,n,1) # filas\n    tabla = np.concatenate((&#x5B;ki],&#x5B;xi],&#x5B;fi]),axis=0)\n    tabla = np.transpose(tabla)\n    dfinita = np.zeros(shape=(n,n),dtype=float)\n    tabla = np.concatenate((tabla,dfinita), axis=1)\n    n,m = np.shape(tabla)\n    # Calcular tabla de Diferencias Finitas\/Divididas\n    diagonal = n-1 # derecha a izquierda\n    j = 3  # inicia en columna 3\n    while (j &lt; m): # columna\n        tabla_etiq.append(prefijo&#x5B;0]+str(j-2)+prefijo&#x5B;1])\n        # paso = j-2 # inicia en 1\n        i = 0 # fila\n        while (i &lt; diagonal): # antes de diagonal\n            tabla&#x5B;i,j] = tabla&#x5B;i+1,j-1]-tabla&#x5B;i,j-1]\n \n            if tipo=='divididas':\n                # denominador = xi&#x5B;i+paso]-xi&#x5B;i]\n                denominador = xi&#x5B;i+j-2]-xi&#x5B;i]\n                tabla&#x5B;i,j] = tabla&#x5B;i,j]\/denominador\n                 \n            if abs(tabla&#x5B;i,j])&lt;casicero: # casicero revisa\n                    tabla&#x5B;i,j]=0\n            i = i + 1\n        diagonal = diagonal - 1\n        j = j + 1\n             \n    if vertabla==True:\n        np.set_printoptions(precision)\n        print('Tabla de Diferencias',tipo)\n        print(&#x5B;tabla_etiq])\n        print(tabla)\n    return(&#x5B;tabla, tabla_etiq])\n \n# PROGRAMA ---------------------\n# PROCEDIMIENTO\ncasicero = 1e-12\n# Vectores como arreglo, numeros reales\nxi = np.array(xi,dtype=float)\nfi = np.array(fi,dtype=float)\nn = len(xi)\n \nxi_ascendente,msj = revisa_orden(xi)\nh_iguales,msj_h = tramos_equidistantes(xi, casicero = casicero)\nif len(msj_h)&gt;0: \n    msj.extend(msj_h) # mensajes de error unificados\ntablaDif = diferencias_tabla(xi,fi,tipo=tipo_tabla,\n                              vertabla=True, casicero = casicero)\ntabla = tablaDif&#x5B;0]\ntabla_etiq = tablaDif&#x5B;1]\n\ndfinita = tabla&#x5B;0,3:] # diferencias finitas\nh = xi&#x5B;1] - xi&#x5B;0]     # suponer tramos equidistantes\n \n# polinomio con diferencias Finitas Avanzadas\/Divididas\nx = sym.Symbol('x')\npolinomio = fi&#x5B;0] +0*x # sym.S.Zero en Sympy\nfor i in range(1,n,1):\n    factor = dfinita&#x5B;i-1] # diferencias divididas\n    if tipo_tabla=='finitas': # diferencias Finitas Avanzadas\n        denominador = math.factorial(i)*(h**i)\n        factor = factor\/denominador\n    termino = 1\n    for j in range(0,i,1):\n        termino = termino*(x-xi&#x5B;j])\n    polinomio = polinomio + termino*factor\n \npolisimple = polinomio.expand() # simplifica los (x-xi)\npx = sym.lambdify(x,polisimple) # evaluacion numerica\n \n# SALIDA\nprint('xi_ascendente:',xi_ascendente)\nprint('tramos xi Equidistantes:',h_iguales)\nif len(msj)&gt;0: # mensajes de error\n    print('Revisar tramos, d1x:',np.diff(xi,1))\n    for unmsj in msj:\n        print('Tramos',unmsj&#x5B;0],\n              'desde i:',unmsj&#x5B;1])\nelse:\n    print('Tramo h:',h)\n \nprint('d'+tipo_tabla+': ')\nprint(dfinita)\nprint('polinomio: ')\n#print(polinomio)\nterminos = sym.Add.make_args(polinomio)\nn_term = len(terminos)\nfor i in range(0,n_term,1):\n    if i&lt;(n_term-1):\n        print(terminos&#x5B;i],'+')\n    else:\n        print(terminos&#x5B;i])\nprint()\nprint('polinomio simplificado: ' )\nprint(polisimple)\nprint('p(x):')\nsym.pprint(polisimple)\n<\/pre><\/div>\n\n\n<p>Como el bloque de gr\u00e1fica se usa en otros m\u00e9todos de la unidad, se incorpora la verificaci\u00f3n de lista de errores 'msj' usando el bloque 'try-except'.<\/p>\n\n\n\n<p>La gr\u00e1fica se genera considerando el tipo de interpolaci\u00f3n que se ha seleccionado. Tambi\u00e9n se ajusta el t\u00edtulo acorde al tipo de tabla seleccionada en el bloque de ingreso.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA --------------\nimport matplotlib.pyplot as plt\n\nmuestras = 21  # resoluci\u00f3n gr\u00e1fica\ntitulo = 'Interpolaci\u00f3n: Diferencias '\nif tipo_tabla == 'finitas':\n    titulo = titulo + 'Finitas Avanzadas'\nif tipo_tabla == 'divididas':\n    titulo = titulo + 'Divididas de Newton'\n    \na = np.min(xi) # intervalo &#x5B;a,b]\nb = np.max(xi)\nxk = np.linspace(a,b,muestras)\nyk = px(xk)\n\nplt.plot(xi,fi,'o', label='&#x5B;xi,fi]')\nplt.plot(xk,yk, label='p(x)')\n\ntry: # existen mensajes de error\n    msj_existe = len(msj)\nexcept NameError:\n    msj = &#x5B;]\n    \nif len(msj)&gt;0 and tipo_tabla == 'finitas': # tramos con error\n    untipo = msj&#x5B;0]&#x5B;0]\n    donde = msj&#x5B;0]&#x5B;1] # indice error\n    plt.plot(xi&#x5B;donde:donde+2],fi&#x5B;donde:donde+2],'ro',label=untipo)\n    plt.plot(xi&#x5B;donde:donde+2],fi&#x5B;donde:donde+2],'r--')\n\n# entorno de grafica\nplt.xlabel('xi')\nplt.ylabel('fi')\nplt.legend()\nplt.title(titulo)\nplt.tight_layout()\nplt.show()\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><a href=\"#concepto\">Dif_Finitas Avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ejercicio\">Ejercicio<\/a><\/p>\n\n\n\n<p><a href=\"#analitico\">Anal\u00edtico<\/a><\/p>\n\n\n\n<p><a href=\"#algoritmo\">Algoritmo<\/a><\/p>\n\n\n\n<p><a href=\"#grafica\">gr\u00e1fica<\/a><\/p>\n\n\n\n<p><a href=\"#funcion\">funci\u00f3n<\/a><br><a name=\"concepto\"><\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>Dif_Finitas Avanzadas Ejercicio Anal\u00edtico Algoritmo gr\u00e1fica funci\u00f3n 1. Interpolaci\u00f3n por Diferencias finitas avanzadas Referencia: Rodr\u00edguez 6.6.4 p221, Burden 9Ed p129 Se usa en interpolaci\u00f3n cuando los puntos en el \"eje x\" se encuentran igualmente espaciados, la diferencia entre puntos consecutivos xi es una constante denominada h. h = xi+1 - xi Una relaci\u00f3n entre derivadas [&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":[38],"tags":[],"class_list":["post-557","post","type-post","status-publish","format-standard","hentry","category-mn-u04"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/557","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=557"}],"version-history":[{"count":25,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/557\/revisions"}],"predecessor-version":[{"id":23368,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/557\/revisions\/23368"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=557"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=557"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}