Ejercicio: 3Eva_IIT2019_T1 Lanzamiento de Cohete
A partir de la tabla del enunciado se realiza la tabla de diferencias finitas.
i |
ti |
fi |
Δfi |
Δ2fi |
Δ3fi |
Δ4fi |
Δ5fi |
1 |
0 |
0 |
32 |
-6 |
0 |
0 |
0 |
2 |
25 |
32 |
26 |
-6 |
0 |
0 |
|
3 |
50 |
58 |
20 |
-6 |
0 |
|
|
4 |
75 |
78 |
14 |
-6 |
|
|
|
5 |
100 |
92 |
8 |
|
|
|
|
6 |
125 |
100 |
|
|
|
|
|
Observando que a partir de la tercera diferencia finita los valores son cero, por lo que se usa la fórmula general de diferencias finitas divididas hasta el polinomio de grado 2.
p_2 (x) = f_0 + \frac{\Delta f_0}{h} (x - x_0) +
+ \frac{\Delta^2 f_0}{2!h^2} (x - x_0)(x - x_1)
al sustituir los valores conocidos, se convierte en,
p_2 (t) =0 + \frac{32}{25} (t -0) +
+ \frac{-6}{2(25)^2} (t -0)(t - 25)
=\frac{32}{25}t + \frac{-3}{(25)^2} (t^2 - 25t)
=\frac{32}{25}t + \frac{-3}{(25)^2} t^2 - \frac{-3}{(25)^2}25t
=\frac{7}{5}t - \frac{3}{625} t^2
y(t) =p_2 (t) =1.4 t - 0.0048 t^2
Con lo que se puede obtener la velocidad:
y'(t) = 1.4 - 0.0096 t
y luego la aceleración:
y''(t) = - 0.0096
Si el error es el próximo término del polinomio Δ3fi entonces se estima en cero.
Tarea: Evaluar la velocidad y aceleración para cada punto de la tabla
La gráfica del polinomio encontrado es:
Algoritmo en Python
El algoritmo realizado en Python entrega los siguientes resultados:
[[ i, ti, fi, df1, df2, df3, df4, df5, df6]]
[[ 1. 0. 0. 32. -6. 0. 0. 0. 0.]
[ 2. 25. 32. 26. -6. 0. 0. 0. 0.]
[ 3. 50. 58. 20. -6. 0. 0. 0. 0.]
[ 4. 75. 78. 14. -6. 0. 0. 0. 0.]
[ 5. 100. 92. 8. 0. 0. 0. 0. 0.]
[ 6. 125. 100. 0. 0. 0. 0. 0. 0.]]
polinomio:
-0.0048*t**2 + 1.4*t
las instrucciones en Python son:
# 3Eva_IIT2019_T1 Lanzamiento de Cohete
# Tarea: Verificar tamaño de vectores
# considerar puntos no equidistantes en eje t
import numpy as np
import matplotlib.pyplot as plt
import sympy as sym
# INGRESO , Datos de prueba
ti = np.array([0.0, 25, 50, 75, 100, 125])
fi = np.array([0.0, 32, 58, 78, 92, 100])
# PROCEDIMIENTO
# Tabla de diferencias finitas
titulo = ['i','ti','fi']
n = len(ti)
# cambia a forma de columnas
i = np.arange(1,n+1,1)
i = np.transpose([i])
ti = np.transpose([ti])
fi = np.transpose([fi])
# Añade matriz de diferencias
dfinita = np.zeros(shape=(n,n),dtype=float)
tabla = np.concatenate((i,ti,fi,dfinita), axis=1)
# Sobre matriz de diferencias, por columnas
[n,m] = np.shape(tabla)
c = 3
diagonal = n-1
while (c<m):
# Aumenta el título para cada columna
titulo.append('df'+str(c-2))
# calcula cada diferencia por fila
f = 0
while (f < diagonal):
tabla[f,c] = tabla[f+1,c-1]-tabla[f,c-1]
f = f+1
diagonal = diagonal - 1
c = c+1
# POLINOMIO con diferencias finitas
# caso: puntos en eje t equidistantes
dfinita = tabla[:,3:]
n = len(dfinita)
t = sym.Symbol('t')
h = ti[1,0]-ti[0,0]
polinomio = fi[0,0]
for c in range(1,n,1):
denominador = np.math.factorial(c)*(h**c)
factor = dfinita[0,c-1]/denominador
termino=1
for f in range(0,c,1):
termino = termino*(t-ti[f])
polinomio = polinomio + termino*factor
# simplifica polinomio, multiplica los (t-ti)
polinomio = polinomio.expand()
# para evaluacion numérica
pt = sym.lambdify(t,polinomio)
# Puntos para la gráfica
a = np.min(ti)
b = np.max(ti)
muestras = 101
ti_p = np.linspace(a,b,muestras)
fi_p = pt(ti_p)
# SALIDA
print([titulo])
print(tabla)
print('polinomio:')
print(polinomio)
# Gráfica
plt.title('Interpolación polinómica')
plt.plot(ti,fi,'o', label = 'Puntos')
plt.plot(ti_p,fi_p, label = 'Polinomio')
plt.legend()
plt.show()