Ejercicio: 1Eva_IIT2007_T3 Interpolación inversa
Para determinar el valor de x, usando interpolación inversa.
f(0.50) = 1.648
f(0.65) = 1.915
f( x ) = 2.117
f(0.80) = 2.225
f(0.95) = 2.5857
Para el algoritmo se intercambian las variables previo a usarlo.
fi = [0.50 , 0.65 , 0.80, 0.95 ] xi = [1.648, 1.915, 2.225, 2.5857 ]
Luego se evalúa en el punto buscado, en éste caso: fi=2.117, obteniendo que x es: 0.750321134121361
Para obtener el polinomio se usa el método de Lagrange:
término 1
L_{0} (x) = \frac{(x-1.915)(x-2.225)(x-2.5857)}{(1.648-1.915)(1.648-2.225)(1.648-2.5857)}término 2
L_{1} (x) = \frac{(x-1.648)(x-2.225)(x-2.5857)}{(1.915-1.648)(1.915-2.225)(1.915-2.5857)}término 3
L_{2} (x) = \frac{(x-1.648)(x-1.915)(x-2.5857)}{(2.225-1.648)(2.225-1.915)(2.225-2.5857)}término 4
L_{3} (x) = \frac{(x-1.648)(x-1.915)(x-2.225)}{(2.5857-1.648)(2.5857-1.915)(2.5857-2.225)}se construye el polinomio usando la fórmula para fn(x) para cada valor fi,
p_3(x) = 0.5 L_{0} (x) + 0.65 L_{1} (x) + 0.8 L_{2} (x) + 0.95 L_{3} (x) p_3(x) = 0.5 \frac{(x-1.915)(x-2.225)(x-2.5857)}{-0.14446112} + +0.65 \frac{(x-1.648)(x-2.225)(x-2.5857)}{0.05551384 } + + 0.8 \frac{(x-1.648)(x-1.915)(x-2.5857)}{-0.06451841} + +0.95 \frac{(x-1.648)(x-1.915)(x-2.225)}{0.22684978} p_3(x) = 0.03588 x^3 - 0.34275 x^2 + 1.44073 x - 1.10404A partir del resultado del algoritmo se puede evaluar p(2.117)
valores de fi: [0.5 0.65 0.8 0.95] divisores en L(i): [-0.14446112 0.05551384 -0.06451841 0.22684978] Polinomio de Lagrange, expresiones -3.46113878334255*(x - 2.5857)*(x - 2.225)*(x - 1.915) + 11.7087921085767*(x - 2.5857)*(x - 2.225)*(x - 1.648) - 12.3995618056856*(x - 2.5857)*(x - 1.915)*(x - 1.648) + 4.18779332775953*(x - 2.225)*(x - 1.915)*(x - 1.648) Polinomio de Lagrange: 0.0358848473081546*x**3 - 0.342756582990933*x**2 + 1.44073214117569*x - 1.10404634485234 >>> polisimple.subs(x,2.117) 0.750321134121178 >>> polisimple 0.0358848473081546*x**3 - 0.342756582990933*x**2 + 1.44073214117569*x - 1.10404634485234 >>>
Algoritmo en Python
# 1Eva_IIT2007_T3 Interpolación inversa # Interpolacion de Lagrange # divisoresL solo para mostrar valores import numpy as np import matplotlib.pyplot as plt import sympy as sym # INGRESO , Datos de prueba fi = [0.50 , 0.65 , 0.80, 0.95 ] xi = [1.648, 1.915, 2.225, 2.5857 ] # PROCEDIMIENTO xi = np.array(xi,dtype=float) fi = np.array(fi,dtype=float) # Polinomio de Lagrange n = len(xi) x = sym.Symbol('x') polinomio = 0 divisorL = np.zeros(n, dtype = float) for i in range(0,n,1): # Termino de Lagrange numerador = 1 denominador = 1 for j in range(0,n,1): if (j!=i): numerador = numerador*(x-xi[j]) denominador = denominador*(xi[i]-xi[j]) terminoLi = numerador/denominador polinomio = polinomio + terminoLi*fi[i] divisorL[i] = denominador # simplifica el polinomio polisimple = polinomio.expand() # Salida print(' valores de fi: ',fi) print('divisores en L(i): ',divisorL) print() print('Polinomio de Lagrange, expresiones') print(polinomio) print() print('Polinomio de Lagrange: ') print(polisimple)
para revisar con la gráfica, se añaden las líneas,
# GRAFICA polinomio = sym.lambdify(x,polisimple) y = np.linspace(1,3,100) pyi= polinomio(y) plt.plot(pyi,y,label='p(x)') plt.plot(fi,xi,'o') plt.axhline(2.117,linestyle='dashed', label='f(x)=2.117', color='green') plt.legend() plt.xlabel('x') plt.ylabel('f(x)') plt.show()