s3Eva_2024PAOII_T2 Interpolar trayectoria helicóptero

Ejercicio: 3Eva_2024PAOII_T2 Interpolar trayectoria helicóptero

xi = [0.  , 2.50, 3.75, 5.00, 6.25, 7.5 ]
yi = [3.7 , 3.25, 4.05, 4.33, 2.95, 3.22]

literal a

Según la gráfica presentada, los puntos a considerar para todo el intervalo, deberían ser al menos el primero y el último. Para un polinomio de grado 3 se requieren usar 4 muestras, por lo que faltarían dos muestras dentro del intervalo. Los puntos adicionales estarían entre los puntos intermedios, tratando de mantener una distancia equidistante entre ellos y tratar de mantener los cambios de dirección.

helicoptero Interpola 01

Los puntos seleccionados para el ejercicio serán

xi = [0. , 2.50, 5.00, 7.5 ]
fi = [3.7 , 3.25, 4.33, 3.22]

Se puede construir el polinomio con los cualquiera de los métodos para interpolación dado que tienen tamaños de paso iguales entre tramos.

Desarrollando con el método de Lagrange, el polinomio se construye como:

término 1

L0(x)=(x2.5)(x5.0)(x7.5)(02.5)(05.0)(07.5) L_{0} (x) = \frac{(x-2.5)(x-5.0)(x-7.5)}{(0-2.5)(0-5.0)(0-7.5)}

término 2

L1(x)=(x0)(x5.0)(x7.5)(2.50)(2.55.0)(2.57.5) L_{1} (x) = \frac{(x-0)(x-5.0)(x-7.5)}{(2.5-0)(2.5-5.0)(2.5-7.5)}

término 3

L2(x)=(x0)(x2.5)(x7.5)(50)(52.5)(57.5) L_{2} (x) = \frac{(x-0)(x-2.5)(x-7.5)}{(5-0)(5-2.5)(5-7.5)}

término 4

L3(x)=(x0)(x2.5)(x5)(7.50)(7.52.5)(7.55) L_{3} (x) = \frac{(x-0)(x-2.5)(x-5)}{(7.5-0)(7.5-2.5)(7.5-5)}

se construye el polinomio usando la fórmula para fn(x) para cada valor fi,

p3(x)=3.7(x2.5)(x5.0)(x7.5)(02.5)(05.0)(07.5) p_3(x) = 3.7 \frac{(x-2.5)(x-5.0)(x-7.5)}{(0-2.5)(0-5.0)(0-7.5)} +3.25(x0)(x5.0)(x7.5)(2.50)(2.55.0)(2.57.5) + 3.25 \frac{(x-0)(x-5.0)(x-7.5)}{(2.5-0)(2.5-5.0)(2.5-7.5)} +4.33(x0)(x2.5)(x7.5)(50)(52.5)(57.5) + 4.33 \frac{(x-0)(x-2.5)(x-7.5)}{(5-0)(5-2.5)(5-7.5)} +3.22(x0)(x2.5)(x5)(7.50)(7.52.5)(7.55) + 3.22 \frac{(x-0)(x-2.5)(x-5)}{(7.5-0)(7.5-2.5)(7.5-5)}

simplificando con Sympy:

Polinomio de Lagrange, expresiones
0.104*x*(x - 7.5)*(x - 5.0) - 0.13856*x*(x - 7.5)*(x - 2.5) + 0.0343466666666667*x*(x - 5.0)*(x - 2.5) - 0.0394666666666667*(x - 7.5)*(x - 5.0)*(x - 2.5)

Polinomio de Lagrange: 
-0.03968*x**3 + 0.42*x**2 - 0.982*x + 3.7
p3(x)=3.70.982x+0.42x20.03968x3 p_3(x) = 3.7 - 0.982x + 0.42 x^2 -0.03968 x^3

literal b

Para verificar que el polinomio pasa por los puntos, se puede usar una gráfica o al menos dos puntos usados para crear el polinomio:

p3(2.5)=3.70.982(2.5)+0.42(2.5)20.03968(2.5)3=3.25 p_3(2.5) = 3.7 - 0.982(2.5) + 0.42 (2.5)^2 -0.03968 (2.5)^3 = 3.25 p3(5)=3.70.982(5)+0.42(5)20.03968(5)3=4.33 p_3(5) = 3.7 - 0.982(5) + 0.42 (5)^2 -0.03968 (5)^3 = 4.33
>>> polisimple
-0.03968*x**3 + 0.42*x**2 - 0.982*x + 3.7
>>> polisimple.subs(x,2.5)
3.25000000000000
>>> polisimple.subs(x,5)
4.33000000000000
>>>

Se comprueba que los valores obtenidos corresponden a las muestras, por lo que el polinomio cumple con los criterios básicos de interpolación. La gráfica permite verificar también el resultado.

helicoptero Interpola 02

literal c

Error en puntos no usados de las muestras

p3(3.75)=3.70.982(3.75)+0.42(3.75)20.03968(3.75)3=3.83125 p_3(3.75) = 3.7 - 0.982(3.75) + 0.42 (3.75)^2 -0.03968 (3.75)^3 = 3.83125

error = |3.83125 – 4.05| = 0.218

p3(6.25)=3.70.982(6.25)+0.42(6.25)20.03968(6.25)3=4.28125 p_3(6.25) = 3.7 - 0.982(6.25) + 0.42 (6.25)^2 -0.03968 (6.25)^3 = 4.28125

error = |4.28125 – 4.05| = 1.3312

literal d

Observando las gráficas de la trayectoria construida junto a las funciones descritas en el tema 1 se tiene que:

Un polinomio de grado 3 es insuficiente para describir la trayectoria, se debe aumentar el grado del polinomio para ajustar mejor la curva.

Por ejemplo, usando todos los puntos, la trayectoria y el polinomio son mas cercanas aunque no iguales.

helicoptero Interpola 03literal e

Encontrar el error en P(5), como x=5 y es parte de los puntos de muestra, el error debería ser cero. Siempre y cuando x=5 sea parte de los puntos seleccionados.

p3(5)=3.70.982(5)+0.42(5)20.03968(5)3=4.33 p_3(5) = 3.7 - 0.982(5) + 0.42 (5)^2 -0.03968 (5)^3 = 4.33

error = | 4.33-4.33| = 0

literal f

Los resultados con el algoritmo de Lagrange se muestran como:

    valores de fi:  [3.7  3.25 4.33 3.22]
divisores en L(i):  [-93.75  31.25 -31.25  93.75]

Polinomio de Lagrange, expresiones
0.104*x*(x - 7.5)*(x - 5.0) - 0.13856*x*(x - 7.5)*(x - 2.5) + 0.0343466666666667*x*(x - 5.0)*(x - 2.5) - 0.0394666666666667*(x - 7.5)*(x - 5.0)*(x - 2.5)

Polinomio de Lagrange: 
-0.03968*x**3 + 0.42*x**2 - 0.982*x + 3.7

Algoritmo en Python

# 3Eva_2024PAOII_T2 Interpolar trayectoria helicóptero
# Interpolacion de Lagrange
# divisoresL solo para mostrar valores
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt

# INGRESO , Datos de prueba
# todos los datos
xj = [0.  , 2.50, 3.75, 5.00, 6.25, 7.5 ]
fj = [3.7 , 3.25, 4.05, 4.33, 2.95, 3.22]

# datos seleccionados
xi = [0.  , 2.50, 5.00, 7.5 ]
fi = [3.7 , 3.25, 4.33, 3.22]

# trayectoria
gx = lambda t: 0.5*t +0 *t
gy = lambda t: np.sin(0.10*t)*np.cos(0.7*t)+ 3.7

ta = 0 ; tb = 15
muestrast = 7
muestrasj = 4*muestrast

# PROCEDIMIENTO
# trayectoria
tj = np.linspace(ta,tb,muestrasj)
gxj = gx(tj)
gyj = gy(tj)

# Interpolación
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()

# para evaluación numérica
px = sym.lambdify(x,polisimple)

# Puntos para la gráfica
muestras = 101
a = np.min(xi)
b = np.max(xi)
pxi = np.linspace(a,b,muestras)
pfi = px(pxi)

# 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)

# Gráfica
plt.plot(gxj,gyj,color='orange', label = 'trayectoria')
plt.plot(xi,fi,'o', label = 'muestras')
plt.plot(pxi,pfi,color='green',linestyle='dashed', label = 'P(x)')
plt.legend()
plt.xlabel('xi')
plt.ylabel('fi')
plt.grid()
plt.title('Interpolación Lagrange')
plt.show()