{"id":9948,"date":"2017-07-11T09:45:19","date_gmt":"2017-07-11T14:45:19","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/analisisnumerico\/?p=9948"},"modified":"2026-03-01T10:16:48","modified_gmt":"2026-03-01T15:16:48","slug":"interpolacion-graficos-animados-python","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/algoritmos101\/mn-u04\/interpolacion-graficos-animados-python\/","title":{"rendered":"4.7 M\u00e9todos de interpolaci\u00f3n con gr\u00e1ficos animados 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><a href=\"#dfinitasavanzadas\">Dif_Finitas avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ddivididasnewton\">Dif_Divididas_Newton<\/a><\/p>\n\n\n\n<p><a href=\"#lagrange\">Interpola Lagrange<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p>Solo para fines <strong>did\u00e1cticos<\/strong>, y como complemento para los <strong>ejercicios<\/strong> presentados en la unidad para Interpolaci\u00f3n polin\u00f3mica, se presentan las instrucciones para las animaciones usadas en la presentaci\u00f3n de los conceptos y ejercicios.<strong> Los algoritmos para animaci\u00f3n NO son necesarios para realizar los ejercicios<\/strong>, que requieren una parte anal\u00edtica con al menos tres iteraciones en papel y l\u00e1piz. Se lo adjunta como una herramienta did\u00e1ctica de asistencia para las clases.<\/p>\n\n\n\n<p>En los algoritmos, se convierten las partes en funciones, que se usan para generar los polinomios para cada grado y se incorporan en un gr\u00e1fico animado con los resultados presentados.<\/p>\n\n\n\n<p>Para la gr\u00e1fica animada se a\u00f1aden las instrucciones siguientes:<\/p>\n\n\n\n<p>Se determina el intervalo para el eje x usando los valores m\u00ednimos y m\u00e1ximos del vector xi. Se toma como muestras para el polinomio las suficientes para una l\u00ednea suave, que pueden ser mayores a 21 y se crean los valores para el polinomio en p_xi.<\/p>\n\n\n\n<p>Para cada polinomio se guarda en una tabla los valores px(p_xi)del polinomio evaluado el vector p_xi<\/p>\n\n\n\n<p>La gr\u00e1fica (<code>graf_ani<\/code>) se crea en una ventana (<code>fig_ani<\/code>), inicializando con los puntos [xi,fi] en color rojo, y configurando los par\u00e1metros base para el gr\u00e1fico.<\/p>\n\n\n\n<p>Se usan procedimientos para crear <code>unatrama()<\/code> para cada polinomio y en cada cambio se limpia la trama manteniendo la base con <code>limpiatrama()<\/code>.<\/p>\n\n\n\n<p>En caso de requerir un archivo gif animado se proporciona un nombre de archivo. Para crear el archivo se requiere de la librer\u00eda 'pillow'.<\/p>\n\n\n\n<p>otros ejemplos de animaci\u00f3n en el curso de Fundamentos de Programaci\u00f3n:<\/p>\n\n\n\n<p>Movimiento circular \u2013 Una part\u00edcula, animaci\u00f3n con matplotlib-Python<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dfinitasavanzadas\">Interpolaci\u00f3n por Diferencias Finitas Avanzadas<\/h2>\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\/DifFinAvanz01_anima.gif\" alt=\"diferencias finitas avanzadas con varios puntos gr\u00e1fico animado\" class=\"wp-image-13540\" \/><\/figure>\n\n\n\n<p>En la funci\u00f3n para interpolaci\u00f3n se a\u00f1ade la verificaci\u00f3n de tama\u00f1os de paso equidistantes o iguales. En el caso de no tener tama\u00f1os de paso equidistantes<\/p>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Tabla de Diferencias finitas\n&#091;&#091;'i', 'xi', 'fi', 'd1f', 'd2f']]\n&#091;&#091;0.   0.1  1.45 0.15 0.  ]\n &#091;1.   0.2  1.6  0.   0.  ]]\nxi_ascendente: True\ntramos xi Equidistantes: True\nTramo h: 0.1\n\nTabla de Diferencias finitas\n&#091;&#091;'i', 'xi', 'fi', 'd1f', 'd2f', 'd3f']]\n&#091;&#091; 0.    0.1   1.45  0.15 -0.05  0.  ]\n &#091; 1.    0.2   1.6   0.1   0.    0.  ]\n &#091; 2.    0.3   1.7   0.    0.    0.  ]]\nxi_ascendente: True\ntramos xi Equidistantes: True\nTramo h: 0.1\n\nTabla 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\n\nPolinomios con Diferencias Finitas Avanzadas\npx_0 =\n1.45\n\npx_1 =\n1.5\u22c5x + 1.3\n\npx_2 =\n       2                \n- 2.5\u22c5x  + 2.25\u22c5x + 1.25\n\npx_3 =\n         3         2               \n41.6667\u22c5x  - 27.5\u22c5x  + 6.8333\u22c5x + 1<\/code><\/pre>\n\n\n\n<p>El resumen de las instrucciones se presentan a continuaci\u00f3n.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Interpolaci\u00f3n grafica animada.gif\n#   - Diferencias finitas avanzadas\n#   - Diferencias finitas divididas\n# Tarea: Verificar tama\u00f1o de vectores,\nimport numpy as np\nimport math\nimport sympy as sym\n \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     \n    msj = &#x5B;] # mensajes de error\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\ndef redondea_coef(ecuacion, precision=6,casicero = 1e-15):\n    ''' redondea coeficientes de t\u00e9rminos suma de una ecuacion\n    '''\n    tipo = type(ecuacion)\n    tipo_eq = False\n    if tipo == sym.core.relational.Equality:\n        RHS = ecuacion.rhs\n        ecuacion = ecuacion.lhs\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\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)):\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    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)):\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    if tipo == float: # si es entero\n        if (abs(ecuacion)%1)&lt;casicero: \n            ecuacion = int(ecuacion)\n    if tipo_eq:\n        ecuacion = sym.Eq(ecuacion,RHS)\n    return(ecuacion)\n\n# PROGRAMA ----------------------------\n\n# INGRESO , Datos de prueba\nxi = &#x5B;0.10, 0.2, 0.3, 0.4]\nfi = &#x5B;1.45, 1.6, 1.7, 2.0]\n\ntipo_tabla = 'finitas' # 'divididas'\nvertabla = True\nprecision = 4\n \n# PROCEDIMIENTO\ncasicero = 1e-12\n# Vectores como arreglo, numeros reales\nxi = np.array(xi,dtype=float)\nfi = np.array(fi,dtype=float)\n\n# tabla polinomios\nn = len(xi)\npx_tabla = &#x5B;fi&#x5B;0]]\nfor grado in range(1,n,1):\n    xj = xi&#x5B;:grado+1]\n    fj = fi&#x5B;:grado+1]\n    m = len(xj)\n    xi_ascendente,msj = revisa_orden(xj)\n    h_iguales,msj_h = tramos_equidistantes(xj, casicero = casicero)\n    if len(msj_h)&gt;0:\n        msj.extend(msj_h)\n    tabla,titulo = diferencias_tabla(xj,fj,tipo=tipo_tabla,\n                                 vertabla=vertabla, casicero = casicero)\n    dfinita = tabla&#x5B;0,3:] # diferencias finitas\n    h = xj&#x5B;1] - xj&#x5B;0]     # suponer tramos equidistantes\n     \n    # polinomio con diferencias Finitas Avanzadas\/ divididas\n    x = sym.Symbol('x')\n    polinomio = fj&#x5B;0] +0*x # sym.S.Zero en Sympy\n    for i in range(1,m,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-xj&#x5B;j])\n        polinomio = polinomio + termino*factor\n     \n    polisimple = polinomio.expand() # simplifica los (x-xi)\n    px = sym.lambdify(x,polisimple) # evaluacion numerica\n\n    try: # intenta redondear coeficientes a precisiion    \n        polisimple = redondea_coef(polisimple, precision,casicero)\n    except NameError:\n        print(&quot;redondea_coef() no se encuentra definida.&quot;)\n    \n    px_tabla.append(polisimple)\n\n    if vertabla==True:\n        print('xi_ascendente:',xi_ascendente)\n        print('tramos xi Equidistantes:',h_iguales)\n        if 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])\n        else:\n            print('Tramo h:',h)\n        print('',)\n \n# SALIDA\nif tipo_tabla == 'finitas':\n    print('Polinomios con Diferencias Finitas Avanzadas')\nif tipo_tabla == 'divididas':\n    print('Polinomios con Diferencias Divididas Newton')\nfor grado in range(0,n,1):\n    print('px_'+str(grado)+' =') #, px_tabla&#x5B;grado])\n    sym.pprint(px_tabla&#x5B;grado])\n    print()\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<p>Parte adicional para la gr\u00e1fica con GIF animado<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# GRAFICA CON ANIMACION polinomios --------\nimport matplotlib.pyplot as plt\nimport matplotlib.animation as animation\n\nif tipo_tabla == 'finitas': \n    unmetodo = 'Diferencias Finitas Avanzadas'\n    narchivo = 'DifFinitasAvz' # nombre archivo\nif tipo_tabla == 'divididas':\n    unmetodo = 'Diferencias Divididas Newton'\n    narchivo = 'DifDividNewton' # nombre archivo\n\nmuestras = 51 # de cada p(X)\n \n# Puntos para la gr\u00e1fica\na = np.min(xi)\nb = np.max(xi)\np_xi = np.linspace(a,b,muestras)\n \n# lineas por grado de polinomio\nx = sym.Symbol('x')\npx_lineas = np.zeros(shape=(n,muestras), dtype=float)\nfor grado in range(0,n,1):\n    polinomio = px_tabla&#x5B;grado]\n    px = sym.utilities.lambdify(x,polinomio,'numpy')\n    px_lineas&#x5B;grado] = px(p_xi)\n \n# Parametros de trama\/foto\nretardo = 800   # milisegundos entre tramas\ntramas = len(px_lineas)\nymax = np.max(fi)\nymin = np.min(fi)\ndeltax = 0.1*np.abs(b-a)\ndeltay = 0.1*np.abs(ymax-ymin)\n \n# GRAFICA animada en fig_ani\nfig_ani, graf_ani = plt.subplots()\n# Funci\u00f3n Base\nfx_linea, = graf_ani.plot(xi,fi,'o',color='red')\n# Polinomios de px_tabla grado = 0\npx_unalinea, = graf_ani.plot(p_xi, px_lineas&#x5B;0],\n                         label='grado: 0')\n# Configura gr\u00e1fica\ngraf_ani.set_xlim(&#x5B;a-deltax,b+deltax])\ngraf_ani.set_ylim(&#x5B;ymin-deltay,ymax+deltay])\ngraf_ani.axhline(0, color='k')  # Linea horizontal en cero\ngraf_ani.set_title('Polinomio - '+unmetodo)\ngraf_ani.set_xlabel('x')\ngraf_ani.set_ylabel('p(x)')\ngraf_ani.grid()\n \n# Cuadros de texto en gr\u00e1fico\ntxt_x = (b+a)\/2\ntxt_y = ymax\ntxt_poli = graf_ani.text(txt_x, txt_y,'p(x):',\n                      horizontalalignment='center')\ntxt_grado = graf_ani.text(txt_x, txt_y-deltay,'grado:',\n                        horizontalalignment='center')\n# Nueva Trama\ndef unatrama(i,p_xi,pxi): \n    # actualiza cada linea\n    px_unalinea.set_xdata(p_xi)\n    px_unalinea.set_ydata(pxi&#x5B;i])\n    unpolinomio = px_tabla&#x5B;i]\n    if unpolinomio == sym.S.NaN:\n        unpolinomio = 'h pasos no equidistantes'\n    etiquetap = 'p'+str(i)+'(x) = '+str(unpolinomio)\n    px_unalinea.set_label(etiquetap)\n    # actualiza texto\n    txt_poli.set_text(etiquetap)\n    txt_grado.set_text('Grado: '+str(i))\n    # color de la l\u00ednea\n    if (i&lt;=9):\n        lineacolor = 'C'+str(i)\n    else:\n        numerocolor = i%10\n        lineacolor = 'C'+str(numerocolor)\n    px_unalinea.set_color(lineacolor)\n     \n    return (px_unalinea, txt_poli, txt_grado)\n# Limpia Trama anterior\ndef limpiatrama(): \n    px_unalinea.set_ydata(np.ma.array(p_xi, mask=True))\n    px_unalinea.set_label('')\n    txt_poli.set_text('')\n    txt_grado.set_text('')\n    return (px_unalinea,txt_poli, txt_grado)\n \n# Trama contador\ni = np.arange(0,tramas,1)\nani = animation.FuncAnimation(fig_ani,\n                              unatrama,\n                              i ,\n                              fargs = (p_xi,px_lineas),\n                              init_func = limpiatrama,\n                              interval = retardo,\n                              blit=True)\n# Graba Archivo GIFAnimado y video\nani.save(narchivo+'_GIFanimado.gif', writer='pillow')\n# ani.save(narchivo+'_video.mp4')\nplt.draw()\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=\"#dfinitasavanzadas\">Dif_Finitas avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ddivididasnewton\">Dif_Divididas_Newton<\/a><\/p>\n\n\n\n<p><a href=\"#lagrange\">Interpola Lagrange<\/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=\"ddivididasnewton\">Interpolaci\u00f3n por Diferencias Divididas de Newton<\/h2>\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\/DifDivididasNewton_GIFanimado.gif\" alt=\"DifDivididasNewton_GIFanimado.gif\" class=\"wp-image-13606\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Tabla de Diferencias divididas\n&#091;&#091;'i', 'xi', 'fi', 'F&#091;1]', 'F&#091;2]']]\n&#091;&#091;0.   0.1  1.45 1.5  0.  ]\n &#091;1.   0.2  1.6  0.   0.  ]]\nxi_ascendente: True\ntramos xi Equidistantes: True\nTramo h: 0.1\n\nTabla de Diferencias divididas\n&#091;&#091;'i', 'xi', 'fi', 'F&#091;1]', 'F&#091;2]', 'F&#091;3]']]\n&#091;&#091; 0.    0.1   1.45  1.5  -2.5   0.  ]\n &#091; 1.    0.2   1.6   1.    0.    0.  ]\n &#091; 2.    0.3   1.7   0.    0.    0.  ]]\nxi_ascendente: True\ntramos xi Equidistantes: True\nTramo h: 0.1\n\nTabla de Diferencias divididas\n&#091;&#091;'i', 'xi', 'fi', 'F&#091;1]', 'F&#091;2]', 'F&#091;3]', 'F&#091;4]']]\n&#091;&#091; 0.    0.1   1.45  1.5  -2.5   5.    0.  ]\n &#091; 1.    0.2   1.6   1.    0.    0.    0.  ]\n &#091; 2.    0.3   1.7   1.    0.    0.    0.  ]\n &#091; 3.    0.6   2.    0.    0.    0.    0.  ]]\nxi_ascendente: True\ntramos xi Equidistantes: False\nRevisar tramos, d1x: &#091;0.1 0.1 0.3]\nTramos no equidistantes desde i: 2\n\nPolinomios con Diferencias Divididas Newton\npx_0 =\n1.45\n\npx_1 =\n1.5\u22c5x + 1.3\n\npx_2 =\n       2                \n- 2.5\u22c5x  + 2.25\u22c5x + 1.25\n\npx_3 =\n   3        2               \n5\u22c5x  - 5.5\u22c5x  + 2.8\u22c5x + 1.22\n&gt;&gt;&gt; <\/code><\/pre>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n\n<p>Se actualiza la secci\u00f3n de ingreso del programa, para obtener el resultado mostrado.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# PROGRAMA ----------------------------\n\n# INGRESO , Datos de prueba\nxi = &#x5B;0.10, 0.2, 0.3, 0.6]\nfi = &#x5B;1.45, 1.6, 1.7, 2.0]\n\ntipo_tabla = 'divididas' # 'divididas'\nvertabla = True\nprecision = 4\n<\/pre><\/div>\n\n\n<p>Para la gr\u00e1fica animada se usa el mismo bloque de instrucciones del m\u00e9todo de Diferencias Finitas avanzadas, solo requiere cambiar el nombre del m\u00e9todo y el nombre para el archivo GIF animado.<\/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=\"#dfinitasavanzadas\">Dif_Finitas avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ddivididasnewton\">Dif_Divididas_Newton<\/a><\/p>\n\n\n\n<p><a href=\"#lagrange\">Interpola Lagrange<\/a><\/p>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"lagrange\">Interpolaci\u00f3n por el M\u00e9todo de Lagrange<\/h2>\n\n\n\n<pre class=\"wp-block-code alignwide\"><code>Interpola con Lagrange\n 1.45 * (x - 0.4)*(x - 0.3)*(x - 0.2) \/ (-0.2 + 0.1)*(-0.3 + 0.1)*(-0.4 + 0.1) \n+ 1.6 * (x - 0.4)*(x - 0.3)*(x - 0.1) \/ (-0.1 + 0.2)*(-0.3 + 0.2)*(-0.4 + 0.2) \n+ 1.7 * (x - 0.4)*(x - 0.2)*(x - 0.1) \/ (-0.1 + 0.3)*(-0.2 + 0.3)*(-0.4 + 0.3) \n+ 2.0 * (x - 0.3)*(x - 0.2)*(x - 0.1) \/ (-0.1 + 0.4)*(-0.2 + 0.4)*(-0.3 + 0.4) \npolinomio simplificado\n41.666667*x**3 - 27.5*x**2 + 6.833333*x + 1.0\nInterpolaci\u00f3n con Lagrange\n41.666667*x**3 - 27.5*x**2 + 6.833333*x + 1.0\n&gt;&gt;&gt; \n<\/code><\/pre>\n\n\n\n<p>Instrucciones en Python<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code alignwide\"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n# Interpolaci\u00f3n - Lagrange\n# Tarea: Verificar tama\u00f1o de vectores,\nimport numpy as np\nimport sympy as sym\n\ndef interpola_Lagrange(xi,fi,vertabla=False,\n                       precision=6, casicero = 1e-15):\n    '''\n    Interpolaci\u00f3n con m\u00e9todo de Lagrange\n    resultado: polinomio en forma simb\u00f3lica\n    '''\n    xi = np.array(xi,dtype=float)\n    fi = np.array(fi,dtype=float)\n    n = len(xi)\n    x = sym.Symbol('x')\n    # Polinomio con Lagrange\n    if vertabla==True:\n        print('Interpola con Lagrange')\n    polinomio = sym.S.Zero\n    for i in range(0,n,1):\n        # Termino de Lagrange\n        termino = 1\n        numerador = 1\n        denominador = 1\n        for j  in range(0,n,1):\n            if (j!=i):\n                numerador = numerador*(x-xi&#x5B;j])\n                denominador = denominador*(sym.UnevaluatedExpr(xi&#x5B;i])-xi&#x5B;j])\n        if vertabla==True:\n            txt0='' ; txt1='('; txt2=')'\n            if i&gt;0:\n                txt0='+'\n            if n&gt;2:\n                txt1=''; txt2=''\n            print(txt0,fi&#x5B;i],'*'+txt1,numerador,txt2+'\/'+ txt1,\n                  denominador,txt2)\n        #factor = np.around(fi&#x5B;i]\/float(denominador.doit()),precision) \n        polinomio = polinomio + (fi&#x5B;i]\/denominador.doit())*numerador\n    # Expande el polinomio\n    polisimple = polinomio.expand()\n    polisimple = redondea_coef(polisimple, precision)\n    if vertabla==True:\n        print('polinomio simplificado')\n        print(polisimple)\n    return(polisimple)\n\ndef redondea_coef(ecuacion, precision=6,casicero = 1e-15):\n    ''' redondea coeficientes de t\u00e9rminos suma de una ecuacion\n    '''\n    tipo = type(ecuacion)\n    tipo_eq = False\n    if tipo == sym.core.relational.Equality:\n        RHS = ecuacion.rhs\n        ecuacion = ecuacion.lhs\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\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)):\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    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)):\n                factor = np.around(float(factor),precision)\n                print(factor)\n                if (abs(factor)%1)&lt;casicero: # si es entero\n                    factor = int(factor)\n            producto = producto*factor\n        ecuacion = producto\n    if tipo == float: # si es entero\n        if (abs(ecuacion)%1)&lt;casicero: \n            ecuacion = int(ecuacion)\n    if tipo_eq:\n        ecuacion = sym.Eq(ecuacion,RHS)\n    return(ecuacion)\n\n# INGRESO , Datos de prueba\nxi = &#x5B;0.10, 0.2, 0.3, 0.4]\nfi = &#x5B;1.45, 1.6, 1.7, 2.0]\n\n# PROCEDIMIENTO\n# tabla polinomios\npolisimple = interpola_Lagrange(xi,fi,vertabla=True)\n\n# SALIDA\nprint('Interpolaci\u00f3n con Lagrange')\nprint(polisimple)\n<\/pre><\/div>\n\n\n<p>Para la gr\u00e1fica animada se usa el mismo bloque de instrucciones del m\u00e9todo de Diferencias Finitas avanzadas, solo requiere cambiar el nombre del m\u00e9todo y el nombre para el archivo GIF animado.<\/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=\"#dfinitasavanzadas\">Dif_Finitas avanzadas<\/a><\/p>\n\n\n\n<p><a href=\"#ddivididasnewton\">Dif_Divididas_Newton<\/a><\/p>\n\n\n\n<p><a href=\"#lagrange\">Interpola Lagrange<\/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 Dif_Divididas_Newton Interpola Lagrange Solo para fines did\u00e1cticos, y como complemento para los ejercicios presentados en la unidad para Interpolaci\u00f3n polin\u00f3mica, se presentan las instrucciones para las animaciones usadas en la presentaci\u00f3n de los conceptos y ejercicios. Los algoritmos para animaci\u00f3n NO son necesarios para realizar los ejercicios, que requieren una parte anal\u00edtica con [&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-9948","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\/9948","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=9948"}],"version-history":[{"count":10,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/9948\/revisions"}],"predecessor-version":[{"id":21839,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/posts\/9948\/revisions\/21839"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/media?parent=9948"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/categories?post=9948"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/algoritmos101\/wp-json\/wp\/v2\/tags?post=9948"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}