{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Contenido bajo licencia Creative Commons BY 4.0 y código bajo licencia MIT. © Juan Gómez y Nicolás Guarín-Zapata 2020. Este material es parte del curso Modelación Computacional en el programa de Ingeniería Civil de la Universidad EAFIT." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Interpolación de Lagrange en 1D" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introducción" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El problema de interpolación o de predecir funciones a partir de un número determinado de datos representativos de la función aparece con bastante frecuencia en la interpretación de datos experimentales. De otro lado, las técnicas de aproximación de funciones por medio de métodos de interpolación son la base para la formulación de los métodos más importantes de la mecánica computacional como lo son los elementos finitos y los elementos de frontera. En este Notebook se discutirán algunos aspectos básicos y fundamentales de la teoría de interpolación. El notebook se describe en términos del desarrollo completo de un problema ejemplo incluyendo su implementación en Python.\n", "\n", "**Al completar este notebook usted debería estar en la capacidad de:**\n", "\n", "* Reconocer el problema de interpolación de funciones como uno de aproximación de una función desconocida en términos de valores discretos de la misma función.\n", "\n", "* Identificar las propiedades fundamentales de los polinomios de interpolación de Lagrange.\n", "\n", "* Usar polinomios de interpolación de Lagrange para proponer aproximaciones a una función dado un conjunto de $N$ valores conocidos de la misma.\n", "\n", "* Reconocer la diferencia entre variables primarias y secundarias en un esquema de interpolación." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Interpolación de Lagrange\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El problema de interpolación consiste en la determinación del valor de una función $f(x)$ en un punto arbitrario $x \\in [x_1, x_n]$, dados valores conocidos de la función al interior de un dominio de solución. De acuerdo con el teorema de interpolación de Lagrange la aproximación $\\hat f(x)$ a la función $f(x)$ se construye como:\n", "\n", "\\begin{equation}\n", "\\hat{f}(x) = \\sum_{I=1}^n L_I(x) f_I\n", "\\end{equation}\n", "\n", "donde $L_I$ es el $I-$ésimo polinomio de orden $n-1$ y $f_1, f_2, \\cdots, f_n$ son los $n$ valores conocidos de la función. El $I-$ésimo polinomio de Lagrange se calcula siguiendo la siguiente expresión:\n", "\n", "\\begin{equation}\n", "{L_I}(x) = \\prod_{J=1, J \\ne I}^{n} \\frac{(x - x_J)}{(x_I - x_J)}\\, .\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Primera derivada" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En varios problemas de ingeniería es necesario usar técnicas de interpolación para encontrar valores de las derivadas de la variable primaria o principal. Por ejemplo, en problemas de mecánica de sólidos y teoría de elasticidad, en los cuales la variable primaria es el campo de desplazamientos, uno puede estar interesado en determinar las deformaciones unitarias las cuales son derivadas espaciales de los desplazamientos. Considerando que solo se dispone de valores discretos de los desplazamientos se tiene que las derivadas que se requieren se pueden encontrar usando estos valores discretos. Lo anterior equivale a derivar $\\hat{f}(x)$ directamente como sigue:\n", "\n", "\n", "\\begin{equation}\n", "\\frac{\\mathrm{d}\\hat{f}}{\\mathrm{d}x}=\\frac{\\mathrm{d}L_I(x)}{\\mathrm{d}x}f_I\n", "\\end{equation}\n", "\n", "Haciendo,\n", "\n", "$$B_I(x) = \\frac{\\mathrm{d}L_I(x)}{\\mathrm{d}x}\\, ,$$\n", "\n", "podemos escribir el esquema de interpolación como:\n", "\n", "\\begin{equation}\n", "\\frac{\\mathrm{d}\\hat{f}}{\\mathrm{d}x} = \\sum_{I=1}^n B_I(x) f_I\\, .\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ejemplo\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Formule un esquema de interpolación para encontrar un valore de la función\n", "\n", "\\begin{equation}\n", "f(x) = x^3 + 4x^2 - 10\n", "\\end{equation}\n", "\n", "en un punto arbitrario $x$ en el intervalo $[ -1, 1]$ asumiendo que se conoce el valor exacto de la función en los puntos $x=-1.0$, $x=+1.0$ y $x=0.0.$\n", "\n", "En este ejemplo se conoce la función y aparentemente no tiene mucho sentido buscar una aproximación de la misma resolviendo un problema de interpolación. Sin embargo es conveniente seleccionar una función conocida para poder asimilar el problema numérico y sus limitaciones. En este contexto asumiremos que en una aplicación real conocemos los valores de la función en un conjunto de puntos $x=-1.0$, $x=+1.0$ and $x=0.0$ los cuales se denominan puntos nodales o simplemente _nodos_.\n", "\n", "El proceso de interpolación involucra 2 pasos fundamentales: \n", "\n", "1. Determinar los polinomios de interpolación $L_I$ usando la productoria.\n", "\n", "2. Usar la combinación lineal para construir el polinomio interpolante o la aproximación a la función $\\hat f(x)$.\n", "\n", "Veamos estos pasos entonces.\n", "\n", "1. Considerando que tenemos 3 puntos _nodales_ necesitamos generar 3 polinomios de interpolación de segundo orden, cada uno de ellos asociado a cada punto nodal. Rotulemos los _nodos_ como $x_0 = -1.0$, $x_1 = +1.0$ y $x_2 = 0.0$. De acuerdo con esta denominación $L_0(x)$, $L_1(x)$ y $L_2(x)$ serán los polinomios de interpolación de segundo orden asociados a los puntos nodales $x_0 = -1.0$, $x_1 = +1.0$ y $x_2 = 0.0$. Usando la fórmula de la productoria tenemos:\n", "\n", "\\begin{align}\n", "&L_0(x) = \\frac{(x - x_1)(x - x_2)}{(x_0 - x_1)(x_0 - x_2)} \\equiv \\frac{1}{2}(x - 1.0)x\\\\\n", "&L_1(x) = \\frac{(x-x^0)(x-x^2)}{(x^1-x^0)(x^1-x^2)}\\equiv\\frac12(x+1.0)x\\\\\n", "&L_2(x) = \\frac{(x-x^0)(x-x^1)}{(x^2-x^0)(x^2-x^1)}\\equiv-(x+1.0)(x-1.0)\\, .\n", "\\end{align}\n", "\n", "2. Para llegar a la aproximación final de la función realizamos la combinación lineal:\n", "\n", "\\begin{equation}\n", "\\hat{f}(x) = L_0(x)f_0 + L_1(x)f_1 + L_2(x)f_2\n", "\\end{equation}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "