{"id":534,"date":"2017-07-02T09:00:08","date_gmt":"2017-07-02T14:00:08","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/matg1013\/?p=534"},"modified":"2026-02-20T08:10:35","modified_gmt":"2026-02-20T13:10:35","slug":"polinomio-interpola-vandermonde","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u04\/polinomio-interpola-vandermonde\/","title":{"rendered":"4.1 Polinomio de interpolaci\u00f3n con Vandermonde en 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>Interpolaci\u00f3n:<\/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=\"#libreria\">librer\u00eda<\/a><br><a name=\"ejercicio\"><\/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>: Rodr\u00edguez 6.1 p191, Chapra 18.3 p520<\/p>\n\n\n\n<p>Unir <strong>n<\/strong> puntos en el plano usando un polinomios de interpolaci\u00f3n se puede realizar con un polinomio de grado (<strong>n<\/strong>-1).<\/p>\n\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\/interpolavandermonde_animado.gif\" alt=\"interpolar con polinomio, matriz de Vandermonde gr\u00e1fico animado\" class=\"wp-image-13448\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><th>x<sub>i<\/sub><\/th><td>0<\/td><td>0.2<\/td><td>0.3<\/td><td>0.4<\/td><\/tr><tr><th>f<sub>i<\/sub><\/th><td>1<\/td><td>1.6<\/td><td>1.7<\/td><td>2.0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Por ejemplo, dados los <strong>4<\/strong> puntos en la tabla [xi,fi] se requiere generar un polinomio de grado <strong>3<\/strong> de la forma:<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p(x) = a_0 x^3 + a_1 x^2 + a_2 x^1 + a_3 <\/span>\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>Interpolaci\u00f3n:<\/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=\"#libreria\">librer\u00eda<\/a><br><a name=\"ejercicio\"><\/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\">2. Desarrollo Anal\u00edtico<\/h2>\n\n\n\n<p>Es posible generar un sistema de ecuaciones para p(x) haciendo que pase por cada uno de los puntos o coordenadas.<br>Por ejemplo si se toma el primer punto con x<sub>i<\/sub>=0 y f<sub>i<\/sub>=1 se establece la ecuaci\u00f3n:<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p(0) = 1 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> a_0 (0)^3 + a_1 (0)^2 + a_2 (0)^1 + a_3 = 1 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p(0.2) = 1.6 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> a_0 (0.2)^3 + a_1 (0.2)^2 + a_2 (0.2)^1 + a_3 = 1.6 <\/span>\n\n\n\n<p>Note que ahora las inc\u00f3gnitas son los coeficientes <strong>a<\/strong><sub>i<\/sub>. Luego se contin\u00faa con los otros puntos seleccionados hasta completar las ecuaciones necesarias para el grado del polinomio seleccionado.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> a_0 (0.0)^3 + a_1 (0.0)^2 + a_2 (0.0)^1 + a_3 = 1.0 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> a_0 (0.2)^3 + a_1 (0.2)^2 + a_2 (0.2)^1 + a_3 = 1.6 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> a_0 (0.3)^3 + a_1 (0.3)^2 + a_2 (0.3)^1 + a_3 = 1.7 <\/span>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> a_0 (0.4)^3 + a_1 (0.4)^2 + a_2 (0.4)^1 + a_3 = 2.0 <\/span>\n\n\n\n<p>El sistema obtenido se resuelve con alguno de los m\u00e9todos conocidos para la <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mnumericos\/mn-unidades\/mn-unidad-3\/\" data-type=\"page\" data-id=\"13023\">Soluci\u00f3n a sistemas de ecuaciones<\/a>, que requieren escribir las ecuaciones en la forma de matriz A y vector B, desarrollar la matriz aumentada, pivotear por filas, etc.<\/p>\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> \\begin{pmatrix} 0.0^3 &amp; 0.0^2 &amp; 0.0^1 &amp; 1 \\\\ 0.2^3 &amp; 0.2^2 &amp; 0.2^1 &amp; 1 \\\\ 0.3^3 &amp; 0.3^2 &amp; 0.3^1 &amp; 1 \\\\ 0.4^3 &amp; 0.4^2 &amp; 0.4^1 &amp; 1 \\end{pmatrix} . \\begin{pmatrix} a_0 \\\\ a_1 \\\\ a_2 \\\\ a_3 \\end{pmatrix} = \\begin{pmatrix} 1.0 \\\\ 1.6 \\\\ 1.7 \\\\ 2.0 \\end{pmatrix} <\/span>\n\n\n\n<p>La matriz <strong>A<\/strong> tambi\u00e9n se conoce como Matriz Vandermonde <strong>D<\/strong>, que se construye observando que los coeficientes se elevan al exponente referenciado al \u00edndice columna pero de derecha a izquierda. La \u00faltima columna tiene valores 1 por tener como coeficiente el valor de xi<sup>0<\/sup>.<\/p>\n\n\n\n<p>Para enfocarnos en la interpolaci\u00f3n, en la soluci\u00f3n se propone usar un algoritmo o funci\u00f3n en Python, obteniendo el siguiente resultado:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>los coeficientes del polinomio: \n&#091; 41.66666667 -27.5          6.83333333   1.        ]<\/code><\/pre>\n\n\n\n<p>a partir del cual que se construye el polinomio con los valores obtenidos.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Polinomio de interpolaci\u00f3n p(x): \n41.66666666667*x**3 - 27.5*x**2 + 6.83333333333*x + 1.0<\/code><\/pre>\n\n\n\n<p>que re-escrito es,<\/p>\n\n\n\n<span class=\"wp-katex-eq katex-display\" data-display=\"true\"> p(x) = 41.6666 x^3 - 27.5 x^2 + 6.8333 x + 1<\/span>\n\n\n\n<p>Se realiza&nbsp; la gr\u00e1fica de p(x) dentro del intervalo de los datos del ejercicio y se obtiene la l\u00ednea cont\u00ednua que pasa por cada uno de los puntos.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"592\" height=\"440\" src=\"http:\/\/blog.espol.edu.ec\/algoritmos101\/files\/2017\/07\/interpolapolinomio02.png\" alt=\"interpolar con polinomio 02\" class=\"wp-image-13449\" \/><\/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>Interpolaci\u00f3n:<\/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=\"#libreria\">librer\u00eda<\/a><br><a name=\"ejercicio\"><\/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\">3. 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=\"Polinomio de interpolaci\u00f3n con Vandermonde en Python\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/SkrU-cdDSyM?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>Para desarrollar el ejercicio, se realiza un bloque para construir la matriz A y vector B, usando los vectores que representan los puntos de muestra de la funci\u00f3n o experimento.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>xi = &#091;0,0.2,0.3,0.4]\nfi = &#091;1,1.6,1.7,2.0]<\/code><\/pre>\n\n\n\n<p>Observe que en \u00e9ste caso los datos se dan en forma de lista y se deben convertir hacia arreglos.<\/p>\n\n\n\n<p>La matriz <strong>A<\/strong> o Matriz Vandermonde <strong>D<\/strong>, se construye observando que los coeficientes del vector x<sub>i<\/sub> se elevan al exponente referenciado al \u00edndice columna pero de derecha a izquierda.<\/p>\n\n\n\n<p>Construir el polinomio consiste en resolver el sistema de ecuaciones indicado en la secci\u00f3n anterior. Para simplificar la soluci\u00f3n del sistema, se usa Numpy, que entrega el vector soluci\u00f3n que representan los coeficientes del polinomio de interpolaci\u00f3n.<\/p>\n\n\n\n<p>Para construir la expresi\u00f3n del polinomio, se usa la forma simb\u00f3lica con Sympy, de forma semejante a la usada para construir el <a href=\"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-unidades\/mn-u01\/taylor-polinomio\/\" data-type=\"post\" data-id=\"94\">polinomio de Taylor<\/a>.<\/p>\n\n\n\n<p>Para mostrar el polinomio de una manera m\u00e1s f\u00e1cil de interpretar se usa la instrucci\u00f3n <code>sym.pprint()<\/code>, usada al final del algoritmo.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# El polinomio de interpolaci\u00f3n y Vandermonde\nimport numpy as np\nimport sympy as sym\n\n# INGRESO\nxi = &#x5B;0,0.2,0.3,0.4]\nfi = &#x5B;1,1.6,1.7,2.0]\n\n# PROCEDIMIENTO\n# Matrices como arreglo, numeros reales\nxi = np.array(xi,dtype=float)\nfi = np.array(fi,dtype=float)\nn = len(xi)\n# Matriz Vandermonde D\nD = np.zeros(shape=(n,n),dtype=float)\nfor i in range(0,n,1):\n    for j in range(0,n,1):\n        potencia = (n-1)-j # Derecha a izquierda\n        D&#x5B;i,j] = xi&#x5B;i]**potencia\n\n# Resuelve sistema de ecuaciones A.X=B\ncoeficiente = np.linalg.solve(D,fi)\n\n# Polinomio en forma simb\u00f3lica\nx = sym.Symbol('x')\npolinomio = 0*x   # sym.S.Zero\nfor i in range(0,n,1):\n    potencia = (n-1)-i   # Derecha a izquierda\n    termino = coeficiente&#x5B;i]*(x**potencia)\n    polinomio = polinomio + termino\n\n# polinomio para evaluaci\u00f3n num\u00e9rica\npx = sym.lambdify(x,polinomio)\n\n# SALIDA\nprint('Matriz Vandermonde: ')\nprint(D)\nprint('los coeficientes del polinomio: ')\nprint(coeficiente)\nprint('Polinomio de interpolaci\u00f3n: ')\nprint(polinomio)\nprint('\\n formato pprint')\nsym.pprint(polinomio)\n<\/pre><\/div>\n\n\n<p>con lo que se obtiene el siguiente resultado:<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Matriz Vandermonde: \n&#091;&#091;0.    0.    0.    1.   ]\n &#091;0.008 0.04  0.2   1.   ]\n &#091;0.027 0.09  0.3   1.   ]\n &#091;0.064 0.16  0.4   1.   ]]\nlos coeficientes del polinomio: \n&#091; 41.66666667 -27.5 6.83333333 1. ]\nPolinomio de interpolaci\u00f3n: \n41.66666666667*x**3 - 27.5*x**2 + 6.83333333333*x + 1.0\n\nformato pprint\n                  3         2                           \n41.66666666667*x  - 27.5*x  + 6.83333333333*x + 1.0<\/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>Interpolaci\u00f3n:<\/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=\"#libreria\">librer\u00eda<\/a><br><a name=\"ejercicio\"><\/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\">4. Gr\u00e1fica del polinomio<\/h2>\n\n\n\n<p>Para facilitar la evaluaci\u00f3n num\u00e9rica del <code><strong>polinomio<\/strong><\/code>, se convierte el polinomio a la forma Lambda <code><strong>px<\/strong><\/code>. La gr\u00e1fica se realiza con un n\u00famero de muestras suficientes para suavizar la curva dentro del intervalo [a,b], por ejemplo 21, con lo que se comprueba que la curva pase por todos los puntos de la tabla x<sub>i<\/sub>,f<sub>i<\/sub> dados en el ejercicio.<\/p>\n\n\n\n<p>Instrucciones adicionales al algoritmo para la gr\u00e1fica:<\/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  # muestras = tramos+1\n\na = np.min(xi) # intervalo &#x5B;a,b]\nb = np.max(xi)\nxk = np.linspace(a,b,muestras)\nyk = px(xk)\n\n# Usando evaluaci\u00f3n simb\u00f3lica\n##yk = np.zeros(muestras,dtype=float)\n##for k in range(0,muestras,1):\n##    yin&#x5B;k] = polinomio.subs(x,xk&#x5B;k])\n\nplt.plot(xi,fi,'o', label='&#x5B;xi,fi]')\nplt.plot(xk,yk, label='p(x)')\nplt.xlabel('xi')\nplt.ylabel('fi')\nplt.legend()\nplt.title(polinomio)\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>Interpolaci\u00f3n:<\/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=\"#libreria\">librer\u00eda<\/a><br><a name=\"ejercicio\"><\/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=\"libreria\">5. Vandermonde como funci\u00f3n en librer\u00eda Numpy.vander<\/h2>\n\n\n\n<p>La matriz de Vandermonde se puede crear con Numpy usando la instrucci\u00f3n <code>np.vander(xi,len(xi))<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>&gt;&gt;&gt; import numpy as np\n&gt;&gt;&gt; xi = &#091;0. , 0.2, 0.3, 0.4]\n&gt;&gt;&gt; fi = &#091;1. , 1.6, 1.7, 2. ]\n&gt;&gt;&gt; D = np.vander(xi,len(xi))\n&gt;&gt;&gt; D\narray(&#091;&#091;0.   , 0.   , 0.   , 1.   ],\n       &#091;0.008, 0.04 , 0.2  , 1.   ],\n       &#091;0.027, 0.09 , 0.3  , 1.   ],\n       &#091;0.064, 0.16 , 0.4  , 1.   ]])\n&gt;&gt;&gt; coeficiente = np.linalg.solve(D,fi)\n&gt;&gt;&gt; coeficiente\narray(&#091; 41.66667, -27.5    ,   6.83333,   1.     ])<\/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>Interpolaci\u00f3n:<\/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=\"#libreria\">librer\u00eda<\/a><br><a name=\"ejercicio\"><\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n","protected":false},"excerpt":{"rendered":"<p>Interpolaci\u00f3n: Ejercicio Anal\u00edtico Algoritmo gr\u00e1fica librer\u00eda 1. Ejercicio Referencia: Rodr\u00edguez 6.1 p191, Chapra 18.3 p520 Unir n puntos en el plano usando un polinomios de interpolaci\u00f3n se puede realizar con un polinomio de grado (n-1). xi 0 0.2 0.3 0.4 fi 1 1.6 1.7 2.0 Por ejemplo, dados los 4 puntos en la tabla [xi,fi] [&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-534","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\/534","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=534"}],"version-history":[{"count":6,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/534\/revisions"}],"predecessor-version":[{"id":21778,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/534\/revisions\/21778"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=534"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=534"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=534"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}