{"id":565,"date":"2017-07-05T09:20:18","date_gmt":"2017-07-05T14:20:18","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/matg1013\/?p=565"},"modified":"2026-04-04T07:06:54","modified_gmt":"2026-04-04T12:06:54","slug":"diferencias-divididas-newton","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u04\/diferencias-divididas-newton\/","title":{"rendered":"4.2.2 Interpolaci\u00f3n por Diferencias divididas de Newton (\u0394x) 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_Divididas_Newton<\/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><\/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. Diferencias divididas de Newton<\/h2>\n\n\n\n<p><em><strong>Referencia<\/strong><\/em>: Chapra 18.1.3 p508, Rodr\u00edguez 6.7 p223, Burden 9Ed 3.3 p124.<\/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\/DifDividNewton02_ani.gif\" alt=\"Diferencia Dividida de Newton ejemplo gr\u00e1fica animada\" class=\"wp-image-21841\" \/><\/figure>\n\n\n\n<p>El m\u00e9todo se usa en el caso que los puntos en el \"eje <strong>x<\/strong>\" se encuentran <em><strong>espaciados de forma arbitraria<\/strong><\/em> y provienen de una funci\u00f3n desconocida pero supuestamente diferenciable.<\/p>\n\n\n\n<p>La n-\u00e9sima diferencia dividida finita es:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> f[x_{n}, x_{n-1}, \\text{...}, x_{1}, x_{0}] = \\frac{f[x_{n}, x_{n-1}, \\text{...}, x_{1}]- f[x_{n-1}, x_{n-2}, \\text{...}, x_{0}]}{x_{n}-x_{0}} <\/span>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1292\" height=\"803\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/diferenciasDivididas_ani.gif\" alt=\"Diferencias Divididas gr\u00e1fico animado\" class=\"wp-image-23381\" \/><\/figure>\n\n\n\n<p>Para lo cual se debe interpretar la tabla de diferencias divididas, tambi\u00e9n como una aproximaci\u00f3n a una derivada:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>i<\/th><th>x<sub>i<\/sub><\/th><th><br>f[x<sub>i<\/sub>]<\/th><th>Primero<\/th><th>Segundo<\/th><th>Tercero<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>x<sub>0<\/sub><\/td><td>f[x<sub>0<\/sub>]<\/td><td>f[x<sub>1<\/sub>,x<sub>0<\/sub>]<\/td><td>f[x<sub>2<\/sub>,x<sub>1<\/sub>,x<sub>0<\/sub>]<\/td><td>f[x<sub>3<\/sub>,x<sub>2<\/sub>,x<sub>1<\/sub>,x<sub>0<\/sub>]<\/td><\/tr><tr><td>1<\/td><td>x<sub>1<\/sub><\/td><td>f[x<sub>1<\/sub>]<\/td><td>f[x<sub>2<\/sub>,x<sub>1<\/sub>]<\/td><td>f[x<sub>3<\/sub>,x<sub>2<\/sub>,x<sub>1<\/sub>]<\/td><td>&nbsp;<\/td><\/tr><tr><td>2<\/td><td>x<sub>2<\/sub><\/td><td>f[x<sub>2<\/sub>]<\/td><td>f[x<sub>3<\/sub>,x<sub>2<\/sub>]<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><tr><td>3<\/td><td>x<sub>2<\/sub><\/td><td>f[x<sub>3<\/sub>]<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>En la f\u00f3rmula del polinomio, las diferencias divididas sirven para evaluar los coeficientes de cada t\u00e9rmino adicional para aumentar el grado. Semejante al proceso realizado para&nbsp; \"diferencias finitas divididas\":<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">f_n(x) = f(x_0)+(x-x_0)f[x_1,x_0] +<\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">+ (x-x_0)(x-x_1)f[x_2,x_1,x_0] + \\text{...}+<\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">+ (x-x_0)(x-x_1)\\text{...}(x-x_{n-1})f[x_n,x_{n-1},\\text{...},x_0]<\/span>\n\n\n\n<p>Este polinomio de interpolaci\u00f3n se conoce como de Newton en diferencias divididas.<\/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\/DifDividNewton02_ani.gif\" alt=\"Diferencia Dividida de Newton ejemplo gr\u00e1fica animada\" class=\"wp-image-21841\" \/><\/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_Divididas_Newton<\/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><\/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><strong><em>Referencia<\/em><\/strong>: <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-eval\/mn-1e2010\/1eva2008tii_t3_mn-ganancia-en-inversion\/\" data-type=\"post\" data-id=\"486\">1Eva2008TII_T3_MN Ganancia en inversi\u00f3n<\/a><\/p>\n\n\n\n<p>Se dispone de los datos (<strong>x<\/strong>, <strong>f<\/strong>(<strong>x<\/strong>)), en donde <strong>x<\/strong> es un valor de inversi\u00f3n y <strong>f<\/strong>(<strong>x<\/strong>) es un valor de ganancia, ambos en miles de d\u00f3lares:<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-table aligncenter\"><table><thead><tr><th>inversi\u00f3n<\/th><th>ganancia<\/th><\/tr><\/thead><tbody><tr><td>3.2<\/td><td>5.12<\/td><\/tr><tr><td>3.8<\/td><td>6.42<\/td><\/tr><tr><td>4.2<\/td><td>7.25<\/td><\/tr><tr><td>4.5<\/td><td>6.85<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"313\" height=\"313\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/inversionGanancia01.png\" alt=\"inversi\u00f3n Ganancia 01\" class=\"wp-image-13545\" style=\"width:250px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Considere que los valores invertidos en materia prima para producci\u00f3n, dependen de la demanda de del producto en el mercado, motivo por el que los valores de inversi\u00f3n <strong><em>no guardan distancias equidistantes entre si<\/em><\/strong>.<\/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_Divididas_Newton<\/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><\/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 toman los datos de la tabla como arreglos para el algoritmo<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>xi = &#091;3.2 , 3.8 , 4.2 , 4.5 ]\nfi = &#091;5.12, 6.42, 7.25, 6.85]<\/code><\/pre>\n\n\n\n<p>Con los datos se llena la tabla de diferencias divididas, donde por simplicidad, se escriben las operaciones en cada casilla. La \u00faltima columna o cuarta diferencia dividida es cero por no disponer de datos para hacer el c\u00e1lculo.<\/p>\n\n\n\n<figure class=\"wp-block-table alignwide\"><table><thead><tr><th>i<\/th><th><br>x<sub>i<\/sub><\/th><th><br>f[x<sub>i<\/sub>]<\/th><th><br>Primero<\/th><th>Segundo<\/th><th>Tercero<\/th><\/tr><\/thead><tbody><tr><td>0<\/td><td>3.2<\/td><td>5.12<\/td><td><span class=\"wp-katex-eq\" data-display=\"false\"> \\frac{6.42-5.12}{3.8-3.2} =2.1667<\/span><\/td><td><span class=\"wp-katex-eq\" data-display=\"false\"> \\frac{2.075-2.1667}{4.2-3.2} =-0.0917<\/span><\/td><td><span class=\"wp-katex-eq\" data-display=\"false\"> \\frac{-4.869-(-0.0917)}{4.5-3.2} =-3.6749<\/span><\/td><\/tr><tr><td>1<\/td><td>3.8<\/td><td>6.42<\/td><td><span class=\"wp-katex-eq\" data-display=\"false\"> \\frac{7.25-6.42}{4.2-3.8} =2.075<\/span><\/td><td><span class=\"wp-katex-eq\" data-display=\"false\"> \\frac{-1.3333-2.075}{4.5-3.8} =-4.869<\/span><\/td><td>&nbsp;<\/td><\/tr><tr><td>2<\/td><td>4.2<\/td><td>7.25<\/td><td><span class=\"wp-katex-eq\" data-display=\"false\"> \\frac{6.85-7.25}{4.5-4.2} =-1.3333<\/span><\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><tr><td>3<\/td><td>4.5<\/td><td>6.85<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><td>&nbsp;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Las diferencias divididas de la primera fila son los valores usados para la expresi\u00f3n del polinomio de interpolaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ddividida = tabla&#091;0,3:] \n          = &#091; 2.1667, -0.0917, -3.6749, 0. ]<\/code><\/pre>\n\n\n\n<p>La expresi\u00f3n del polinomio inicia con el primer valor de la funci\u00f3n f(x0).<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x) = f_0 = 5.12 <\/span>\n\n\n\n<p>se calcula el primer t\u00e9rmino usando el factor de la primera diferencia dividida y se a\u00f1ade a la expresi\u00f3n del polinomio.<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> t\u00e9rmino = (x-x_0)f[x1,x0] = (x-3.2)2.1667 <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x) = 5.12 + 2.1667(x-3.2) <\/span>\n\n\n\n<p>con el siguiente valor de ddividida[] se procede de manera semejante:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> t\u00e9rmino = (x-x_0)(x-x_1)f[x1,x0] = <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> = (x-3.2)(x-3.8)(-0.0917)<\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x) = 5.12 + 2.1667(x-3.2)+ <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> + (-0.0917)(x-3.2)(x-3.8) <\/span>\n\n\n\n<p>Realizando el c\u00e1lculo del tercer y \u00faltimo termino con diferencias divididas,&nbsp; el polinomio obtenido es:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x) = 5.12 + 2.1667(x-3.2) + <\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> + (-0.0917)(x-3.2)(x-3.8) +<\/span>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\">+ (-3.6749)(x - 3.2)(x - 3.8)(x - 4.2) <\/span>\n\n\n\n<p>que simplificando al multiplicar entre los t\u00e9rminos (x-xi):<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p_3(x) = 184.7569 - 149.9208 x + 41.0673 x^2 - 3.6749 x^3 <\/span>\n\n\n\n<p>El polinomio en el intervalo de xi, en la gr\u00e1fica muestra que pasa por todos los puntos.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"554\" height=\"437\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/DiferenciasDivididas02.png\" alt=\"Diferencias Divididas 02\" class=\"wp-image-13546\" \/><\/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_Divididas_Newton<\/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><\/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 Divididas de Newton en Python\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/5uZnyhMMo0Y?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 algoritmo para&nbsp; interpolaci\u00f3n de <strong>Diferencias Divididas<\/strong> o Newton, considera reutilizar el procedimiento de c\u00e1lculo de diferencias finitas incorporando la parte del denominador.<\/p>\n\n\n\n<p>La creaci\u00f3n de la expresi\u00f3n del polinomio tambi\u00e9n es semejante a la usada para diferencias finitas avanzadas.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; highlight: [30,31,32,33,34,35,36,40,47,51,52,53,54]; title: ; notranslate\" title=\"\">\n# Diferencias Divididas de Newton\n# Tarea: verificar tama\u00f1o de vectores\nimport numpy as np\nimport sympy as sym\n  \n# INGRESO, Datos de prueba\nxi = &#x5B;3.2 , 3.8 , 4.2 , 4.5 ]\nfi = &#x5B;5.12, 6.42, 7.25, 6.85]\n\ntitulo = 'Interpolaci\u00f3n Diferencias Divididas - Newton'\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 Divididas\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 Divididas\ndiagonal = n-1 # derecha a izquierda\nj = 3  # inicia en columna 3\nwhile (j &lt; m): # columna\n    tabla_etiq.append('F&#x5B;'+str(j-2)+']') \n    i = 0 # fila de columna\n    paso = j-2 # inicia en 1\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        denominador = (xi&#x5B;i+paso]-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# Polinomio de Diferencias Divididas de Newton\nn = len(xi)\nx = sym.Symbol('x')\ndDividida = tabla&#x5B;0,3:] # diferencias Divididas\npolinomio = fi&#x5B;0] +0*x # en Sympy\nfor j in range(1,n,1):\n    factor = dDividida&#x5B;j-1]\n    termino = 1\n    for k in range(0,j,1):\n        termino = termino*(x-xi&#x5B;k])\n    polinomio = polinomio + termino*factor\n     \npolisimple = sym.expand(polinomio)\n \npx = sym.lambdify(x,polisimple)\n \n# SALIDA\nprint('Tabla Diferencia Dividida-Newton')\nprint(&#x5B;tabla_etiq])\nprint(tabla)\nprint('dDividida: ')\nprint(dDividida)\nprint(titulo)\nprint('polinomio: ')\nprint(polinomio)\nprint('polisimple: ')\nprint(polisimple)\nprint('p(x):')\nsym.pprint(polisimple)\n<\/pre><\/div>\n\n\n<p>El resultado del algoritmo se muestra a continuaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Tabla Diferencia Dividida-Newton\n&#091;&#091;'i   ', 'xi  ', 'fi  ', 'F&#091;1]', 'F&#091;2]', 'F&#091;3]', 'F&#091;4]']]\n&#091;&#091; 0.   3.2    5.12    2.1667 -0.0917 -3.6749  0.   ]\n &#091; 1.   3.8    6.42    2.075  -4.869   0.      0.   ]\n &#091; 2.   4.2    7.25   -1.3333  0.      0.      0.   ]\n &#091; 3.   4.5    6.85    0.      0.      0.      0.   ]]\ndDividida: \n&#091; 2.1667 -0.0917 -3.6749  0.    ]\npolinomio: \n2.16666666666667*x - 3.67490842490842*(x-4.2)*(x-3.8)*(x-3.2)\n - 0.0916666666666694*(x - 3.8)*(x - 3.2) - 1.81333333333334\npolinomio simplificado: \n-3.67490842490842*x**3 + 41.0673076923077*x**2 \n- 149.920860805861*x + 184.756923076923\n\np(x):\n                    3                     2                                   \n- 3.67490842490842\u22c5x  + 41.0673076923077\u22c5x  - 149.920860805861\u22c5x + 184.756923076923\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_Divididas_Newton<\/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><\/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>Se incorpora la parte gr\u00e1fica para observar los resultados en el intervalo xi, con el n\u00famero de muestras = 101 para tener una buena resoluci\u00f3n de la l\u00ednea del polinomio.<\/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<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_Divididas_Newton<\/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><\/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, la gr\u00e1fica es la misma que para el algoritmo sin funciones anterior<\/p>\n\n\n\n<p>El bloque de salida es semejante al resultado anterior.<\/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;3.2 , 3.8 , 4.2 , 4.5 ]\nfi = &#x5B;5.12, 6.42, 7.25, 6.85]\n  \ntipo_tabla = 'divididas' # 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>La gr\u00e1fica se genera considerando el tipo de interpolaci\u00f3n que se ha seleccionado:<\/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_Divididas_Newton<\/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><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>Dif_Divididas_Newton Ejercicio Anal\u00edtico Algoritmo gr\u00e1fica funci\u00f3n 1. Diferencias divididas de Newton Referencia: Chapra 18.1.3 p508, Rodr\u00edguez 6.7 p223, Burden 9Ed 3.3 p124. El m\u00e9todo se usa en el caso que los puntos en el \"eje x\" se encuentran espaciados de forma arbitraria y provienen de una funci\u00f3n desconocida pero supuestamente diferenciable. La n-\u00e9sima diferencia dividida [&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-565","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\/565","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=565"}],"version-history":[{"count":20,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/565\/revisions"}],"predecessor-version":[{"id":23384,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/565\/revisions\/23384"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=565"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=565"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=565"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}