[ Dif_Finitas ] [ Dif_Finitas Avanzadas] [ Dif_Divididas_Newton ]
..
1. Diferencias finitas
Referencia: Rodríguez 6.5 p211, Chapra 18.1.3 p509
Establece relaciones simples entre los puntos dados que describen la función f(x). Las tabla de diferencias finitas es un elemento base para varios métodos de interpolación, por lo que se trata como un tema inicial.
Para un ejemplo se toman los siguientes puntos:
xi | 0.10 | 0.2 | 0.3 | 0.4 |
fi | 1.45 | 1.6 | 1.7 | 2.0 |
La tabla de diferencias finitas se construye tomando los datos y sus índices como parte de las primeras columnas.
i | xi | fi | Δ1fi | Δ2fi | Δ3fi | Δ4fi |
0 | 0.1 | 1.45 | 0.15 | -0.05 | 0.25 | 0. |
1 | 0.2 | 1.6 | 0.1 | 0.2 | 0. | 0. |
2 | 0.3 | 1.7 | 0.3 | 0. | 0. | 0. |
3 | 0.4 | 2.0 | 0. | 0. | 0. | 0. |
Cada casilla de diferencia finita Δjfi se obtiene restando los dos valores consecutivos de la columna anterior. Por ejemplo, para la primera columna:
\Delta ^1 f_0 = 1.6-1.45 = 0.15 \Delta ^1 f_1 = 1.7-1.6 = 0.1 \Delta ^1 f_2 = 2.0-1.7 = 0.3y la siguiente Δ1f3 no es posible calcular.
Siguiendo el mismo procedimiento se calculan los valores de la siguiente columna Δ2fi como las diferencias de la columna anterior, así sucesivamente.
\Delta ^2 f_0 = 0.1-0.15 = -0.05 \Delta ^2 f_1 = 0.3-0.1 = 0.2 \Delta ^3 f_0 = 0.2-(-0.05) = 0.25Si la función f(x) de donde provienen los datos es un polinomio de grado n, entonces la n-ésima diferencia finita será una constante, y las siguientes diferencias se anularán.
[ Dif_Finitas ] [ Dif_Finitas Avanzadas] [ Dif_Divididas_Newton ]
2. Algoritmo en Python
Para crear la tabla de diferencias finitas, las primeras columnas requieren concatenar los valores de los índice i, xi y fi.
xi = np.array([0.10, 0.2, 0.3, 0.4]) fi = np.array([1.45, 1.6, 1.7, 2.0])
Los índices i se crean en un vector ki, pues la variable i es usada como fila en matrices, por lo que evitamos confundirlas al usar la variable.
A la matriz con las tres columnas descritas, se le añade a la derecha una matriz de nxn para calcular las diferencias.
Se calculan las diferencias para cada columna, realizando la operación entre los valores de cada fila. Considere que no se realizan cálculos desde la diagonal hacia abajo en la tabla, los valores quedan como cero.
Al final se muestra el título y el resultado de la tabla.
# Tabla de Diferencias finitas # resultado en: [título,tabla] # Tarea: verificar tamaño de vectores import numpy as np # INGRESO, Datos de prueba xi = np.array([0.10, 0.2, 0.3, 0.4]) fi = np.array([1.45, 1.6, 1.7, 2.0]) # PROCEDIMIENTO # Tabla de Diferencias Finitas titulo = ['i','xi','fi'] n = len(xi) ki = np.arange(0,n,1) tabla = np.concatenate(([ki],[xi],[fi]),axis=0) tabla = np.transpose(tabla) # diferencias finitas vacia dfinita = np.zeros(shape=(n,n),dtype=float) tabla = np.concatenate((tabla,dfinita), axis=1) # Calcula tabla, inicia en columna 3 [n,m] = np.shape(tabla) diagonal = n-1 j = 3 while (j < m): # Añade título para cada columna titulo.append('df'+str(j-2)) # cada fila de columna i = 0 while (i < diagonal): tabla[i,j] = tabla[i+1,j-1]-tabla[i,j-1] i = i + 1 diagonal = diagonal - 1 j = j + 1 # SALIDA print('Tabla Diferencia Finita: ') print([titulo]) print(tabla)
el resultado de aplicar el algoritmo es:
Tabla Diferencia Finita: [['i', 'xi', 'fi', 'df1', 'df2', 'df3', 'df4']] [[ 0. 0.1 1.45 0.15 -0.05 0.25 0. ] [ 1. 0.2 1.6 0.1 0.2 0. 0. ] [ 2. 0.3 1.7 0.3 0. 0. 0. ] [ 3. 0.4 2. 0. 0. 0. 0. ]] >>>
3. Gráfica de puntos con líneas horizontales
Para tener una referencia visual sobre las primeras diferencias finitas, en una gráfica se trazan las líneas horizontales que pasan por cada punto. Para las segundas diferencias se debe graficar las primeras diferencias finitas vs xi repitiendo el proceso. Las líneas de distancia se añadieron con un editor de imágenes.
Las instrucciones adicionales al algoritmo anterior para añadir la gráfica son:
# Gráfica import matplotlib.pyplot as plt for i in range(0,n,1): plt.axhline(fi[i],ls='--', color='yellow') plt.plot(xi,fi,'o', label = 'Puntos') plt.legend() plt.xlabel('xi') plt.ylabel('fi') plt.title('Diferencia Finita') plt.show()
[ Dif_Finitas ] [ Dif_Finitas Avanzadas] [ Dif_Divididas_Newton ]