Taller interpolación

  1. Programe el algoritmo para encontrar los polinomios interpolador para n puntos usando diferencias divididas de Newton
  • Sea los siguientes puntos
\(x_i\) 0.10000 0.30000& 0.50000
\(y_i\) -1.377000 0.061000 1.875000
  • Encuentre el polinomio que interpola estos puntos usando un sistema de ecuaciones
  • Encuentre el polinomio interpolador usando polinomios de Lagrange
  • Encuentre la solución usando diferencias divididas de Newton
  1. Sea los siguientes puntos
\(x_i\) 0.10000 0.30000 0.50000 0.70000
\(y_i\) -1.380000 -0.020000 1.500000 3.180000
  • Encuentre la solución usando diferencias divididas de Newton
  • ¿Por qué en este caso \(a_3=0\)? Justifique su respuesta
  1. Sea los siguientes puntos
\(x_i\) 0.01 -0.01 0.1 -0.1 1 -1
\(y_i\) -0.50637 0.50637 -0.54402 0.54402 0.84147 -0.84147
  • Encuentre el polinomio que interpola estos puntos usando un sistema de ecuaciones generado por una matriz
  • Encuentre la solución usando diferencias divididas de Newton
  • Grafique el polinomio obtenido en cada uno de los puntos anteriores
  • Compare esa gráfica con \(f(x)=1/\sin(x)\)
  1. Sea \(f(x)=\sin(x)\), si queremos interpolar esta función en el intervalo \([0,\pi]\) para los puntos \(x_i=0, \frac{1}{4}\pi, \frac{1}{2}\pi,\frac{3}{4}\pi\) y \(\pi\). Encuentre el error del polinomio en ese intervalo. ¿Considera que ese polinomio es una buena aproximación de la función \(f(x)\)?. Justifique su respuesta.

  2. Describa que el fenómeno Runge. De un ejemplo del método Runge.

  3. Consulte el siguiente comando la librería. Úselo para interpolar el punto 4 y compare sus respuestas. ¿Cómo obtendría el valor de \(f(0.2)\)?

  4. Observe los siguientes puntos

import numpy as np
import matplotlib.pyplot as plt

plt.style.use('seaborn-poster')

# generate x and y
x = np.linspace(0, 1, 101)
y = 1 + x + x * np.random.random(len(x))

# plot the results
plt.figure(figsize = (10,8))
plt.plot(x, y, 'b.')

plt.xlabel('x')
plt.ylabel('y')
plt.show()

Note que es tienen un comportamiento lineal, Encuentre una recta que minimice el error cuadrático de los puntos dados. Para ello el método de cuadrados mínimos. Encuentre la magnitud del error.

\[||y-\hat{y}||_2\] donde \(y\) es el vector de los puntos dados y \(\hat{y}\) es el vector de los puntos estimados.

  1. Observe los siguientes puntos
import numpy as np
import matplotlib.pyplot as plt

plt.style.use('seaborn-poster')

# let's generate x and y, and add some noise into y
x = np.linspace(0, 10, 101)
y = 0.1*np.exp(0.3*x) + 0.1*np.random.random(len(x))

# Let's have a look of the data
plt.figure(figsize = (10,8))
plt.plot(x, y, 'b.')
plt.xlabel('x')
plt.ylabel('y')
plt.show()

Note que tiene un comportamiento de la forma

\[y=ae^{bx}\]

este sistema lo podemos linealizar tomando logaritmos

\[\ln(y)=\ln(a)+bx\]

Encuentre una recta que minimice el error cuadrático de los puntos dados. Para ello el método de cuadrados mínimos y grafique su respuesta en el mismo gráfico de los puntos dados. Encuentre la magnitud del error.

\[||y-\hat{y}||_2\] donde \(y\) es el vector de los puntos dados y \(\hat{y}\) es el vector de los puntos estimados.

  1. Ejemplo con datos reales.

Vamos a usar los datos de pingüinos, los cuales se encuentran pre-cargados en la librería searbosn y que nos permiten analizar la relación entre la longitud del pico y la masa corporal de los pingüinos. En la librearía seaborn podemos encontrar información de tres tipos de especies y en donde podemos analizar las siguientes variables: * bill_length_mm: longitud del pico en milímetros * bill_depth_mm: profunidad del pico en milímetros * flipper_length_mm: longitud de las alas en milímetros * body_mass_g: masa corporal en gramos * species: especie de pingüino

import numpy as np
from scipy.stats import norm 
import pandas as pd 
import seaborn as sns
import matplotlib.pyplot as plt

%matplotlib inline
plt.rcParams['figure.figsize'] = (20, 10)
plt.style.use('ggplot')

import warnings
warnings.filterwarnings('ignore')
df = sns.load_dataset("penguins")
type(df) # note que df es un objeto de tipo DataFrame  de pandas
# para visualizar el encabezado del DataFrame
df.head()
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
0 Adelie Torgersen 39.1 18.7 181.0 3750.0 Male
1 Adelie Torgersen 39.5 17.4 186.0 3800.0 Female
2 Adelie Torgersen 40.3 18.0 195.0 3250.0 Female
3 Adelie Torgersen NaN NaN NaN NaN NaN
4 Adelie Torgersen 36.7 19.3 193.0 3450.0 Female
# para visualizar el tamaño del DataFrame
print('Total de elementos ',df.size)

# para visualizar el número de filas y columnas del DataFrame
print('Número de filas y columnas',df.shape)
Total de elementos  2408
Número de filas y columnas (344, 7)

para visualizar los datos estadísticos básicos del DataFrame

df.describe()

# aqui primero debemos mirar si hay datos faltantes
print(df.isnull()) # esto nos devuelve un DataFrame de booleanos
# aqui imprime si el dato es  faltante o no
print(df.isnull().sum()) # esto nos devuelve la suma de los valores faltantes por columna
     species  island  bill_length_mm  bill_depth_mm  flipper_length_mm  \
0      False   False           False          False              False   
1      False   False           False          False              False   
2      False   False           False          False              False   
3      False   False            True           True               True   
4      False   False           False          False              False   
..       ...     ...             ...            ...                ...   
339    False   False            True           True               True   
340    False   False           False          False              False   
341    False   False           False          False              False   
342    False   False           False          False              False   
343    False   False           False          False              False   

     body_mass_g    sex  
0          False  False  
1          False  False  
2          False  False  
3           True   True  
4          False  False  
..           ...    ...  
339         True   True  
340        False  False  
341        False  False  
342        False  False  
343        False  False  

[344 rows x 7 columns]
species               0
island                0
bill_length_mm        2
bill_depth_mm         2
flipper_length_mm     2
body_mass_g           2
sex                  11
dtype: int64
# para manipular la  base de datos debemos hacer una copia

df1 = df.copy()
#vamos a buscar los datos faltantes en la columna "body_mass_g"
print(df1['body_mass_g'].isnull().sum()) # esto nos devuelve la suma de los valores faltantes por columna
2
#vamos a ver la fila de los datos faltantes en la columna "body_mass_g"
print(df1[df1['body_mass_g'].isnull()])
    species     island  bill_length_mm  bill_depth_mm  flipper_length_mm  \
3    Adelie  Torgersen             NaN            NaN                NaN   
339  Gentoo     Biscoe             NaN            NaN                NaN   

     body_mass_g  sex  
3            NaN  NaN  
339          NaN  NaN  

Necesitamos buscar alguna estrategia para estudiar los datos, por ejemplo, podemos rellenarlos con el promedio, o podemos omitir esos datos, o podemos usar la regresión lineal para estimar los valores faltantes (Note que para buscar una estrategia siempre es dependiente al problema). Para este caso vamos a omitir los datos faltantes.

# eliminar la fila con los datos faltantes
df1.dropna(subset=['body_mass_g'], inplace=True)
print(df1.isnull().sum()) # esto nos devuelve la suma de los valores faltantes por columna
print(df1.shape) # para visualizar el número de filas y columnas del DataFrame
species              0
island               0
bill_length_mm       0
bill_depth_mm        0
flipper_length_mm    0
body_mass_g          0
sex                  9
dtype: int64
(342, 7)

Vamos a estudiar la relación entre la longitud del pico y la masa corporal de los pingüinos. Para ello vamos a ver si existe una relación lineal entre estas dos variables. Una forma básica de estudiar dicha relación es hacer un primer gráfico de dispersión de los datos.

by=df1["body_mass_g"] # extraemos la columna body_mass_g
bl=df1["bill_length_mm"] # extraemos la columna bill_length_mm

plt.scatter(by, bl)
plt.xlabel("body mass grams")
plt.ylabel("bill length mm")
plt.title("Relationship between body mass and bill length")
plt.show()

Encuentre una recta que minimice el error cuadrático de los puntos dados. Para ello el método de cuadrados mínimos y grafique su respuesta en el mismo gráfico de los puntos dados. Encuentre la magnitud del error.

\[||y-\hat{y}||_2\] donde \(y\) es el vector de los puntos dados y \(\hat{y}\) es el vector de los puntos estimados.

  1. Estudie la librería numpy para resolver el problema anterior. Compare sus resultados.